ERROR Trying to get property 'num_rows' of non-object in

0

This problem has been going on for a day. I swear I did not touch anything on this php and 2 days ago it worked ... and I do not know why not now.

The code is as follows:

    <?php

    require 'conexion.php';

    if(isset($_GET["id"])){
        $id = $_GET["id"];
        $sql = "SELECT * FROM vista_citas WHERE usuario_id = $id";
        $result = $conn->query($sql);
        if($result->num_rows > 0){
            while($row = $result->fetch_assoc()){
                $response[] = $row;
            }
        }else{
            $response["success"] = false;
        }
    }

    $conn->close();

    echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>

It's a very simple query, it brings the appointments according to the user_id that is sent, in fact if I try it in the phpmyadmin it works ....

Does anyone give me a hand? Thanks!

    
asked by Best Thony 14.06.2018 в 19:34
source

1 answer

0

You can try this code, which will control the entire flow and tell you the problem that has occurred.

I have been constructing a variable $response that will return you, either the results obtained from the database, or an array with two keys: success , whose value will be FALSE in case of error or data empty, and another key message , with a text message descriptive of the situation.

Everything else is commented in the code, because I have implemented queries prepared to shield the code, and I have incorporated a utilitarian function (that it would be convenient to have in a separate class for when you need it). This function solves the important problem of obtaining an associative array of results when queries prepared in mysqli are used and the drive mysqlnd is not installed (for more details on this you can read this question and its answer: How to obtain an associative array using queries prepared with mysqli? ).

Here is the code. The essential is commented. I hope it serves you.

   /*
        *Podemos usar simplemente empty para evaluar si :
            - se pasó la clave id
            - si ésta tiene algún valor
        *Se hará mediante un operador ternario
    */

    $id=(empty($_GET["id"])) ? NULL : $_GET["id"];
    /*
        *Evaluamos si hay algo en $id
        *Nótese que el require está dentro de esta condición, 
        *ya que si no hay nada en $id no tendría sentido
        *usar la conexión a la BD
        *Así respetamos una regla muy básica: no incluyas nada que no vayas a usar
    */
    if ($id){
        require 'conexion.php';
        /*
            *Conviene evaluar la conexión. Quizá en tu archivo conexion.php
            *cambiaron las credenciales o algo y por eso tu código actual no funciona
        */
        if($conn){
            /* 
                *Vamos a dar seguridad al código usando consultas preparadas
                *Nunca se debería pasar un dato proveniente de una fuente externa
                *directamente en una consulta SQL para que sea ejecutada
                *Esto permitiría que usuarios mal intencionados manipulen los datos escritos
                *para inyectar posible código dañino, el cual se ejecutaría sin control alguno
                *Se trata por tanto de un grave riesgo de seguridad
                *Las consultas preparadas son muy fáciles, se hacen en dos pasos:
                *Paso 1: En la instrucción SQL se cambian los valores reales por marcadores ?
            */

            $sql = "SELECT * FROM vista_citas WHERE usuario_id = ?";
            /* Se manda a preparar la consulta antes escrita*/
            $stmt = $conn->prepare($sql);
            /*
                *Paso 2: Se pasan los valores reales aparte mediante un método que existe para eso
                *La "i" indica que la columna en cuestión es del tipo (i)nteger en la base de datos
                *Aquí se pasarían tantos tipos de datos/variables como hubiera en la consulta
                *Como sólo hay uno, pasamos uno
            */
            $stmt->bind_param("i", $id);
            $stmt->execute();
            /*
                *Almacenamos los datos pasando el resultado de la consulta 
                *a una función propia que hemos creado, la cual nos crea un array
                *asociativo de columnas/valores de cada fila encontrada
                *Existe un método que hace eso, pero a veces no viene instalado en PHP
                *Por eso he optado por esta función, la cual se puede incorporar
                *a una clase utilitaria 
            */
            $datos=fetch_assoc($stmt);

            /*
                *Nótese que hemos prescindido de row_count
                *porque si no hay datos, nuestra función fetch_assoc nos devolverá
                *un array vacío cuando no se encuentre ningún dato
                *En la línea que sigue usamos un ternario para evaluar si $datos está vacío
                *lo cual significará que no hubo datos en la consulta.
            */
            $response=($datos) ? $datos : array("success"=>FALSE, "message"=> "No se encontraron registros");
            /*Cerramos recursos*/
            $stmt->close();
            $conn->close();

        }else{
                $response=array("success"=> FALSE, "message" => "Hay problemas con la conexión");                       
        }
    }else{
                $response=array("success" => FALSE, "message" => "No hay datos en el GET");                     
    }


echo json_encode($response, JSON_UNESCAPED_UNICODE);


/*
    *Función auxiliar para devolver resultados asociativos
    *ante la dificultad que se presenta cuando se usan consultas preparadas
    *y no se tiene instalado el driver mysqlnd
    *Conviene incorporar esta función a una clase utilitaria
*/

function fetch_assoc ($stmt){
    $result=array();
    $meta = $stmt->result_metadata(); 
    while ($field = $meta->fetch_field()) 
    { 
        $params[] = &$row[$field->name]; 
    } 

    call_user_func_array(array($stmt, 'bind_result'), $params); 

    while ($stmt->fetch()) { 
        foreach($row as $key => $val) 
        { 
            $c[$key] = $val; 
        } 
        $result[] = $c; 
    } 
    return $result;
}
    
answered by 15.06.2018 в 18:07