IdFirstnameLastname
1JohnDoe
2JohnDoe
6JohnDoe
9JohnDoe
10JohnDoe
11JohnDoe
12JohnDoe
15JohnDoe
18JohnDoe
19JohnDoe
20JohnDoe
23JohnDoe
26JohnDoe
27JohnDoe
30JohnDoe
31JohnDoe
34JohnDoe
35JohnDoe
38JohnDoe
39JohnDoe
42JohnDoe
45JohnDoe
46JohnDoe
47JohnDoe

Codi en PHP

<!DOCTYPE html>
<html lang="ca">
    <head>
        <title>Exemple Ordre Where Guillem Serrat</title>
        <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <?php
            echo "<table style='border: solid 1px black;'>";                    // Crea la taula
            echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";     // Crea una fila per les capçeleres de la taula

            // Creem una classe que és filla de RecursiveIteratorIterator, una classe de PHP que permet recórrer estructures d'arrays
            class TableRows extends RecursiveIteratorIterator {
                // Sempre es crida al constructor 1 vegada abans de começar a iterar sobre un array
                function __construct($it) { 
                    parent::__construct($it, self::LEAVES_ONLY);
                    // Amb l'operador LEAVES_ONLY ens assegurem que únicament agafa el valor i res més
                }

                // Creem una funció anomenada current. L'objectiu de la funció és crear una cel·la i agafar el valor d'un registre SQL.
                // Aquesta funció la crida automàticament per l'objecte RecursiveIteratorIterator (no cal cridar-la, es fa sol)
                function current() :string { // Afegim :string per evitar el missatge "deprecated". Indiquem que retorna un String
                    return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
                }

                // Creem una funció anomenada beginChildren. L'objectiu de la funció és crear una nova fila.
                // Aquesta funció la crida automàticament per l'objecte RecursiveIteratorIterator (no cal cridar-la, es fa sol)
                // Aquesta funció és cridada cada vegada que es fa una iteració (1 volta, 1 registre en SQL)
                function beginChildren() :void { // Afegim :void per evitar el missatge "deprecated". Indiquem que no retorna res
                    echo "<tr>"; // Creem la fila
                }

                //Creem una funció anomenada endChildren L'objectiu de la funció és tancar la fila creada per la funció endChildren
                // Aquesta funció la crida automàticament per l'objecte RecursiveIteratorIterator (no cal cridar-la, es fa sol)
                // Aquesta funció és cridada cada vegada que es fa una iteració (1 volta, 1 registre en SQL)
                function endChildren() :void { // Afegim :void per evitar el missatge "deprecated"
                    echo "</tr>" . "\n"; // Tanquem la fila
                }

                // Resum del Flux de l'Iteració
                // 1. Inici de l'Iteració (Per a la primera fila): Es crida beginChildren() --> Imprimeix <tr>.
                // 2. Iteració de la Primera Columna (id): Es crida current() --> Imprimeix <td ...>1</td>.
                // 3. Iteració de la Segona Columna (firstname): Es crida current() --> Imprimeix <td ...>John</td>.
                // 4. Iteració de la Tercera Columna (lastname): Es crida current() --> Imprimeix <td ...>Doe</td>.
                // 5. Fi de l'Iteració de la Fila: Es crida endChildren() --> Imprimeix </tr>\n.
                // 6. Repetició (Per a la següent fila), tornant al punt 1.


            }

            $servername = "127.0.0.1";
            $username = "root";
            $password = "fjeclot";
            $dbname = "myDBPDO";

            try {
                // Definim un nou objecte de la classe PDO amb els atributs: host al que ens connectarem, el nom d'usuari i contrasenya.
                $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

                // A través de la funció setAttribute, agafem el tipus d'error en cas de que n'hi hagi algun
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // Definim una preparació en la variable $stmt.
                $stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests WHERE lastname='Doe'");

                // Executem la preparació
                $stmt->execute();

                // Imprimim la taula fent servir la crida automàtica a les funcions de la classe RecursiveArrayIterator
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
                    // new RecursiveArrayIterator($stmt->fetchAll()) converteix els registres en iteratius
                    echo $v; // Imprimeix tota la fila HTML ja processada per les funcions
                }
            } catch(PDOException $e) {                      // En cas de que hi hagi un error, PHP llença una PDOException, i la variable $e agafa aquesta excepció
                echo "Error: " . $e->getMessage();          // Si no s'executa correctament, imprimeix el missatge d'error de PDOException
            }
            $conn = null;
            echo "</table>";
        ?>
        
        <h1>Codi en PHP</h1>
        <?php
        show_source("ex8.php");
        ?>
    </body>
</html>