2011-07-21 39 views
8

Bu:PDO referans bildirimi ile mi geçiyorsunuz?

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$stmt->bindParam(':color', $someClass->getColor()); 
$stmt->execute(); 

bu verir:

Çalışma bildirim
sadece değişkenler referans

hala yürütür olsa tarafından kabul edilmelidir.

Bu: şikayeti olmayan

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$tempColor = $someClass->getColor(); 
$stmt->bindParam(':color',$tempColor); 
$stmt->execute(); 

çalışır.

Farkı anlamıyorum?

cevap

6

bindParam'ın ikinci parametresi reference değişkenidir. Bir işlev dönüşü referans alınamadığından, bindParam parametresinin gereksinimlerini tam olarak karşılayamaz (PHP yine de sizinle birlikte çalışır ve burada yalnızca uyarı verir). İkinci örnekte aynı sonucu üretecektir bu kod:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$tempColor = NULL; // assigned here 
$stmt->bindParam(':color',$tempColor); 
$tempColor = $someClass->getColor(); // but reassigned here 
$stmt->execute(); 

bir işlev geri dönüşü mümkün olmayacak O

burada ve örnek daha iyi bir fikir edinmek için.

9

PDOStatement::bindParam() açıklaması, bir PHP değişkeni'u bir quesitonmark veya adlandırılmış yer tutucusuna bağladığını belirtir. Bir sınıfın yöntemini geçmeye çalıştığınız için (bu yöntem bir değer döndürse bile) hala değişken bir ad değil, dolayısıyla uyarıdır. Kodunuzu ileride kanıtlamak için PDOStatement::bindValue()'a bakmak isteyebilirsiniz.

2

bir değişkene değer atamak kaçınmak istiyorsanız, çalışırken daha iyi olabilir: Diğerleri de söylediğim gibi PDO::statement->bindParam param 2 değişken tarafından geçirilmesini bekliyor çünkü

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = ?"); 
$stmt->execute(array($someClass->getColor())); 

, hata neden olur referans.

-1

gerçekten yerine bir referans değeri bağlamak isterseniz, böyle PDOStatement::bindValue ve sonra kod olmazdı şey kullanabilirsiniz:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$stmt->bindValue('color', $someObject->getColor()); 
$stmt->execute(); 
İlgili konular