2012-06-04 11 views
5

A veces tengo matrices con valores vacíos o nulos. En MySql están configurados para que no admitan nulos, pero tienen valores predeterminados asignados. ¿Por qué entonces MySql me da un error, p. Column user_type can not be null. (No estoy corriendo en modo estricto).Cómo manejar nulos en esta instrucción de inserción de PHP/mysql

Me doy cuenta de que podría utilizar la palabra clave DEFAULT en lugar de algunos valores al preparar la consulta, pero realmente no quiero hacer eso. Me gustaría poder escribir textualmente mis declaraciones SQL, en lugar de ponerlas juntas con los bucles foreach, etc. Por ejemplo, me gustaría usar "INSERT INTO users (user_type, first_name, last_name, password) VALUES (:user_type, :first_name, :last_name, :password)";

Por lo que recuerdo, esto estaba funcionando bien (es decir, sustituyendo en los valores por defecto correctos) hasta que me cambie de usar? consultar a los marcadores de parámetros con nombre ...

Gracias ...

+0

No creo que esto se puede hacer de esta manera: un valor * se * que se envían cuando se une (! Porque parece en absoluto), aunque 'null'. Por lo tanto, MySQL no puede aplicar el valor predeterminado, porque se especificó un valor *. Hay factores desencadenantes, pero "ick!". Una "solución" sería tener un generador de consultas mínimo basado, por ejemplo, en un Mapa. (Todavía usando marcadores de posición, por supuesto.) –

+0

¿Estás hablando de php? Como mencionó sobre "Array", probablemente valga la pena mencionar Array en qué idioma –

+0

(no creo que * esté * trabajando con solo usar marcadores '?' Con la misma estructura de inserción; es posible que desee verificar eso y, si lo hace) trabajar, ver por qué magia.) –

Respuesta

1

me gustaría crear una función que acepta los valores como parámetros. Tendría los valores por defecto en una matriz asociativa. Si el valor de cualquiera de los parámetros es nulo, lo reemplazará con el valor predeterminado.

por ejemplo

function setUpQuery($user_type_in, $first_name_in, $last_name_in, $password_in){ 
     $default_values('user_type' => 'Admin', 'first_name' => 'John', 'last_name' => 'Doe', 'password' => 'XXX'); 
     $user_type = ($user_type_in == NULL)? $default_values['user_type']:$user_type_in; 
     ..... 
     return "INSERT INTO users (user_type, first_name, last_name, password) VALUES ('$user_type', '$first_name', '$last_name', '$password');" 
} 

buen punto. ¿Qué hay de lo siguiente:

INSERT INTO users(user_type, first_name, last_name,password) values 
(ifnull('$user_type',default(user_type)), ifnull('$first_name', default(first_name)), 
ifnull('$last_name',default(last_name)), ifnull('$password', default(password)); 
+0

Esto tiene gran desventaja de no usar los valores predeterminados de DB. –

+0

@hgolov, esperaba crear las sentencias de SQL (y sus contrapartes de PDO) de forma estática y no dinámicamente porque son miembros estáticos de una clase de correlacionador jerárquico. Hago un chequeo como "if! Isset ($ this -> _ PDOInsert) {...} El enfoque de la función default() no funcionará porque los tipos de parámetros de la consulta varían con cada uso, y solo se establecen una vez (cuando el el miembro estático está configurado). –

+0

Veo que marcó esto como resuelto. ¿Funcionó en su código de pdo? – hgolov

Cuestiones relacionadas