Nasıl PDO kullanarak null değerleri ekleyebilirim?

4 Cevap php

Ben bu kodu kullanıyorum ve ben hayal kırıklığı ötesinde kulüpler:

    try {
         $dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
         $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
         }
         catch(PDOException $e)
         {
         ...
         }
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');

$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem

PDO::PARAM_NULL, null, '', hepsi bu hatayı başarısız ve atmak: Fatal error: Cannot pass parameter 2 by reference in /opt/... "

Teşekkürler.

4 Cevap

Değil, ben sadece PDO öğrenme yaşıyorum, ama bindValue kullanmanız gerekir düşünüyorum bindParam

bindParam referans için, bir değişken alan ve bindParam çağrı zaman bir değere çekmek değildir. Ben php dokümanlar üzerinde bir açıklama buldum:

bindValue(':param', null, PDO::PARAM_INT);

EDIT: P.S. Bu bindValue(':param', null, PDO::PARAM_NULL); yapmak için cazip olabilir, ancak bu herkes için işe yaramadı (Bildirdiği edecek Tıraş teşekkür ederim.)

Kullanırken bindParam() Eğer bir değişken değil, sabit bir geçmelidir. Böylece bu çizginin önce bir değişken oluşturmak ve null bunu ayarlamanız gerekir

$myNull = null;
$stmt->bindParam(':v1', $myNull, PDO::PARAM_NULL);

Eğer çalıştı aynı hata mesajı almak istiyorum:

$stmt->bindParam(':v1', 5, PDO::PARAM_NULL);

MySQL (yani NULL olabilir) INTEGER sütunlar kullanırken, PDO (benim için) beklenmeyen bir davranış bazı vardır.

If you use $stmt->execute(Array), you have to specify the literal NULL and cannot give NULL by variable reference. So this won't work:

// $val is sometimes null, but sometimes an integer
$stmt->execute(array(
    ':param' => $val
));
// will cause the error 'incorrect integer value' when $val == null

Ancak bu iş olacak:

// $val again is sometimes null, but sometimes an integer
$stmt->execute(array(
    ':param' => isset($val) ? $val : null
));
// no errors, inserts NULL when $val == null, inserts the integer otherwise

PHP 5.4.1 ile MySQL 5.5.15 üzerinde çalıştı

Hala (referans ile parametre 2 geçmek olamaz) sorunları olanlar için, sadece PDO boş geçmek değil, boş değere sahip bir değişken tanımlamak:

bindValue(':param', $n = null, PDO::PARAM_INT);

Umarım bu yardımcı olur.