2009-08-02 17 views
15

Tengo una función que genera una instrucción INSERT preparada sobre la base de una matriz asociativa de nombres y valores de las columnas para insertarse en esa columna y un nombre de tabla (una cadena simple):Declaración de preparación de Mysqli: volviendo falso, pero ¿por qué?

function insert ($param, $table) { 
     $sqlString = "INSERT INTO $table (".implode(', ',array_keys($param)).') VALUES ('.str_repeat('?, ', (count($param) - 1)).'?)'; 
     if ($statement = $this->conn->prepare($sqlString)): 
      $parameters = array_merge(array($this->bindParams($param), $param)); 
      call_user_func_array(array($statement, 'bind_param', $parameters)); 
      if (!$statement->execute()): 
       die('Error! '.$statement->error()); 
      endif; 
      $statement->close(); 
      return true; 
     else: 
      die("Could Not Run Statement"); 
     endif; 
    } 

Mi problema es que $ this-> conn-> prepare (es parte de una clase, conn es un NUEVO objeto mysqli, que funciona sin problemas) devuelve false, ¡pero no me da una razón por la cual!

Aquí está una muestra de $ sqlString que consigue construida para preparar la declaración:

INSERT INTO students (PhoneNumber, FirstName, MiddleInit, LastName, Email, Password, SignupType, Active, SignupDate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) 

Puede alguien ver un problema con esta declaración con parámetros? ¿Alguna razón por la cual la función de preparación devolvería falsa?

+2

Aparece un mensaje de error (vea http://php.net/manual/en/mysqli.error.php cuando prepare devuelve falso?); y si si, que ? –

+2

¿Ha intentado ejecutar la instrucción INSERT real en su base de datos, para ver si tiene el SQL correcto? – DOK

+1

Acabo de activar mysqli_report (MYSQLI_REPORT_ALL) para obtener una mejor comprensión de lo que estaba sucediendo; resulta que uno de mis nombres de campo era incorrecto; se podría pensar que prepare() arrojaría una excepción, pero falla silenciosamente. –

Respuesta

41

Estoy copiando la solución en esta respuesta para que se le pueda dar un voto positivo, de lo contrario la pregunta aparecerá en las "preguntas sin contestar" para siempre. Estoy marcando esta respuesta CW así que no obtendré ningún punto.

@ Andrew E. dice:

me acaba de encender mysqli_report(MYSQLI_REPORT_ALL) a obtener una mejor comprensión de lo que estaba ocurriendo - Resulta que uno de mis nombres de campo era incorrecto - te ' creo que prepare() arrojaría una excepción , pero falla silenciosamente.

+0

@ P5Coder, PHP y MySQL son las peores soluciones, a excepción de todas las otras soluciones que se han probado. :-) –

+0

@BillKarwin Nunca debe haber probado otros idiomas o bases de datos de alto nivel. PHP es posiblemente el lenguaje peor diseñado jamás y MySQL no es compatible con ACID utilizando su motor predeterminado. –

+1

@vee_ess, el motor predeterminado es InnoDB desde MySQL 5.5, lanzado en 2010. InnoDB es compatible con ACID al igual que la mayoría de las otras bases de datos. –

Cuestiones relacionadas