Inline SVG Plus de dessin avec html5
Le mot-clé Order By est employé pour faire un tri ordonné des données dans un enregistrement.
Dans les deux derniers chapitres de ce tutorial je vous ai montré comment obtenir les données de la base de données et les afficher à l'écran.
Dans ce chapitre, j'entrerai dans l'aspect final de l’affichage des données, et la capture des erreurs qui peuvent se produire lorsque vous exportez des données.
Le mot-clé Order By est employé pour assortir les données dans un recordset.
Le mot-clé Order By tri les enregistrements dans l'ordre croissant par défaut.
Si vous voulez trier les enregistrements dans un ordre décroissant, vous pouvez employer le mot-clé de DESC.
Syntaxe
SELECT colonne_name(s) FROM table_name ORDER BY colonne_name(s) ASC|DESC
Pour apprendre plus au sujet du SQL, visitent svp notre cours d'instruction de SQL.
Exemple
L'exemple suivant choisit toutes les données stockées dans la table « visiteurs » que nous avons créé lors d’un chapitre précédent, on va ordoner (trier) les résultat par la colonne « âge » :
Exemple avec MySQLi orienté objet
Exemple : Copier le code
<html lang="fr"> <head> <meta charset="UTF-8"> <title>MySQL Order By </title> </head> <body> <?PHP $servername = "localhost"; $username = "root"; $password = ""; $dbname = "mabase"; //Créer la connexion $conn = new mysqli($servername, $username, $password, $dbname); //Vérifier la connexion if ($conn->connect_error) { die("connexion impossible: " . $conn->connect_error); } $sql= "SELECT * FROM visiteurs ORDER BY age DESC"; $resultat = $conn->query($sql); $num=$resultat->num_rows; echo "<h2>classement par ordre Décroissant sur la colonne age</h2><p>"; if ($num > 0) { while($row = $resultat->fetch_assoc()) { echo "id: " . $row["id"]. " - Nom: " . $row["prenom"]. " " . $row["nom"]. "<br>"; } } else { echo "0 resultat trouvé"; } echo "</p>"; $sql= "SELECT * FROM visiteurs ORDER BY age ASC"; $resultat = $conn->query($sql); echo "<h2>classement par ordre croissant sur la colonne age</h2><p>"; if ($num > 0) { while($row = $resultat->fetch_assoc()) { echo "id: " . $row["id"]. " - Nom: " . $row["prenom"]. " " . $row["nom"]. "<br>"; } } else { echo "0 resultat trouvé"; } $conn->close(); echo "</p>"; ?> </body> </html>
Vous pouvez améliorer ce code en le rendant plus convivial (par exemple en fournissant un lien vers la page Ajouter des données si aucun contact n'existe).
L'exemple suivant montre la même chose que l'exemple ci-dessus, en mode MySQLi Procédural :
Exemple (MySQLi procédural)
Code PHP
<!DOCTYPE html> <html> <body> <?php echo "<table style='border: solid 1px black;border-collapse: collapse;'>"; echo "<tr><th style='width:70px;border:1px solid black;'>Id</th><th style='width:70px;border:1px solid black;'>Nom</th><th style='width:70px;border:1px solid black;'>Prénom</th></tr>"; $servername = "localhost"; $username = "root"; $password = ""; $dbname = "mabase"; // Créer une connexion $conn = mysqli_connect($servername, $username, $password, $dbname); // Vérifier la connexion if (!$conn) { die("La Connexion a échoué: " . mysqli_connect_error()); } $sql = "SELECT * FROM visiteurs ORDER BY nom"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { echo "<tr><td style='width:70px;border:1px solid black;'> " . $row["id"]. " </td><td style='width:70px;border:1px solid black;'> " . $row["nom"]. " </td><td style='width:70px;border:1px solid black;'> " . $row["prenom"]. "</td></tr>"; } } else { echo "0 results"; } mysqli_close($conn); echo "</table>"; ?> </body> </html>
Dans l'exemple suivant on utilise les requêtes préparées.
Ici, on sélectionne les colonnes id, preno et nom de la table visiteurs. Les enregistrements seront classés par la colonne nom, et seront affichés dans un tableau HTML :
Code PH Exemple (PDO)
<html lang="fr"> <head> <meta charset="UTF-8"> <title>MySQL Order By </title> </head> <body> <?PHP $servername = "localhost"; $username = "root"; $password = ""; $dbname = "mabase"; echo "<table style='border: solid 1px #000;'>"; echo "<tr><th>Id</th><th>Prénom</th><th>Nom</th></tr>"; class TableRows extends RecursiveIteratorIterator { function __construct($it) { parent::__construct($it, self::LEAVES_ONLY); } function current() { return "<td style='width:70px;border:1px solid black;'>" . parent::current(). "</td>"; } function beginChildren() { echo "<tr>"; } function endChildren() { echo "</tr>" . "\n"; } } try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare("SELECT id, nom, prenom FROM visiteurs ORDER BY age DESC"); $stmt->execute(); // définir le tableau résultant en associatif $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { echo $v; } } catch(PDOException $e) { echo "Erreur: " . $e->getMessage(); } $conn = null; echo "</table>"; ?> </body> </html>
Non seulement vous pouvez copiez des données basées sur le contenu d'un champ, mais vous pouvez également commander la sortie basée sur un champ (par exemple mise en ordre alphabétique). Par défaut, la sortie de vos requêtes sera dans l'ordre du champ id, allant de 1 vers le haut. Vous pouvez faire un trie sur n'importe quel champs.
Par exemple, un sort utile serait de placer tous les utilisateurs dans l'ordre alphabétique, basé sur leur nom de famille. Pour rappelle, il s'agirait de l'ordre croissant, qui va de A à Z. (par ordre croissant est également de 1 à 10 etc. et décroissant fournit de Z à A et 10 à 1). Pour ce faire, vous utiliseriez la requête suivante :
SELECT * FROM nomTable ORDER BY nom ASC
Vous pouvez également utiliser DESC pour classer les données dans l'ordre décroissant, ou ASC pour classer les données dans l'ordre croissant.
La variable $num est très importante car, en dehors de la récupération d'erreur et des boucles, il a beaucoup d'autres utilisations. Un exemple de ceci serait d'imprimer uniquement les 5 derniers enregistrements ajoutés à une base de données.
Tout d'abord, vous aurez besoin d’un ordre basé sur le champ id. Il faudrait qu'ils soient dans l'ordre décroissant. Comme suit
SELECT * FROM nomTable ORDER BY id DESC
Maintenant vous avez vos données dans l'ordre du plus récent au plus ancien, mais cela n'oblige pas le script à montrer seulement les 5 premiers de cet ordre. Pour ce faire, vous devrez indiquer à votre boucle de ne parcourir que 5 au lieu de $num .
Bien sûr, avant de le faire, il serait important de vérifier que $num était supérieure à 5, car si vous avez exécuté la boucle 5 fois et que vous n’avez que 3 lignes, vous obtiendrez une erreur. C'est facile à voir bien sûr, et le code suivant est un exemple :
if ($num>5) {
$to=5;
}else{
$to=$num;
}
$i=0;
while ($i < $to) {
RESTE DU CODE
Ce code devrait vérifier s'il y avait plus de 5 lignes dans la base de données. Si oui, la boucle serait configurée pour être exécutée 5 fois. S'il y avait moins de 5 rangs la boucle serait exécutée juste le nombre exact de fois que le nombre d’enregistrements de la base de données entière.
Maintenant, en utilisant le champ ID qui est unique, nous pouvons sélectionner n'importe quel enregistrement de notre base de données à l'aide :
SELECT * FROM contacts WHERE id = '$id'
Où $id est une variable contenant un numéro d'un enregistrement. Cela peut sembler être un peu sans valeur, mais vous pouvez l'utiliser très efficacement dans un certain nombre de cas différents. Par exemple, si vous voulez avoir un site généré dynamiquement par une base de données et un seul script PHP, vous pouvez écrire le script pour inclure les données de la base de données dans la conception. Puis, en utilisant le champ id, vous pouvez sélectionner chaque page et mettez-la dans la sortie. Vous pouvez même utiliser des URL de la page pour spécifier le sujet que vous voulez par exemple
http://www.votresite.com/news/sujets.php?sujet=739
Et puis le script PHP Recherchera l'enregistrement avec l'id correspondant à $sujet, qui serait dans ce cas 739
Il est également possible de passer la commande par plus d'une colonne. En passant la commande par plus d'une colonne, la deuxième colonne est seulement employée si les valeurs dans la première colonne sont vérifiées :
SELECT nom_colonne(s) FROM nom_table ORDER BY colonne1 ASC|DESC, colonne2 ASC|DESC