Resolviendo problemas con mysql_fetch_array
En ocasiones se presenta un error similar a este al programar: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home2/usuario/public_html/miprograma.php on line 38 . Generalmente la gente pregunta si debe configurar algo en el servidor para que todo comience a funcionar. La respuesta es no. Hay un error en la programacion. Pero no te preocupes, aqui te damos ideas para resolverlo.
Para saber más...
Tutorial de PHP.net sobre mysql_fetch_array
http://www.php.net/manual/es/function.mysql-fetch-array.php
Tutorial de PHP.net sobre mysql_query
http://www.php.net/manual/es/function.mysql-query.php
Tutorial sobre consultas SQL de Mysql Hispano:
http://www.mysql-hispano.org/page.php?id=31&pag=14
Como sabes, mysql_fetch_array es una funcion propia de php que se usa para mostrar valores extraidos de bases de datos en forma organizada. En forma de matriz para ser mas precisos.
Cuando se trabaja con esta funcion, generalmente se hace de esta manera:
$consulta=mysql_query("select CampoaMostrar from Tabla where Campo='$valor' order by Campo1",$datosdeconexion);
while($resultadosordenados=mysql_fetch_array($consulta)){
echo $resultadosordenados['CampoaMostrar'];
}
O sea, primero hacemos una consulta a la base de datos, usando la instruccion mysql_query y una instruccion en SQL ( en este caso select CampoaMostrar from Tabla where Campo='$valor' order by Campo1 ).
Luego pasamos todo a un while donde el mysql_fetch_array se encarga de ordenar los resultados, mientras haya resultados que ordenar.
El uso del while es opcional, dependiendo de si solo queremos llamar un registro o llamar varios registros.
Bien, pero, volviendo a la pregunta ¿Donde esta el problema que hace que aparezca esto: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home2/usuario/public_html/miprograma.php on line 38
Muy sencillamente, dentro de los parentesis despues de mysql_query. El mysql_fetch_array solo alerta del error pero el mismo esta en la linea anterior. Puede suceder que:
a) La consulta SQL este mal hecha. Que hayamos escrito algun campo que no pertenece a esa tabla; que hayamos escrito mal la sintaxis de la sentencia; que nos hallamos olvidado de algun caracter, algun punto, alguna coma o que hayamos colocado algunos caracteres como " ' = de mas. Tambien es posible que el orden de las cosas en la consulta este mal. Por ejemplo, poner el order by antes del where ( existen muchas otras instrucciones en SQL como union, group by, outer join, group by y muchas otras que tienen un orden especifico de aparicion en la sentencia SQL - cuando corresponde usarlas - y que usadas en el lugar equivocado pueden causar este problema.) Te recomendamos leer los manuales sobre SQL que figuran en los enlaces, si estas usando alguna sentencia distinta a where y order by.
b) Que no figure la variable de conexion. Si nos fijamos en la consulta:
$consulta=mysql_query("select CampoaMostrar from Tabla where Campo='$valor' order by Campo1",$datosdeconexion);
Veremos que aparece la variable $datosdeconexion. Esta variable se usa si uno se conecta de esta forma a la base de datos:
function Conexion(){
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('No nos pudimos conectar' . mysql_error());
}
echo 'Conectado exitosamente';
return $link;
}
$datosdeconexion= Conexion();
Otras formas de conexion pueden hacer que la consulta funcione sin la variable de conexion.
c) Que la consulta este dentro de una funcion. En este caso, la variable de conexion deberia pasarse como uno de los argumentos de la funcion que contiene la consulta.
Por ejemplo, supongamos que tenemos este codigo:
function MiFuncion($variablequeusoenlafuncion){
$consulta=mysql_query("select CampoaMostrar from Tabla where Campo='$variablequeusoenlafuncion' order by Campo1",$datosdeconexion);
while($resultadosordenados=mysql_fetch_array($consulta)){
echo $resultadosordenados['CampoaMostrar'];
}
}
Como ves, le estamos pasando una sola variable a la funcion. Lo correcto seria reescribir esta linea:
function MiFuncion($variablequeusoenlafuncion){
Asi:
function MiFuncion($variablequeusoenlafuncion,$datosdeconexion){
Para pasarle tambien la variable de conexion y que no haya problemas.
d) Comentar una linea clave por error. Muchas veces sucede que sin querer, borrando caracteres dos lineas que debian ir una abajo de la otra, terminan pegadas. Y si la linea superior es un comentario, partes clave de la consulta pueden verse truncadas.
Veamos un ejemplo, supongamos que alguien desea realizar esta consulta:
//aqui comento que en la proxima linea haré mi conexionmysql_connect("localhost","usuario","clave");$results=mysql_query("select
* from mensajes";$conexion);while ($row=mysql_fetch_array($results))
Como podemos ver, hemos abierto el comentario pero no dejado los saltos de linea correspondientes y eso ocasiona el error. Si estamos usando Dreamweaver por ejemplo, el color naranja seria una pista del error. Si el error no estuviera los colores deberian verse de esta forma:
//aqui comento que en la proxima linea haré mi conexion
mysql_connect("localhost","usuario","clave");
$results=mysql_query("select * from tabla",$conexion);
while ($row=mysql_fetch_array($results)){
Para evitar este error conviene usar programas de diseño como Dreamweaver, que marcan con colores el codigo, y familiarizarse con los colores. Esto ayudará a descubrir estos errores rapidamente. Otra opcion es realizar los comentarios empezandolos con los signos /* y terminandolos con los signos */ . Esto abre y cierra el comentario, a diferencia de comentarlo con // donde el comentario queda abierto y listo para errores de retorno de linea.
e) Inventar una nueva forma de escribir las funciones propias de PHP. Este error sucede cuando no se respeta la forma en que en el sitio PHP.net indican que deben usarse ciertas funciones como mysql_query y mysql_fetch_array entre otras.
Tomemos por caso este ejemplo:
$results=mysql_query("base","select * from tabla");
El error esta dentro de la sentencia mysql_query. Tal como indica php.net, la forma en que debe escribirse la sentencia mysql_query es: mysql_query( consulta, identificador de enlace).
O sea, dentro de la funcion va una consulta SQL como esta "select * from tabla" y un identificador de enlace, que puede ser una variable de conexion, como $conexion.
Sin embargo, si leemos con atencion, veremos que en el codigo han escrito la base de datos primero y luego la sentencia SQL, lo que obviamente ocasiona este error.
Una forma de evitarlo,es, cuando hay dudas sobre si una funcion esta bien o mal escrita, ir a php.net y buscarla. Esto nos dara informacion que nos permitirá cotejar si esta escrita correctamente.
f) No usar prefijo antes del nombre de la base de datos y del usuario en la conexion pasada a PHP. En algunos servidores como el nuestro, toda base de datos creada y todo usuario de base de datos creado lleva adelante de el como prefijo el usuario para Cpanel o FTP del sitio y un guion bajo, luciendo de este modo:
Nombre de base de datos: usuariocpanel_base
Nombre de usuario: usuariocpanel_usuario
Si cuando usamos una instruccion mysql_connect para conectarnos a la base de datos indicamos sin el prefijo alguno de ambos datos, esto puede originar un error de conexion que impida al mysql_query hacer la consulta. Aunque, lo mas probable es que la ejecucion del programa se detenga antes, mostrando la leyenda: unable access to database ( imposible acceder a la base de datos).
g) Pensar que un programa en PHP es eterno. Este es un error muy comun en programadores principalmente cuando aprenden de cursos o de libro, pensar que las instrucciones que usan en sus programas son compatibles con todas las veriones de PHP, pasadas o futuras y que algo programado hoy servira para la version 5, 6, 7, 10, etc.
Este fue el caso de la programacion con register_globals en on, que, cuando la norma paso a ser off, muchos programadores comenzaron a quejarse de que sus programas no andaban. Sin contar los reclamos de algunos "prestigiosos y seguros lideres de programadores" aduciendo que no activar register_globals les costaba un 20% a 30% en gastos para revisiones de seguridad de los sitios de sus clientes que ellos se jactaban de programar en forma segura.
Y este tambien será el caso de algunas funciones como mysql_db_query cuyo uso PHP.net recomienda depreciar, usando en cambio funciones como mysql_query y mysql_select_db
Bien, hasta aqui te hemos presentado algunas de las posibles causas del problema. Esperamos que te sirvan en tu investigacion y desde luego tus comentarios.
Enlaces relacionados
Tags relacionados
feed,

Aikido
Brazilian
Defensa Personal
Tai chi chuan
Valetodo
Ipod Iphone
Telefonos
Administracion
Empleo
Emprendedores
Gurues
Mercadeo
Motivacion
Temas Legales
Sony Vegas
Playstation
Trucos
PHP
Dreamweaver
Excel
Flash
Photoshop
PowerPoint
varios
Dietas
Enfermedades
Area de Usuarios
Bases de Datos
Buscadores
Compras
Correo Electronico
Evitando el Spam
Panel CPanel
Panel Plesk
Revendedores
Sobre mi dominio
Solucion de problemas
Subiendo mi sitio
Utilidades
Videos Rhosting
Terminos del Servicio - Politica de Privacidad - Ayuda a tus amigos, recomiendanos!
Todos los articulos de la seccion de Ayuda son Copyleft. Podes reproducirlos citando la fuente.
Producto Rhosting.com.ar- 1999 al 2008 - Resistencia - Chaco Las Malvinas son Argentinas