0

Actualizo de nuevo Código actual:

<?php
require('conexion.php');

/* Variable para el control de errores*/
$arrMensaje=array();

/* OBJETO CONEXIÓN */
$mysqli = new mysqli('miservidor', 'usuario', 'password', 'ndb', 'puerto');

/*
        * Escribiremos un código controlado, que vaya evaluando las variables
        * Nunca podemos dar por hecho que las cosas funcionarán porque sí
*/

/*
        *1ª evaluación: ¿la conexión está activa?
        *Este sería el primer paso antes de lanzar cualquier código
        *relativo a la base de datos
*/

if ($mysqli){


    /*
            *CONSULTA PARA PREPARAR
            *En estas consultas en vez de los valores pone el signo ?
            *Habrá tantos signos ?  como valores externos se requieran
            *Aquí sólo se usa uno, pero pueden ser más
    */
    $sql = "SELECT *  FROM historial WHERE id = ? ORDER BY fecha DESC";

    /*
            *VALORES
            *Generalmente los valores son recuperados por $_POST o $_GET
            *Aquí lo ponemos directamente por motivos de simplicidad
            *Un valor recuperado por POST sería algo así más o menos: $id=$_POST["id"];
            *La consulta buscará los actores cuyo id sea mayor que 0 y menor que 8
    */

    $idusuario = $_SESSION['id'];

    /*
            *PREPARAR LA CONSULTA
    */

    $stmt=$mysqli->prepare($sql);

    /*
            *2ª evaluación: ¿La consulta se preparó bien?
            *Dado que el método prepare invocado antes devuelve FALSE
            *si hay algún error, podemos preguntar si $stmt es TRUE
            *Si no lo es, significa que hubo un error en la consulta
    */

    if ($stmt) {

        /*
              * Si la consulta se preparó bien, ahora le pasamos aparte los valores
              * Este es el núcleo de las consultas preparadas
              * Se usa aquí bind_param para pasar los valores
              * IMPORTANTE: Aquí se pasan tantos valores como signos de ? haya en la instrucción $sql
              * como la instrucción tenía un sólo ?, pasamos un solo valor
              * cuando hay más valores, estos deben pasarse en el orden en que aparecen en $sql
              * Las "ii"  indican el tipo de dato de esa columna en la base de datos
              * en este caso son numéricos, si fuesen cadenas, en vez de "i" habría "s"
              * si fuese uno numérico y otro cadena entonces tendríamos "is", y así por el estilo...
        */

        $stmt->bind_param("i", $idusuario); //Si idusuario es VARCHAR cambia la "i" por una "s"
        $stmt->execute();

        /*
                * ALMACENAR LOS RESULTADOS
                * mysqli tiene un problema cuando se trata de almacenar los resultados
                * en arrays asociativos usando consultas preparadas
                * por eso es invocado aquí el método get_result hecho a mano
                * ya que éste sólo funciona en servidores con mysqlnd instalado
                * el método get_result puede ser guardado en una clase utilitaria
                * y llamarlo mediante una nueva instancia de esa clase cuando lo necesitemos
                * o, si hacemos muchas operaciones de este tipo, recomiendo pasar de mysqli a PDO
        */

        $arrResultado=get_result($stmt);

        /*
                * CONSTRUIR LA TABLA
                * En vez de mezlcar constantemente código HTML/PHP
                * Lo cual hace el código más difícil de leer y analizar
                * Podemos crear toda nuestra tabla en una variable PHP que iremos concatenando
                * Y la imprimimos al final
        */


        /* Primera parte de nuestra tabla */
        $strHTML='<table>
                        <thead>
                            <th >Order</th>
                            <th >Fecha</th>
                            <th >Cliente</th>
                            <th >Referencia</th>
                            <th >Familia</th>
                            <th >Ojo Derecho</th>
                            <th >Ojo Izquierdo</th>
                         </thead>
                         <tbody>';

        /* Leemos el array obtenido antes y seguimos concatenando cada fila/columnas */


        foreach ($arrResultado as $row)
        {
            $strHTML.='<tr>';
            $strHTML.='<td>'.$row["ordern"]."</td>";
            $strHTML.='<td>'.$row["fecha"]."</td>";
            $strHTML.='<td>'.$row["cliente"]."</td>";
            $strHTML.='<td>'.$row["referencia"]."</td>";
            $strHTML.='<td>'.$row["familia"]."</td>";
            $strHTML.='<td>'.$row["od"]."</td>";
            $strHTML.='<td>'.$row["oi"]."</td>";
            $strHTML.='</tr>';

        }

        /* Una vez fuera del bucle, completamos la tabla */

        $strHTML.='</tbody>';
        $strHTML.='</table>';

        /*Completada la tabla, la imprimimos*/

        echo $strHTML;

        /* Cerramos el $stmt */

        $stmt->close();

    }else{

        /*
            * Llenamos el array de control de errores con un mensaje
            * Podemos usar el método error de $mysqli para saber qué error es
        */

        $arrMensaje=array("error"=>"Hubo un fallo en la consulta: ".$mysqli->error);

    }


    /* Cerramos la conexión */

    $mysqli->close();


}else{

        /*
            * Llenamos el array de control de errores con un mensaje
            * Podemos usar el método error de $mysqli para saber qué error es
        */

    $arrMensaje=array("error"=>"La conexión es nula: ".$mysqli->error);
}


