Introducción: ese error que dan ganas de cerrar el navegador
Si alguna vez has escrito una consulta a MySQL en PHP y de repente viste en el navegador algo como:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/site/index.php on line 15...entonces conoces esa sensación. Todo parece correcto: te conectaste, escribiste la consulta, y PHP te grita en rojo. Es especialmente frustrante cuando el código funciona en el servidor local, pero no en el hosting. O viceversa.
Este error es uno de los más populares en Stack Overflow. Miles de desarrolladores (y nosotros entre ellos) nos hemos golpeado la cabeza contra el teclado tratando de entender: «¿Por qué el parámetro 1 espera un resource, pero recibe un boolean?»
En este artículo no solo analizaremos la causa, sino que recorreremos el camino completo: desde reproducir el error hasta corregirlo. Y de paso, veremos por qué las funciones antiguas mysql_* deberían reemplazarse por PDO o MySQLi. ¡Allá vamos!
¿Cómo se ve el problema en la práctica?
Vamos a simular la situación. Tienes una tabla users y quieres mostrar todos los usuarios. El código está escrito a la antigua:
$link = mysql_connect('localhost', 'user', 'password');mysql_select_db('test');
$result = mysql_query("SELECT * FROM users");
while ($row = mysql_fetch_array($result)) { echo $row['name'] . '<br>';}Parece un clásico. Pero si la tabla users no existe, o hay un error de sintaxis en SQL, entonces mysql_query() devolverá no un resource, sino false. Y entonces mysql_fetch_array() recibe un boolean en lugar de un resource — de ahí el error.
La mayoría de las veces, el problema radica precisamente en una ejecución fallida de la consulta. Pero analicemos todas las posibles causas en orden.
Causa n.º 1: La consulta SQL devolvió false
Esta es la situación más común. mysql_query() devuelve false si la consulta falla. Por ejemplo:
- La tabla no existe
- Nombre de campo incorrecto
- Error de sintaxis en SQL
- Problemas con los permisos de acceso
¿Cómo verificarlo? Simplemente agrega una comprobación después de la consulta:
$result = mysql_query("SELECT * FROM non_existent_table");
if (!$result) { die('Error en la consulta: ' . mysql_error());}
while ($row = mysql_fetch_array($result)) { // ...}Esto mostrará de inmediato cuál es el problema. mysql_error() devolverá el texto del error, por ejemplo: "Table 'test.non_existent_table' doesn't exist".
Causa n.º 2: Pérdida de conexión con la BD
A veces la conexión se interrumpe (por ejemplo, debido a un tiempo de espera o un reinicio de MySQL). Entonces mysql_query() también devolverá false. La solución es verificar siempre la conexión:
$link = mysql_connect('localhost', 'user', 'password');if (!$link) { die('No se pudo conectar: ' . mysql_error());}Pero incluso esto no es una solución mágica. Es mejor usar funciones que puedan reconectarse automáticamente, como MySQLi.
Causa n.º 3: Confundes las funciones mysql_* y mysqli_*
Otro caso frecuente. Puedes mezclar accidentalmente dos bibliotecas diferentes. Por ejemplo, conectarte mediante mysqli_connect(), pero hacer la consulta con mysql_query(). Esto no funcionará: mysql_query() espera un resource de mysql_connect(), no de mysqli_connect().
Aquí tienes un ejemplo de confusión:
// Conexión mediante MySQLi$link = mysqli_connect('localhost', 'user', 'password', 'test');
// Pero la consulta con la antigua mysql_*$result = mysql_query("SELECT * FROM users"); // ¡Error!
while ($row = mysql_fetch_array($result)) { echo $row['name'];}La solución es usar una sola biblioteca. O