2011-03-16 23 views
25

Estoy luchando con algún código PHP/MySQL. Estoy leyendo de 1 tabla, cambiando algunos campos y luego escribiendo en otra tabla, no sucede nada si la inserción y uno de los valores de la matriz es nulo cuando me gustaría insertar nulo en la base de datos (se permiten valores nulos para el campo). Se ve un poco como esto:PHP/MySQL Insertar valores nulos

$results = mysql_query("select * from mytable"); 
while ($row = mysql_fetch_assoc($results) { 
    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', {$row['null_field']}); 
} 

No cada fila tiene un valor nulo y en mi consulta hay más campos y 2 columnas que puede o no puede ser nula

Respuesta

50

Este es un ejemplo en el uso de declaraciones preparadas realmente le ahorra algunos problemas.

En MySQL, con el fin de insertar un valor nulo, se debe especificar al INSERT tiempo o dejar el campo a cabo lo que requiere ramificación adicional:

INSERT INTO table2 (f1, f2) 
    VALUES ('String Value', NULL); 

Sin embargo, si desea insertar un valor en ese campo, ahora debe bifurcar su código para agregar las comillas simples:

INSERT INTO table2 (f1, f2) 
    VALUES ('String Value', 'String Value'); 

Las declaraciones preparadas lo hacen automáticamente por usted. Ellos saben la diferencia entre string(0) "" y null y escriba su consulta apropiada:

$stmt = $mysqli->prepare("INSERT INTO table2 (f1, f2) VALUES (?, ?)"); 
$stmt->bind_param('ss', $field1, $field2); 

$field1 = "String Value"; 
$field2 = null; 

$stmt->execute(); 

Se escapa de sus campos para usted, se asegura de que usted no se olvide de unirse a un parámetro. No hay razón para quedarse con la extensión mysql. Use mysqli y es prepared statements en su lugar. Te ahorrarás un mundo de dolor.

+3

Brillante, gracias, ahora soy un converso de mysqli – MattP

+5

@MattP: Tenga en cuenta que PDO tiene el mismo comportamiento. Compare la API de cada uno antes de establecerse en uno (PDO es más fácil uso y en gran parte DB agnóstico, mysqli proporciona un acceso más directo a la API de MySQL). – outis

+0

Otra aproximación - https://stackoverflow.com/a/20900661/4050261 –

5

Creo que se necesita comillas alrededor de su {$row['null_field']}, por lo '{$row['null_field']}'

Si usted no tiene las cotizaciones, de vez en cuando va a terminar con una instrucción de inserción que tiene este aspecto: insert into table2 (f1, f2) values ('val1',) que es un error de sintaxis.

Si ese es un campo numérico, tendrá que hacer algunas pruebas por encima de ella, y si no hay ningún valor en null_field, establezca explícitamente en null ..

+0

Gracias, voy a tener que añadir algunas pruebas adicionales y establecer explícitamente los nulos, es mucho más lógico en la aplicación que los campos son nulos en lugar de cadenas vacías. – MattP

+0

Desafortunadamente, citar el campo será incorrecto, si el valor que se va a insertar es NULL. No se puede hacer la declaración completa en una cadena; necesitará algo como 'mysql_query (" insert into table2 (f1, f2) values ​​('{$ row [' string_field ']}', ". (is_null ($ row ['null_field'])," NULL "," ' {$ row ['null_field']} ""). ")" 'Que se puede hacer más fácil de leer creando una función auxiliar' function quotedValueOrNull ($ value) {return (is_null ($ value), "NULL", " '{$ value}' ");}' – ToolmakerSteve

4

Para los campos donde NULL es aceptable, se puede usar var_export($var, true) para dar salida al string, integer, o NULL literal. Tenga en cuenta que no rodeará el resultado con comillas porque se agregarán u omitirán automáticamente.

Por ejemplo:

mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")"); 
Cuestiones relacionadas