Easy-Micro

ESPACEMEMBRE PHP-MySQL
Afficher une table

Afficher la table clients dans un tableau

La librairie PDO - PHP Data Objects

Syntaxe orienté objet

Est utilisé ici l'extension PDO avec sa syntaxe POO (Programmation Orientée Objet) qui permet de faire appel à des méthodes d'objet. L'exemple ci-dessus appel la méthode prepare() de l'objet PDO ($bdd) avec l'opérateur flèche -> (tiret du 6 et signe supérieur). Cet opérateur d'appel sert à accéder aux éléments d'une classe (méthode ou attribut).

Requêtes préparées et procédures stockées

Une requête préparée n'est analysée (ou préparée) qu'une seule fois, mais peut être exécutée plusieurs fois avec des paramètres différents. Elles utilisent moins de ressources et s'exécutent plus rapidement. Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possible (Cependant, si vous construisez d'autres parties de la requête en vous basant sur des entrées utilisateurs, vous continuez à prendre un risque). Plus d'infos sur Php.net

Require_once et requêtes

Attention: Sur un serveur Apache local, un require_once() sur un fichier qui contiens une requête génère une notice "undefined variable" si cette requête utilise des variables. Il faut donc, en production, ne pas faire de require_once() sur un fichier qui contiendrait toutes vos requêtes.

Afficher une table MySQL avec la librairie PDO

L'extension PDO (PHP Data Objects) est préinstallée dans PHP : on peut donc l'utiliser directement
<?php
// connexion à la base
$user = "root";
$pass = "";
$dnspdo = 'mysql:dbname=mabase;host=localhost;charset=utf8';

$bdd = new PDO($dnspdo, $user, $pass);


// Par sécurité, tout le code ci-dessus sera remplacé par un require_once('dossier/infos.php');
// avec un htaccess interdisant l'accès au dossier

// Récupère les données de la table clients
$requete1 = 'SELECT * FROM clients';


// le prepare (avec le execute) est comme un query mais beaucoup plus sécurisé (voir ci-dessous)
// l'opérateur flèche -> permer d'accéder aux éléments d'une classe (méthode ou attribut)
$resultat = $bdd->prepare($requete1);
$resultat->execute();

// récupe d'infos (pas utilisés ici)
$nbreResult = $resultat->rowCount(); // Nbre de ligne de résultat
$colcount = $resultat->columnCount(); // Nombre de colonne

if (!$resultat) {
    echo "Problème de requete";
} else {
?>

// Affichage des clients dans une liste à puce
Liste des clients :<br>
<ul>
<?php
while($ligne = $resultat->fetch()) {
		echo "<li>".$ligne['nom_client']."</li>";
	}  
      ?>
</ul>

<?php
     } // fin du else
$resultat->closeCursor(); // libère le résultat
// Un closeCursor annule l'execute() mais pas l'analyse (prepare) donc impose un nouveau execute() si une nouvelle requête est utilisée plus bas - Equivalent à MYSQL_DATA_SEEK (si 2 fetch à la suite)
?>




Afficher une table MySQL avec la librairie MySQLi

La librairie Mysqli (i pour improuve) est aujourd'hui moins sécurisée que l'extension PDO

$base = "mabase";
$user = "root";
$pass = "";
$serveur = "127.0.0.1";

/* Note : pour un affichage rapide, privilégiez l'adresse IP
au nom localhost qui doit passer par un dns */

$mysqli = new mysqli($serveur, $user, $pass, $base); // on instancie la classe mysqli

if ($mysqli->connect_errno) { // appel de méthode avec l'opérateur ->
printf("Échec de la connexion : %s\n", $mysqli->connect_error); // voir printf
exit();
}

// Par sécurité, tout le code ci-dessus sera idéalement remplacé par un require_once('dossier/fichier.php');

$resultat = $mysqli->query("SELECT * FROM Clients"); // appel de méthode avec l'opérateur ->
//Si beaucoup de données, on utilise MYSQLI_USE_RESULT
//$resultat = $mysqli->query("SELECT * FROM Clients", MYSQLI_USE_RESULT)

if (!$resultat) {
printf("Problème de requête - Erreur : %s\n", $mysqli->error); }
else {
?>
<ul>

<?php
// Affichage table dans tableau associatif ou numérique ou les deux (BOTH)
while($ligne = $resultat->fetch_array(MYSQLI_BOTH)) {
$format = '<li>%1$s - %2$s</li>'; // simple côte obligatoire
printf($format, utf8_encode($ligne["prenom_client"]), $ligne["nom_client"]);
}
?>
</ul>
<?php
}
$resultat->close(); // libère les résultats
$mysqli->close(); // ferme la connexion
?>

Pour aller plus loin...

Pour optimiser - et sécuriser - l'affichage des noms de colonnes, on peut utiliser des alias de nom dans la requête, exemple : $requete = "SELECT civilite as Civilité, nom as Nom, prenom as Prénom, date_de_naissance as 'Date de naissance' FROM clients"; Dans ce cas, l'affichage des champs devra, lui aussi, utiliser les alias, exemple : echo "<td>".$ligne['Date de naissance']."</td>";