PHP no da error pero tampoco inserta en la db

Ahí está el código.

Lo miraste por todos los costados posibles.

Todos los puntos y comas están en su lugar.

No hay ningún paréntesis mal cerrado, ninguna llave fuera de lugar ni nada raro.

Corrés el programa y no sale ningún mensaje de error.

Es más, el mensaje que se ve es «Todo ok: datos guardados»

Y sin embargo cuando mirás en phpMyAdmin…

¿Qué podés hacer?

Es una opción, sí.

También podés descargar tu furia en Twitter contándole al mundo cuánto odiás PHP pero… eso tampoco va a ayudarte a resolver tu problema.

No te desesperes.

Existen algunas opciones mejores.

A veces sucede que encontrar la causa de un error requiere algo más que simplemente leer el código.

Tomemos un ejemplo como este:

<?php

$conn = mysqli_connect();

$sql = "INSERT INTO users (username, password) VALUES ('mauro', 1234);";

mysqli_query($conn, $sql);
?>
<h1>Todo ok: datos guardados</h1>

Si lo instalás en tu propia computadora vas a ver que funciona perfecto.

Excepto que no insertará nada.

¿Qué ocurre?

No, PHP no te está tomando el pelo.

Para empezar hay pongamos algo en claro: existen diferentes tipos de errores en un programa.

Existen algunos que son detectables por el intérprete (Los que impiden la ejecución del programa) y los que se conocen como errores de lógica, donde el programa hace algo, sólo que ese algo no es lo que esperabas que hiciera.

Y si eso sucede… me temo que la culpa es tuya (O en todo caso, de alguien de tu equipo, nunca de la computadora ni de PHP).

Y ahora bien, ¿cómo sigue esta historia?

Lo primero que debés comprender es que los errores de php no salen exclusivamente por la pantalla.

Eso depende de la configuración de tu servidor.

Para ver más claramente lo que pasa en el ejemplo que te daba podés hacer dos cosas:

Activar el display de errores

Si agregás esta línea:

ini_set('display_errors', 1);

Y volvés a cargar la página te vas a encontrar con algo similar a:

¡Ahá! ¡Había un mensaje de error después de todo!

Ahora el desafío pasa por interpretar el mensaje de error y corregirlo.

Y si todavía no ves ningún mensaje de error, entonces está confirmado: te estás enfrentando a un verdadero bugTM .

¿Qué te queda por hacer?

Yo arrancaría por hacerme una nueva taza de café y comenzar a debuggear.

Ahora, supongamos que, luego de evaluar todo el código, ver las variables y demás, sigues sin encontrar el problema.

Pues, veamos nuevamente:

  • El código está escrito correctamente
  • La conexión a la base de datos se realiza correctamente
  • La consulta se ejecuta

Pero los resultados no están ahí…

La pregunta es, ¿estás seguro de que la consulta se ejecutó correctamente?

Revisemos el código una vez más:

<?php

$conn = mysqli_connect();

$sql = "INSERT INTO users (username, password) VALUES ('mauro', 1234);";

mysqli_query($conn, $sql);
?>
<h1>Todo ok: datos guardados</h1>

La llamada a mysqli_query está ahí y, si ves el mensaje «Todo ok…» es porque esa línea se ejecutó.

Pero (Siempre existe un pero), hay algo que estás pasando por alto.

Si ves la definición de la función mysqli_query vas a notar que devuelve un resultado.

En particular, devuelve false cuando algo salió mal.

No parece mucho, pero es un comienzo.

Qué pasaría si cambias el código por:

<?php

$conn = mysqli_connect();

$sql = "INSERT INTO users (username, password) VALUES ('mauro', 1234);";

if (mysqli_query($conn, $sql)) {
?>
<h1>Todo ok: datos guardados</h1>
<?php
} else {
?>
<h1>No todo ok: datos NO guardados</h1>
<?php
}

Con este simple cambio lograrás que, al menos, el programa no te engañe: si no se insertó nada te dirá que algo ha fallado.

Lo que resta es saber exactamente por qué no se ha podido insertar la información que buscabas.

La respuesta te la dará otra función: mysqli_error.

A través de esta función podrás conocer cuál es el problema que el servidor MySQL está informando a tu script y que impide que se complete la operación que quieres realizar.

El código queda de esta forma:

<?php

$conn = mysqli_connect();

$sql = "INSERT INTO users (username, password) VALUES ('mauro', 1234);";

if (mysqli_query($conn, $sql)) {
?>
<h1>Todo ok: datos guardados</h1>
<?php
} else {
?>
<h1>No todo ok: datos NO guardados. Error: <?php echo mysqli_error($conn);?></h1>
<?php
}

Y ahora sí, tienes el panorama completo de lo que está impidiéndote completar la inserción.

Si lo miras un poco de lejos notarás que el problema es tomar un enfoque optimista.

Por supuesto que todos queremos que nuestros programas hagan lo que se supone deben hacer pero, siempre recuerda que algo puede salir mal a lo largo del camino y, si eso sucede, quieres tener tanta información a la mano como te sea posible.

Hacete la vida fácil: usá las funciones de manejo de errores siempre.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.