How can I show each client their orders from mysql?

0

I update again Current code:

<?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;
}
?>
    
asked by Javier Avila Fernandez 02.11.2017 в 13:52
source

5 answers

1

This is my proposal.

  • The code is well documented.
  • Use queries prepared to avoid SQL injection
  • Concatenate the data to avoid mixing PHP / HTML code that makes the code more illegible
  • It has more advantages than you can appreciate ... and programming so you can implement several recommended programming practices

Code

<?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;
}
?>

Result

In a proof of concept, the result would be this:

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>
    
answered by 02.11.2017 / 16:59
source
1

You do not comment how you get the current or logged-in user.

Assuming you can get the client code that is logged in a variable called $cliente for example, you would simply have to modify the query as follows:

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

On the other hand, be careful with SQL injection. I leave a link for you to documentes .

    
answered by 02.11.2017 в 14:00
1

First, how do you validate the logged-in user ?, if you use session start you can bring the user id $_SESSION['login']['id_cliente'] . and your query could be like this.

$id = $_SESSION['login']['id_cliente'];
$query="SELECT *  FROM historial where id_cliente = '$id'";
    
answered by 02.11.2017 в 14:12
1

You have to define the client by ID

SELECT * FROM historial WHERE cliente= '".$cliente."'
    
answered by 02.11.2017 в 14:37
0

First of all I recommend that you modify your question and add the structure of your order table, as well as the way in which you validate each user. Assuming that you are using session variables, and the user is defined in the variable $_SESSSION['idusuarioactivo']; you could query the database from this variable:

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

You host the user's id in a PHP variable, which you can use later, if you have a date field, it would be useful to sort them.

$query="SELECT *  FROM historial WHERE idusuario = '$idusuario' ORDER BY fecha DESC;";
    
answered by 02.11.2017 в 15:53