/* 
    * VERIFICAR SI HUBO ERROR
    * Aquí leemos $arrMensaje para ver si contiene algo
    * Si hay algo significa que algún error fue capturado en la ejecución del código
    * entonces podremos imprimirlo
    * Esta forma de proceder la he copiado de los servicos REST, que siempre devuelven algo
    * es una buena práctica hacer decir siempre algo al código
    * o sea, no escribir código mudo cuando falle algo
*/
if ($arrMensaje){
    echo $arrMensaje["error"];
}


/*
    * FUNCION QUE EMULA EL FETCH_ASSOC DE PDO
    * Esta función nos permite crear un array asociativo con los resultados
    * Así accedemos fácimente a su valor por el nombre de columna en la base de datos
*/

function get_result( $Statement ) {
    $RESULT = array();
    $Statement->store_result();
    for ( $i = 0; $i < $Statement->num_rows; $i++ ) {
        $Metadata = $Statement->result_metadata();
        $PARAMS = array();
        while ( $Field = $Metadata->fetch_field() ) {
            $PARAMS[] = &$RESULT[ $i ][ $Field->name ];
        }
        call_user_func_array( array( $Statement, 'bind_result' ), $PARAMS );
        $Statement->fetch();
    }
    return $RESULT;
}
?>
  • Tienes alguna manera de comprobar el usuario que esta logueado? Cuál es la manera en la que diferencias de un usuario a otro en la web. – Flowen Nov 02 '17 at 12:54
  • Aquí es donde verifico el login del usuario. Con esta variable obtengo el id del cliente: ($_SESSION['id']) y la muestro así: – Javier Avila Fernandez Nov 02 '17 at 13:12
  • Después de probar los métodos propuestos: Me salta el siguiente error en una linea de código. Que es la siguiente: while($row=$resultado->fetch_assoc()){ ?> – Javier Avila Fernandez Nov 02 '17 at 13:29

5 Answers5

1

No comentas como obtienes el usuario actual o logueado.

Suponiendo que puedas obtener el código del cliente que está logueado en una variable llamada $cliente por ejemplo, simplemente tendrías que modificar la query del siguiente modo:

  $query="SELECT * FROM historial WHERE cliente= '".$cliente."'";

Por otro lado, ten cuidado con la inyección SQL. Te dejo algún enlace para que te documentes.

Flowen
  • 2,147
  • 8
  • 13
1

Primero, ¿como validas al usuario logeado?, si usas session start puedes traer el id del usuario $_SESSION['login']['id_cliente']. y tu consulta podria quedar asi.

$id = $_SESSION['login']['id_cliente'];
$query="SELECT *  FROM historial where id_cliente = '$id'";
Edwin Aquino
  • 931
  • 2
  • 11
  • 20
1

Tenes que definir el cliente por la ID

SELECT * FROM historial WHERE cliente= '".$cliente."'
  • Nicolas, por favor revisa [answer] para realizar respuestas. No olvides realizar el [tour] para conocer el funcionamiento básico del sitio. – Jorgesys Nov 02 '17 at 13:53
1

Esta es mi propuesta.

  • El código está bastante documentado.
  • Usa consultas preparadas para evitar la Inyección SQL
  • Concatena los datos para evitar la mezcla de código PHP/HTML que hace más ilegible el código
  • Tiene más ventajas que podrás apreciar... y programando así puedes implementar varias prácticas recomendadas de programación

Código

<?php
require('conexion.php');

/* Variable para el control de errores*/
$arrMensaje=array();

/* OBJETO CONEXIÓN */
//Ya lo obtienes en el require, me parece...
//$mysqli = new mysqli($host_name, $user_name, $pass_word, $database_name, $port);

/*
        * Escribiremos un código controlado, que vaya evaluando las variables
        * Nunca podemos dar por hecho que las cosas funcionarán porque sí
*/

/*
        *1ª evaluación: ¿la conexión está activa?
        *Este sería el primer paso antes de lanzar cualquier código
        *relativo a la base de datos
*/

if ($mysqli){


    /*
            *CONSULTA PARA PREPARAR
            *En estas consultas en vez de los valores pone el signo ?
            *Habrá tantos signos ?  como valores externos se requieran
            *Aquí sólo se usa uno, pero pueden ser más
    */
    $sql = "SELECT *  FROM historial WHERE id = ? ORDER BY fecha DESC";

    /*
            *VALORES
            *Generalmente los valores son recuperados por $_POST o $_GET
            *Aquí lo ponemos directamente por motivos de simplicidad
            *Un valor recuperado por POST sería algo así más o menos: $id=$_POST["id"];
            *La consulta buscará los actores cuyo id sea mayor que 0 y menor que 8
    */

    $idusuario = $_SESSION['id'];

    /*
            *PREPARAR LA CONSULTA
    */

    $stmt=$mysqli->prepare($sql);

    /*
            *2ª evaluación: ¿La consulta se preparó bien?
            *Dado que el método prepare invocado antes devuelve FALSE
            *si hay algún error, podemos preguntar si $stmt es TRUE
            *Si no lo es, significa que hubo un error en la consulta
    */

    if ($stmt) {

        /*
              * Si la consulta se preparó bien, ahora le pasamos aparte los valores
              * Este es el núcleo de las consultas preparadas
              * Se usa aquí bind_param para pasar los valores
              * IMPORTANTE: Aquí se pasan tantos valores como signos de ? haya en la instrucción $sql
              * como la instrucción tenía un sólo ?, pasamos un solo valor
              * cuando hay más valores, estos deben pasarse en el orden en que aparecen en $sql
              * Las "ii"  indican el tipo de dato de esa columna en la base de datos
              * en este caso son numéricos, si fuesen cadenas, en vez de "i" habría "s"
              * si fuese uno numérico y otro cadena entonces tendríamos "is", y así por el estilo...
        */

        $stmt->bind_param("i", $idusuario); //Si idusuario es VARCHAR cambia la "i" por una "s"
        $stmt->execute();

        /*
                * ALMACENAR LOS RESULTADOS
                * mysqli tiene un problema cuando se trata de almacenar los resultados
                * en arrays asociativos usando consultas preparadas
                * por eso es invocado aquí el método get_result hecho a mano
                * ya que éste sólo funciona en servidores con mysqlnd instalado
                * el método get_result puede ser guardado en una clase utilitaria
                * y llamarlo mediante una nueva instancia de esa clase cuando lo necesitemos
                * o, si hacemos muchas operaciones de este tipo, recomiendo pasar de mysqli a PDO
        */

        $arrResultado=get_result($stmt);


/*
        *3ª evaluación: ¿Se cumplen los criterios de búsqueda?
*/        
    if($arrResultado){


        /*
                * CONSTRUIR LA TABLA
                * En vez de mezlcar constantemente código HTML/PHP
                * Lo cual hace el código más difícil de leer y analizar
                * Podemos crear toda nuestra tabla en una variable PHP que iremos concatenando
                * Y la imprimimos al final
        */

        
        /* Primera parte de nuestra tabla */
        $strHTML='<table>
                        <thead>
                            <th >Order</th>
                            <th >Fecha</th>
                            <th >Cliente</th>
                            <th >Referencia</th>
                            <th >Familia</th>
                            <th >Ojo Derecho</th>
                            <th >Ojo Izquierdo</th>
                         </thead>
                         <tbody>';

        /* Leemos el array obtenido antes y seguimos concatenando cada fila/columnas */


        foreach ($arrResultado as $row)
        {
            $strHTML.='<tr>';
            $strHTML.='<td>'.$row["ordern"]."</td>";
            $strHTML.='<td>'.$row["fecha"]."</td>";
            $strHTML.='<td>'.$row["cliente"]."</td>";
            $strHTML.='<td>'.$row["referencia"]."</td>";
            $strHTML.='<td>'.$row["familia"]."</td>";
            $strHTML.='<td>'.$row["od"]."</td>";
            $strHTML.='<td>'.$row["oi"]."</td>";
            $strHTML.='</tr>';

        }

        /* Una vez fuera del bucle, completamos la tabla */

        $strHTML.='</tbody>';
        $strHTML.='</table>';

        /*Completada la tabla, la imprimimos*/

        echo $strHTML;
    
    }else{
    
       $arrMensaje=array("error"=>"No hay datos que cumplan los criterios");

    }


        /* Cerramos el $stmt */

        $stmt->close();

    }else{

        /*
            * Llenamos el array de control de errores con un mensaje
            * Podemos usar el método error de $mysqli para saber qué error es
        */

        $arrMensaje=array("error"=>"Hubo un fallo en la consulta: ".$mysqli->error);

    }
    
    
    /* Cerramos la conexión */
    
    $mysqli->close();


}else{

        /*
            * Llenamos el array de control de errores con un mensaje
            * Podemos usar el método error de $mysqli para saber qué error es
        */

    $arrMensaje=array("error"=>"La conexión es nula: ".$mysqli->error);
}


/* 
    * VERIFICAR SI HUBO ERROR
    * Aquí leemos $arrMensaje para ver si contiene algo
    * Si hay algo significa que algún error fue capturado en la ejecución del código
    * entonces podremos imprimirlo
    * Esta forma de proceder la he copiado de los servicos REST, que siempre devuelven algo
    * es una buena práctica hacer decir siempre algo al código
    * o sea, no escribir código mudo cuando falle algo
*/
if ($arrMensaje){
    echo $arrMensaje["error"];
}


/*
    * FUNCION QUE EMULA EL FETCH_ASSOC DE PDO
    * Esta función nos permite crear un array asociativo con los resultados
    * Así accedemos fácimente a su valor por el nombre de columna en la base de datos
*/

function get_result( $Statement ) {
    $RESULT = array();
    $Statement->store_result();
    for ( $i = 0; $i < $Statement->num_rows; $i++ ) {
        $Metadata = $Statement->result_metadata();
        $PARAMS = array();
        while ( $Field = $Metadata->fetch_field() ) {
            $PARAMS[] = &$RESULT[ $i ][ $Field->name ];
        }
        call_user_func_array( array( $Statement, 'bind_result' ), $PARAMS );
        $Statement->fetch();
    }
    return $RESULT;
}
?>

Resultado

En una prueba de concepto, el resultado sería este:

table {
  border-collapse: collapse;
}

table,
th,
td {
  border: 1px solid black;
}
<table>
  <thead>
    <th>id</th>
    <th>nombre</th>
    <th>apellido</th>
    <th>sexo</th>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Jack</td>
      <td>Nicholson</td>
      <td>M</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Marlon</td>
      <td>Brando</td>
      <td>M</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Robert</td>
      <td>De Niro</td>
      <td>M</td>
    </tr>
    <tr>
      <td>4</td>
      <td>Al</td>
      <td>Pacino</td>
      <td>M</td>
    </tr>
    <tr>
      <td>5</td>
      <td>Dustin</td>
      <td>Hoffman</td>
      <td>M</td>
    </tr>
    <tr>
      <td>6</td>
      <td>Jennifer</td>
      <td>Jones</td>
      <td>F</td>
    </tr>
    <tr>
      <td>7</td>
      <td>Holly</td>
      <td>Hunter</td>
      <td>F</td>
    </tr>
  </tbody>
</table>
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Parece que resuelve lo que necesito. Pero me encuentro con este error, syntax error, unexpected '$stmt' al entrar :/ Parece que llevo esto un poco gafado, el código esta muy bien explicado! voy a intentar revisar si me equiboco en algún parámetro. – Javier Avila Fernandez Nov 02 '17 at 16:18
  • @JavierAvilaFernandez fue un error mío, falta el `;` aquí: `$idusuario = $_SESSION['id']` – A. Cedano Nov 02 '17 at 16:20
  • Cierto! me queda la duda, de en la linea de $sql = "SELECT * FROM historial WHERE id = ? ORDER BY fecha DESC"; Saber si será necesario actualizar ese ?. Porque en este momento me saca Hubo un fallo en la consulta: – Javier Avila Fernandez Nov 02 '17 at 16:25
  • No, como explica el código, el `?` es para pasar los valores aparte y evitar la Inyección SQL. ¿No dice que error es? Quizá escribiste mal el nombre de la tabla o de alguna columna. – A. Cedano Nov 02 '17 at 16:27
  • No sale error. realmente sale: "Hubo un fallo en la consulta:" los datos estan correctos. Los parametros del $mysqli = new mysqli($host_name, $user_name, $pass_word, $database_name, $port); si los modifico ahí mismo, no me los admite. me imagino que no esta ahí el error, pero la tabla y sus columnas son correctas – Javier Avila Fernandez Nov 02 '17 at 16:33
  • Comentar, que me saca, las cabeceras de la tabla, pero no me rellena la tabla. – Javier Avila Fernandez Nov 02 '17 at 16:38
  • Puedes editar tu pregunta, poniendo el código como lo tienes ahora... da la impresión de que olvidaste cerrar alguna `{ }` o algo así. – A. Cedano Nov 02 '17 at 16:39
  • Acabo de actualizar! El codigo actual está en el post principal ahora mismo! – Javier Avila Fernandez Nov 02 '17 at 16:42
  • Me parece que tú obtenías la variable de conexión `$mysqli` desde el `require` que tienes más arriba, por lo que puedes comentar esta línea: **`//$mysqli = new mysqli('miservidor', 'usuario', 'password', 'ndb', 'puerto');`**, creo que ese es el problema, comenta la línea donde creas de nuevo la conexión y prueba. – A. Cedano Nov 02 '17 at 16:45
  • Ocurre lo mismo, muestra los elementos del que genera la tabla, pero sigue sin rellenarlas, estoy logueado en una cuenta con codigo de cliente 2, y existen pedidos en la tabla historial con el cliente 2. Comentar, que el campo id se llamda id en la tabla usuarios, y se llama id, en la tabla historial. – Javier Avila Fernandez Nov 02 '17 at 16:48
  • ¿Y sigue saliendo el mensaje *Hubo un fallo en la consulta* o ya no sale? – A. Cedano Nov 02 '17 at 16:50
  • No, la consulta parece que le acepta, lo que parece que esta suciendo, es que se supone que no encuentra ningún pedido, del cliente 2. Sin embargo, en la columna id, de la tabla historial, existen 7 pedidos del cliente 2. – Javier Avila Fernandez Nov 02 '17 at 16:56
  • Eso es lo que crees, pero puede ser que `$idusuario` no tenga el valor que crees que tiene o en realidad esos registros no existen, los criterios no se cumplen. Haz `echo $idusuario;` para verificar su valor. Si tiene el valor que dices que tiene, entonces escribe la consulta a mano y ejecútala en phpmyadmin para verificar si en realidad devuelve datos. Agregaré un nuevo control al código. – A. Cedano Nov 02 '17 at 16:59
  • Ya he encontrado el problema, y era más lógico de lo que a veces pensamos, en el codigo, si te fijas nunca he llegado a iniciar la sesión. Por lo tanto nunca va a encontrar el id del usuario jejeje. Lo estoy probando y va genial, voy a probar darle algo de css a la tabla !!! – Javier Avila Fernandez Nov 02 '17 at 17:05
  • Ok. De todos modos he editato, añadiendo un tercer control que imprima un mensaje cuando los criterios no se cumplan. – A. Cedano Nov 02 '17 at 17:07
  • Me has resuelto el caso, y la verdad muchos más que tenia planteados, además de mejorar la seguridad, muchas gracias A. Cedano !!!! – Javier Avila Fernandez Nov 02 '17 at 17:21
0

Primero que nada te recomiendo que modifiques tu pregunta y agregues la estructura de tu tabla de pedidos, así también la forma en que validas a cada usuario. Suponiendo que estas utilizando variables de sesión, y el usuario está definido en la variable $_SESSSION['idusuarioactivo']; podrías realizar una consulta a la base de datos a partir de esta variable:

<?php
if (isset($_SESSION['idusuarioactivo'] {
$idusuario = $_SESSION['idusuarioactivo'];
}
?>

Alojas el id del usuario en una variable PHP, misma que puedes utilizar más adelante, si tienes un campo de fecha, este te serviría para ordenarlos.

$query="SELECT *  FROM historial WHERE idusuario = '$idusuario' ORDER BY fecha DESC;";
alexchvrches
  • 346
  • 1
  • 15
  • Ahora bien, como lo dijo A. Cedano en una anterior respuesta, esta forma te permite obtener los pedidos de cierto usuario, pero puede hacer propenso tu código a la inyección SQL. – alexchvrches Nov 02 '17 at 14:58