Ich benutze diesen Code und bin nicht frustriert:
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 scheitern und werfen diesen Fehler:
Schwerwiegender Fehler : Parameter 2 kann nicht als Referenz in / opt / ... übergeben werden.
bindValue()
Over zu verwendenbindParam()
. für alles, nicht nur für denNULL
Wert. Ich kann mir keinen einzigen Fall vorstellen, in dem Sie den Parameter an eine Referenz einer PHP-Variablen binden müssten - aber genau dasbindParam()
tut es.Bei der Verwendung
bindParam()
müssen Sie eine Variable übergeben, keine Konstante. Vor dieser Zeile müssen Sie also eine Variable erstellen und auf setzennull
Sie würden die gleiche Fehlermeldung erhalten, wenn Sie versuchen würden:
quelle
Bei Verwendung von
INTEGER
Spalten (das kann seinNULL
) in MySQL hat PDO ein (für mich) unerwartetes Verhalten.Wenn Sie verwenden
$stmt->execute(Array)
, müssen Sie das Literal angebenNULL
und können nichtNULL
durch Variablenreferenz angeben . Das wird also nicht funktionieren:Aber das wird funktionieren:
Versuchte dies unter MySQL 5.5.15 mit PHP 5.4.1
quelle
isset()
korreliert besser zuNULL
. Eine leere Zeichenfolge ist ebenfalls ein Wert.Definieren Sie für diejenigen, die immer noch Probleme haben (Parameter 2 kann nicht als Referenz übergeben werden), eine Variable mit dem Wert null und nicht nur null an PDO:
Hoffe das hilft.
quelle
Ich hatte das gleiche Problem und fand diese Lösung mit bindParam:
quelle
Wenn Sie
NULL
nur einfügen möchten, wenn dasvalue
istempty
oder''
, aber das einfügen,value
wenn es verfügbar ist.A) Empfängt die Formulardaten mit der POST-Methode und ruft die Funktion insert mit diesen Werten auf.
B) Wertet aus, ob ein Feld vom Benutzer nicht ausgefüllt wurde, und fügt ein,
NULL
ob dies der Fall ist.Wenn der Benutzer beispielsweise nichts in das
productName
Feld des Formulars$productName
eingibt, ist diesSET
jedoch der FallEMPTY
. Sie müssen also überprüfen, ob dies der Fall istempty()
, und dann einfügenNULL
.Getestet auf PHP 5.5.17
Viel Glück,
quelle
IFNULL()
Funktion in der Abfragezeichenfolge verwenden. So:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Versuche dies.
quelle
Basierend auf den anderen Antworten, aber mit etwas mehr Klarheit darüber, wie diese Lösung tatsächlich verwendet wird.
Wenn Sie beispielsweise eine leere Zeichenfolge für einen Zeitwert haben, diese aber als Null speichern möchten:
Beachten Sie, dass Sie für Zeitwerte PARAM_STR verwenden würden, da die Zeiten als Zeichenfolgen gespeichert werden.
quelle
In meinem Fall verwende ich:
SQLite,
vorbereitete Anweisungen mit Platzhaltern zur Behandlung einer unbekannten Anzahl von Feldern,
Vom Benutzer gesendete AJAX-Anfrage, bei der alles eine Zeichenfolge ist und es keinen
NULL
Wert und gibtIch muss dringend
NULL
s einfügen, da dies nicht gegen Fremdschlüsseleinschränkungen verstößt (akzeptabler Wert).Angenommen, der Benutzer sendet jetzt mit post:
$_POST[field1]
mit einem Wert,value1
der die leere Zeichenfolge""
oder"null"
oder sein kann"NULL"
.Zuerst mache ich die Aussage:
wo
{$sColumns}
ist etw wiefield1, field2, ...
und{$sValues}
sind meine Platzhalter??, ?, ...
.Dann sammle ich meine
$_POST
Daten zu den Spaltennamen in einem Array$values
und ersetze sie durchNULL
s:Jetzt kann ich ausführen:
und unter anderem Fremdschlüsseleinschränkungen umgehen.
Wenn andererseits eine leere Zeichenfolge sinnvoller ist, müssen Sie prüfen, ob dieses Feld Teil eines Fremdschlüssels ist oder nicht (komplizierter).
quelle