Frage

Ich verwende diesen Code und ich bin über Frustration:

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, '', alle von ihnen scheitern und diesen Fehler werfen:

  

Fatal error : Kann nicht Parameter 2 über einen Verweis in / opt /...

War es hilfreich?

Lösung

Ich bin nur PDO lernen, aber ich glaube, Sie brauchen bindValue zu verwenden, nicht bindParam

bindParam nimmt eine Variable, auf Referenz, und nicht zieht in einem Wert zu dem Zeitpunkt bindParam des Aufrufs. Ich fand dies in einem Kommentar zu dem php docs:

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

EDIT: P. S. Sie können diese bindValue(':param', null, PDO::PARAM_NULL); zu tun versucht sein, aber es hat nicht für jede Arbeit (danke Will Shaver für die Meldung.)

Andere Tipps

Wenn bindParam() verwenden Sie in einer Variablen passieren muss, keine Konstante. Also, bevor dieser Linie müssen Sie eine Variable erstellen und setzen Sie ihn auf null

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

Sie würden die gleiche Fehlermeldung erhalten, wenn Sie versucht:

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

Wenn INTEGER Spalten mit (das NULL sein kann) in MySQL, PDO hat einige (für mich) ein unerwartetes Verhalten.

Wenn Sie $stmt->execute(Array) verwenden, müssen Sie die wörtliche NULL angeben und kann nicht NULL durch variable Referenz geben. Also das wird nicht funktionieren:

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

Aber das funktioniert:

// $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

versucht, diese auf MySQL 5.5.15 mit PHP 5.4.1

Für diejenigen, die immer noch Probleme haben (nicht Parameter 2 durch Verweis übergeben kann), eine Variable mit Null-Wert definieren, nicht nur null PDO übergeben:

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

Hope, das hilft.

Ich hatte das gleiche Problem und ich fand diese Lösung mit bindParam arbeiten:

    bindParam(':param', $myvar = NULL, PDO::PARAM_INT);

Wenn Sie nur einfügen NULL wenn der value ist empty oder '', aber die value einfügen, wenn es verfügbar ist.

A) die Formulardaten unter Verwendung der POST-Verfahrens und ruft den Funktionseinsatz mit diesen Werten.

insert( $_POST['productId'], // Will be set to NULL if empty    
        $_POST['productName'] ); // Will be to NULL if empty                                

B) Testet, ob ein Feld nicht vom Benutzer ausgefüllt, und Einsätze NULL wenn das der Fall ist.

public function insert( $productId, $productName )
{ 
    $sql = "INSERT INTO products (  productId, productName ) 
                VALUES ( :productId, :productName )";

    //IMPORTANT: Repace $db with your PDO instance
    $query = $db->prepare($sql); 

    //Works with INT, FLOAT, ETC.
    $query->bindValue(':productId',  !empty($productId)   ? $productId   : NULL, PDO::PARAM_INT); 

    //Works with strings.
    $query->bindValue(':productName',!empty($productName) ? $productName : NULL, PDO::PARAM_STR);   

    $query->execute();      
}

Zum Beispiel, wenn der Benutzer nicht alles auf dem productName Bereich der Form, dann wird $productName seine SET aber EMPTY. So müssen Sie prüfen, ob es empty() ist, und wenn ja, dann Einsatz NULL.

Getestet auf PHP 5.5.17

Viel Glück,

Try This.

$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null

In meinem Fall verwende ich:

  • SQLite,

  • Prepared Statements mit Platzhalter unbekannte Anzahl von Feldern zu handhaben,

  • AJAX-Request gesendet durch den Benutzer, wobei alles ist eine Zeichenfolge, und es gibt nicht so etwas wie NULL Wert und

  • Ich brauche dringend NULLs einfügen als das nicht verletzt Fremdschlüssel Constraints (akzeptabler Wert).

Nehmen wir jetzt an Benutzer sendet mit Post. $_POST[field1] mit Wert value1, die die leere Zeichenkette "" oder "null" oder "NULL" sein

Zuerst mache ich die Aussage:

$stmt = $this->dbh->prepare("INSERT INTO $table ({$sColumns}) VALUES ({$sValues})");

wo {$sColumns} ist etw wie field1, field2, ... und {$sValues} sind meine Platzhalter ?, ?, ....

Dann sammle ich meine $_POST Daten im Zusammenhang mit den Spaltennamen in einem Array $values und ersetzen mit NULLs:

  for($i = 0; $i < \count($values); $i++)
     if((\strtolower($values[$i]) == 'null') || ($values[$i] == ''))
        $values[$i] = null;

Jetzt kann ich ausführen:

$stmt->execute($values);

und unter anderem Bypass Fremdschlüssel Constraints.

Wenn auf der anderen Seite, ein leerer String tut macht mehr Sinn, dann müssen Sie prüfen, ob das Feld Teil eines Fremdschlüssels ist oder nicht (mehr kompliziert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top