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.
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.)
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);
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
Ich hatte das gleiche Problem und fand diese Lösung mit bindParam:
bindParam(':param', $myvar = NULL, PDO::PARAM_INT);
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.
Wenn Sie NULL
nur einfügen möchten, wenn value
empty
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 $productName
SET
, 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,
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 NULL
s, 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 NULL
s 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).
Versuche dies.
$stmt->bindValue(':v1', null, PDO::PARAM_NULL); // --> insert null