it-swarm.com.de

Wie füge ich mit PDO NULL-Werte ein?

Ich verwende diesen Code und bin frustrierend:

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 schlagen fehl und werfen diesen Fehler aus:

Schwerwiegender Fehler : Parameter 2 kann nicht als Referenz in/opt/... übergeben werden.

97
Nacho

Ich lerne gerade PDO, aber ich denke, Sie müssen bindValue verwenden, nicht bindParam

bindParam nimmt eine Variable zum Referenzieren und zieht zum Zeitpunkt des Aufrufs von bindParam keinen Wert ein. Ich fand das in einem Kommentar zu den PHP-Dokumenten:

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

EDIT: P.S. Sie sind möglicherweise versucht, dies zu tun bindValue(':param', null, PDO::PARAM_NULL);, aber es hat nicht für jeden funktioniert (danke, Will Shaver, dass Sie mich gemeldet haben.)

127
JasonWoof

Wenn Sie bindParam() verwenden, müssen Sie eine Variable übergeben, keine Konstante. Vor dieser Zeile müssen Sie also eine Variable erstellen und auf null setzen.

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

Sie würden dieselbe Fehlermeldung erhalten, wenn Sie Folgendes versucht hätten:

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

Wenn Sie INTEGER-Spalten (die NULL sein können) in MySQL verwenden, hat PDO (für mich) unerwartetes Verhalten.

Wenn Sie $stmt->execute(Array) verwenden, müssen Sie das Literal NULL angeben und können NULL nicht durch die Variablenreferenz ..__ angeben. Das funktioniert also nicht:

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

Das wird aber funktionieren:

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

Versuchte dies mit MySQL 5.5.15 mit PHP 5.4.1

26
ChrisF

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

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

Für diejenigen, die immer noch Probleme haben (Parameter 2 kann nicht als Referenz übergeben werden), definieren Sie eine Variable mit Nullwert und übergeben Sie nicht einfach Null an PDO:

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

Hoffe das hilft.

5
Pedro Guglielmo

Wenn Sie NULL nur einfügen möchten, wenn valueempty oder '' ist, fügen Sie die value ein, wenn sie verfügbar ist.

A) Empfängt die Formulardaten mithilfe der Methode POST und ruft die Funktion insert mit diesen Werten auf.

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

B) Wertet aus, ob ein Feld vom Benutzer nicht ausgefüllt wurde, und fügt NULL ein, wenn dies 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();      
}

Wenn der Benutzer beispielsweise nichts in das Feld productName des Formulars eingibt, ist $productNameSET, aber EMPTY. Sie müssen also prüfen, ob es sich um empty() handelt. Wenn dies der Fall ist, fügen Sie NULL ein.

Getestet auf PHP 5.5.17

Viel Glück,

3
Arian Acosta

In meinem Fall verwende ich:

  • SQLite,

  • vorbereitete Anweisungen mit Platzhaltern zur Behandlung einer unbekannten Anzahl von Feldern,

  • AJAX-Anfrage, die vom Benutzer gesendet wurde, wobei alles eine Zeichenfolge ist und es keine NULL-Werte und gibt

  • Ich brauche dringend NULLs, da dies nicht gegen Fremdschlüsseleinschränkungen (akzeptabler Wert) verstößt.

Angenommen, der Benutzer sendet jetzt mit post: $_POST[field1] mit dem Wert value1, der die leere Zeichenfolge "" oder "null" oder "NULL" sein kann.

Zuerst mache ich die Aussage:

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

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

Dann sammle ich meine $_POST-Daten, die sich auf die Spaltennamen beziehen, in einem Array $values und , das durch NULLs ersetzt wird:

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

Nun kann ich ausführen:

$stmt->execute($values);

und unter anderen Bypass-Fremdschlüsseleinschränkungen.

Wenn dagegen ein leerer String sinnvoller ist, müssen Sie prüfen, ob dieses Feld Teil eines Fremdschlüssels ist oder nicht (komplizierter).

0
centurian

Versuche dies.

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