Estoy usando este código y estoy más allá de la frustración:
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, '',
todos fallan y arrojan este error:
Error fatal : no se puede pasar el parámetro 2 por referencia en / opt / ...
bindValue()
overbindParam()
; por todo, no solo por elNULL
valor. No puedo pensar en un solo caso en el que necesite vincular el parámetro a una referencia de una variable de PHP, pero eso es lo quebindParam()
hace.Al usarlo
bindParam()
, debe pasar una variable, no una constante. Entonces, antes de esa línea, debe crear una variable y establecerla ennull
Obtendría el mismo mensaje de error si intentara:
fuente
Cuando se usan
INTEGER
columnas (que pueden serNULL
) en MySQL, PDO tiene un comportamiento inesperado (para mí).Si usa
$stmt->execute(Array)
, debe especificar el literalNULL
y no puede darNULL
por referencia de variable. Entonces esto no funcionará:Pero esto funcionará:
Probé esto en MySQL 5.5.15 con PHP 5.4.1
fuente
isset()
correlaciona mejor conNULL
. Una cadena vacía también es un valor.Para aquellos que todavía tienen problemas (No se puede pasar el parámetro 2 por referencia), defina una variable con valor nulo, no solo pase nulo a PDO:
Espero que esto ayude.
fuente
Tuve el mismo problema y encontré esta solución trabajando con bindParam:
fuente
Si desea insertar
NULL
solo cuandovalue
esempty
o''
, pero insertevalue
cuando esté disponible.A) Recibe los datos del formulario usando el método POST y llama a la función insert con esos valores.
B) Evalúa si el usuario no llenó un campo e inserta
NULL
si ese es el caso.Por ejemplo, si el usuario no ingresa nada en el
productName
campo del formulario,$productName
seráSET
peroEMPTY
. Por lo tanto, debe verificar si lo esempty()
, y si lo es, insertarNULL
.Probado en PHP 5.5.17
Buena suerte,
fuente
IFNULL()
función de MySQL en la cadena de consulta. Así:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Prueba esto.
fuente
Basado en las otras respuestas pero con un poco más de claridad sobre cómo usar esta solución.
Si, por ejemplo, tiene una cadena vacía para un valor de tiempo pero desea guardarlo como nulo:
Tenga en cuenta que para los valores de tiempo usaría PARAM_STR, ya que los tiempos se almacenan como cadenas.
fuente
En mi caso estoy usando:
SQLite,
declaraciones preparadas con marcadores de posición para manejar un número desconocido de campos,
Solicitud AJAX enviada por el usuario donde todo es una cadena y no existe tal cosa como
NULL
valor yNecesito desesperadamente insertar
NULL
s, ya que eso no viola las restricciones de clave externa (valor aceptable).Supongamos que ahora el usuario envía con publicación:
$_POST[field1]
con un valorvalue1
que puede ser la cadena vacía""
o"null"
o"NULL"
.Primero hago la declaración:
¿Dónde
{$sColumns}
está algo comofield1, field2, ...
y{$sValues}
son mis marcadores de posición??, ?, ...
.Luego, recopilo mis
$_POST
datos relacionados con los nombres de las columnas en una matriz$values
y los reemplazo conNULL
s:Ahora, puedo ejecutar:
y entre otras restricciones de clave externa de bypass.
Si, por otro lado, una cadena vacía tiene más sentido, entonces debe verificar si ese campo es parte de una clave externa o no (más complicado).
fuente