oujood.com

PHP MySQL Order By : Comment récupérer et ordonner les données d'une base de données MySQL

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.

chercher |

Base de données MySQL Order By:

Sélectionner et ordonner des données avec MySQLi

Ordre par une colonne

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

  Copier le code

<!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>

Sélection et tri des données avec PDO + instructions préparées

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)

  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";

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>

Classer par ordre des données

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.

Plus d’utilisation de $num et ORDER by

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.

Sélection d'un enregistrement unique

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

Ordre par deux colonnes


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


Par carabde 20 Aout 2014



Voir aussi nos tutoriel :

Nouveaux types input

Nouveaux types input

fonction strtolower, strtolower

Renvoie une chaîne en minuscules

fonction strrev, strrev

Inverse une chaîne