2

Me sale el siguiente error:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\Program Files (x86)\VertrigoServ\www\sdp\buscar.php on line 25

    <?php  
function nombreofcyciu($codofc,$entidad)/*BUSCAR NOMBRE OFICINA y ciudad*/
  { include ("conectar.php");
    $sql=mysqli_query($link,"SELECT * FROM $entidad WHERE item='$codofc'");
    $filasql=mysqli_fetch_array($sql); /* Linea de error*/
    $nombreofc[0]=$filasql['oficina'];
    $nombreofc[1]=$filasql['ciudad'];
    return($nombreofc);
  } 
?>  

  1. la Conexion a la BD funciona bien, aunque dejo el codigo de la conexion.

    no hubo conexion'. mysqli_error()); } $db = mysqli_select_db ($link,"generador2") or die (mysqli_error($link)); ?>
  2. En la base de Datos existe la tabla y la columna llamada en la consulta, pues al imprimir los valores de la consulta por consola me los muestra correctamente.

    function nombreofcyciu($codofc,$entidad)/BUSCAR NOMBRE OFICINA y ciudad/ { include ("conectar.php"); $sql=mysqli_query($link,"SELECT * FROM $entidad WHERE item='$codofc'"); echo "console.log('SELECT * FROM $entidad WHERE item=$codofc');"; $filasql=mysqli_fetch_array($sql); }

  3. Tienes razon, es vulnerable a un ataque de Inyeccion, pero por el momento estoy trabajando sobre un localhost.

PDTA. Aun no encuentro la solucion y ya descarte las posibles causas mencionadas anteriormente. ¿Hay algo que estoy pasando por alto?

Jorgesys
  • 103,630
  • 13
  • 52
  • 124
Edgar Yezid Cruz
  • 123
  • 1
  • 4
  • 13
  • El error viene dado porque la llamada a `mysqli_query` está arrojando `FALSE`. O sea, la consulta no se está ejecutando, debido posiblemente a: 1. En el archivo que incluyes... `include ("conectar.php")` la variable de conexión no se llame `$link` o que no está conectando; 2. Que la tabla `$entidad` que recibe la función no exista en la BD; 3. Que dicha tabla no tenga una columna llamada `item`. – A. Cedano Feb 12 '18 at 16:34
  • Edgar no era necesario escribir una respuesta para responder a mi respuesta. Prueba el código como te he indicado y podrás ver en pantalla el error. No asumas que está todo bien. No estoy tan seguro de que tú código esté generando una consulta válida. Lo que determina eso no es un `console.log` sino el usos de `mysqli_error`. He tratado de ayudarte escribiendo un código controlado, ¿por qué no lo pruebas y comentas el resultado? – A. Cedano Feb 12 '18 at 18:40
  • A. Cedano. Lo siento, soy nuevo y aun no se muy bien utilizar el foro. Analizando detalladamente la base de Datos me di cuenta que efectivamente una tabla no existia y por lo tanto la consulta no era valida. Al agregar la tabla el error se soluciono. Muchas Gracias por la ayuda prestada y por la paciencia brindada – Edgar Yezid Cruz Feb 12 '18 at 19:03
  • Edgar no pasa nada, ya con el tiempo se van aprendiendo los manejos del sitio. Me alegro de que la respuesta te haya ayudado a resolver el problema. Por favor, cuando sea posible lee: ❯ **[¿Qué debo hacer cuando alguien contesta mi pregunta?](https://es.stackoverflow.com/help/someone-answers)** en el Centro de Ayuda. Saludos. – A. Cedano Feb 12 '18 at 20:21
  • Por favor, lee [ask] y haz búsquedas en el sitio. Esta pregunta ya se ha formulado varias veces y tiene respuesta. No con tu mismo código, pero el fallo de raíz es el mismo y la solución te servirá igual. Ejemplos de esta misma pregunta: [1](https://es.stackoverflow.com/q/127490/250), [2](https://es.stackoverflow.com/q/30668/250), [3](https://es.stackoverflow.com/q/136281/250), [4](https://es.stackoverflow.com/q/28176/250)... hasta [11 veces](https://es.stackoverflow.com/search?q=Warning%3A+mysqli_fetch_array%28%29+expects+parameter+1+to+be+mysqli_result%2C+boolean+given) se ha preguntado esto – Alvaro Montoro Feb 12 '18 at 20:42

1 Answers1

5

En una llamada a mysqli_query en la que se usa una consulta del tipo SELECT, como en tu caso, dos resultados son posibles:

  1. un objeto con el conjunto de resultados el cual se podrá leer
  2. un booleano con valor FALSE si hay algún error

El mensaje:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in...

Indica

  • que tu mysqli_fetch_array() espera un parámetro válido para devolver los resultados
  • pero que en vez de ese parámetro válido tú le estás pasando un booleano.

Y... ¿por qué tengo ahí un booleano y no un objeto válido?

Porque la llamada a mysqli_query falló, y cuando esto ocurre en vez de un objeto válido con los datos pedidos lo que devuelve es un valor booleano igual a FALSE.

¿Como que la consulta falló...?

Sí sí, falló. De hecho, es muy fácil que una consulta falle, por muchísimas causas, por ejemplo:

  1. Que la conexión no se llama $link
  2. Que la conexión no es válida, porque le pasaste mal alguna credencial, porque no tienes permisos, porque el servidor de base de datos está caído ....
  3. Que en la base de datos no exista una tabla que se llame como la variable $entidad
  4. Que la tabla no tiene una columna llamada item
  5. Que te están inyectando código malicioso con algún error de sintaxis (esto no es descabellado... luego te diré por qué).1

¿Cómo mejorar el código?

Evalúa las variables, controlando posibles errores:

<?php  
function nombreofcyciu($codofc,$entidad)/*BUSCAR NOMBRE OFICINA y ciudad*/
{ 
    include ("conectar.php");
    /* ¿Hay conexión? */
    if($link){
        $sql=mysqli_query($link,"SELECT * FROM $entidad WHERE item='$codofc'");
        /* ¿La consulta se ejecutó bien? */
        if($sql){

            $filasql=mysqli_fetch_array($sql); /* Linea de error*/
            $nombreofc[0]=$filasql['oficina'];
            $nombreofc[1]=$filasql['ciudad'];

            /*Aquí convendría cerrar los recursos si no se van a usar más*/ 
            return $nombreofc;                  

        }else{
            echo mysqli_error($link);   
        }

    }else{

        echo "Error: La conexión no existe";
    }
} 
?>  

NOTA:

1Lo que te dije más arriba en el punto 5, significa que tu consulta es vulnerable a la Inyección SQL. Cuando el código funcione, debes blindarla contra ese tipo de ataques. Para más detalles sobre esto puedes consultar:

- ¿Cómo evitar la inyección SQL en PHP?

- ¿Qué es la inyección SQL y cómo puedo evitarla?

- ¿La Inyección SQL actúa sólo a nivel de la base de datos o el riesgo es aún mayor?

A. Cedano
  • 86,578
  • 19
  • 122
  • 221