PHP MySQL Select : Guide Complet
Apprenez à utiliser SELECT en PHP — filtrez avec WHERE, triez avec ORDER BY, paginez avec LIMIT et récupérez les lignes avec mysqli et PDO.
SELECT est l'instruction SQL qui lit les données d'une base de données — c'est celle que vous utiliserez plus que toute autre. Ce guide couvre la syntaxe SELECT, les clauses qui façonnent vos résultats, et les deux extensions PHP (mysqli et PDO) que vous utilisez pour exécuter une requête et parcourir les lignes qu'elle retourne.
Si vous ne vous êtes pas encore connecté à une base de données, commencez par PHP MySQL Connect ; pour insérer des lignes dans une table d'abord, consultez PHP MySQL Insert.
Ce que fait l'instruction SELECT
SELECT récupère des lignes d'une ou plusieurs tables. Dans sa forme la plus simple, vous nommez les colonnes souhaitées et la table depuis laquelle les lire :
SELECT column1, column2, ...
FROM table_name;Utilisez * pour sélectionner toutes les colonnes. C'est pratique pour une exploration rapide, mais vous devriez nommer les colonnes explicitement dans le code applicatif — c'est plus rapide, rend votre intention claire, et votre code ne sera pas cassé quand quelqu'un ajoutera une colonne à la table.
-- All columns (fine for the mysql console, avoid in app code)
SELECT * FROM users;
-- Only what you need (preferred)
SELECT id, name, email FROM users;Un SELECT retourne toujours un jeu de résultats : zéro ou plusieurs lignes, chacune composée des colonnes que vous avez demandées. PHP vous fournit ce jeu de résultats sous une forme que vous pouvez parcourir.
Façonner le jeu de résultats
La forme colonnes-et-table n'est que le début. Cinq clauses vous permettent de filtrer, trier, regrouper et combiner des données. Elles doivent apparaître dans cet ordre lorsque vous en utilisez plusieurs :
| Clause | Ce qu'elle fait | Pour aller plus loin |
|---|---|---|
WHERE | Ne conserve que les lignes correspondant à une condition | MySQL WHERE |
GROUP BY | Regroupe les lignes pour les agrégats comme COUNT() | — |
HAVING | Filtre ces groupes (comme WHERE, mais pour les agrégats) | — |
ORDER BY | Trie les lignes | MySQL ORDER BY |
LIMIT | Limite le nombre de lignes retournées | MySQL LIMIT |
Filtrer avec WHERE
Retourner uniquement les utilisateurs nommés John :
SELECT name, email
FROM users
WHERE name = 'John';Trier avec ORDER BY
Trier alphabétiquement par nom. ASC est croissant (par défaut), DESC est décroissant :
SELECT name, email
FROM users
ORDER BY name ASC;Limiter les lignes avec LIMIT
Récupérer uniquement les 10 utilisateurs les plus récents — essentiel pour la pagination et pour ne pas charger un million de lignes en mémoire :
SELECT name, email
FROM users
ORDER BY created_at DESC
LIMIT 10;Joindre des tables
JOIN assemble des tables liées sur une clé commune. Ici, chaque commande est associée à l'utilisateur qui l'a passée :
SELECT users.name, orders.order_id
FROM users
JOIN orders ON users.id = orders.user_id;Exécuter un SELECT depuis PHP
Pour récupérer des données dans votre code PHP, le flux est toujours le même :
- Connectez-vous à la base de données.
- Exécutez l'instruction
SELECT. - Récupérez les lignes du jeu de résultats.
- Fermez la connexion (PHP la ferme aussi automatiquement à la fin de la requête).
Utilisez toujours des requêtes préparées pour les entrées utilisateur
Ne collez jamais une variable directement dans une chaîne de requête. Si $name provient d'un formulaire, un attaquant peut injecter du SQL et lire ou détruire toute votre base de données :
// DANGER: SQL injection. Never do this with untrusted input.
$result = $conn->query("SELECT name, email FROM users WHERE name = '$name'");Une requête préparée envoie la requête et les données séparément, de sorte que la valeur ne peut jamais être interprétée comme du SQL. C'est l'habitude la plus importante lorsqu'on lit des données fournies par l'utilisateur. Consultez MySQL Prepared Statements pour en savoir plus.
Avec mysqli
$conn = mysqli_connect("localhost", "username", "password", "database");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$stmt = $conn->prepare("SELECT name, email FROM users WHERE name = ?");
$name = "John";
$stmt->bind_param("s", $name); // "s" = the parameter is a string
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "0 results";
}
$stmt->close();
mysqli_close($conn);fetch_assoc() retourne chaque ligne sous forme de tableau associatif indexé par le nom de colonne ($row["name"]). Utilisez fetch_array() si vous voulez aussi des clés numériques, ou fetch_all(MYSQLI_ASSOC) pour récupérer toutes les lignes d'un coup dans un tableau.
Avec PDO
Pour les nouveaux projets, PDO est généralement le meilleur choix : il dispose d'une API cohérente pour MySQL, PostgreSQL, SQLite et plus encore, et ses requêtes préparées sont lisibles.
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8mb4", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE name = ?");
$stmt->execute(["John"]);
foreach ($stmt as $row) {
echo "Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}Définir PDO::ERRMODE_EXCEPTION fait que les requêtes échouées lèvent des exceptions au lieu d'échouer silencieusement — encapsulez les appels à la base de données dans des blocs try/catch pour que les problèmes remontent à la surface plutôt que de disparaître.
Erreurs courantes
num_rowsretourne des lignes, pas un booléen. Vérifiez> 0(mysqli) avant de supposer que vous avez obtenu des données.- Sélectionner
*puis lire une seule colonne transfère quand même toutes les colonnes sur le réseau. Sélectionnez uniquement ce que vous utilisez. - Oublier
LIMITsur de grandes tables peut charger d'énormes jeux de résultats en mémoire. Paginés. - La comparaison de chaînes dans
WHEREest insensible à la casse par défaut dans les collations courantes de MySQL —'john'correspond à'John'.
Conclusion
SELECT est le cheval de bataille de toute application PHP/MySQL. Nommez vos colonnes explicitement, façonnez les résultats avec WHERE, ORDER BY, LIMIT et JOIN, et utilisez toujours les entrées utilisateur via des requêtes préparées (mysqli ou PDO) pour rester protégé contre les injections SQL. À partir d'ici, apprenez à modifier les données avec MySQL Insert et MySQL Update.