oujood.com

Comment préparer des requêtes SQL en PHP

Cet article vous explique comment utiliser les fonctions prepare() et mysqli_prepare() en PHP, et vous apprenez ainsi à sécuriser vos requêtes SQL et à améliorer les performances de vos applications
Pour en savoir plus sur les requête préparées voir notre tutoriel sur : Instructions ou requêtes préparées

Définition et utilisation

Les fonctions prepare() et mysqli_prepare() sont utilisées pour préparer une requête SQL pour l'exécution. Elles permettent de sécuriser les requêtes contre les injections SQL, d'améliorer les performances et de faciliter la réutilisation des requêtes.

La syntaxe de prepare() est la suivante :

$stmt = prepare($query);

query est la chaîne de requête SQL à préparer.

La syntaxe de mysqli_prepare() est la suivante :

$stmt = mysqli_prepare($link, $query);

link est la connexion à la base de données et query est la chaîne de requête SQL à préparer.

Syntaxes orientée objet et procédurale

Les fonctions prepare() et mysqli_prepare() peuvent être utilisées de deux manières différentes :

  • Orientée objet : dans cette approche, la requête SQL est préparée à l'aide d'un objet de requête.
  • Procédurale : dans cette approche, la requête SQL est préparée à l'aide d'une fonction.

Valeurs possibles et paramètres

La valeur de retour des fonctions prepare() et mysqli_prepare() est un objet de requête ou false en cas d'erreur.

Les fonctions prepare() et mysqli_prepare() acceptent un paramètre optionnel, options, qui peut être utilisé pour spécifier les options de préparation de la requête.

Exemples pratiques

Voici un exemple d'utilisation de prepare() dans une approche orientée objet :

Exemple :       Copier le code

\n<?php\n
// Connexion à la base de données
$link = mysqli_connect("localhost", "root", "", "my_database");

// Préparation de la requête
$stmt = $link->prepare("SELECT * FROM users WHERE username = ?");

// Lier les paramètres
$stmt->bind_param("s", $username);

// Exécution de la requête
$stmt->execute();

// Récupération des résultats
$result = $stmt->get_result();

// Parcours des résultats
while ($row = $result->fetch_assoc()) {
echo $row["username"] . "\n";
}
?>

Voici un exemple d'utilisation de mysqli_prepare() dans une approche procédurale :

Exemple :       Copier le code

\n<?php\n
// Connexion à la base de données
$link = mysqli_connect("localhost", "root", "", "my_database");

// Préparation de la requête
$stmt = mysqli_prepare($link, "SELECT * FROM users WHERE username = ?");

// Lier les paramètres
mysqli_stmt_bind_param($stmt, "s", $username);

// Exécution de la requête
mysqli_stmt_execute($stmt);

// Récupération des résultats
$result = mysqli_stmt_get_result($stmt);

// Parcours des résultats
while ($row = mysqli_fetch_assoc($result)) {
echo $row["username"] . "\n";
}
?>

Cas d'utilisation pratique des fonctions prepare() et mysqli_prepare() en PHP

Voici quelques cas d'utilisation supplémentaires pour les fonctions prepare() et mysqli_prepare(), avec des exemples dans les deux approches (orientée objet et procédurale) pour chaque cas, en utilisant la base teste avec une table perso dont les champs (id, nom, prenom, email et age) et en utilisant la connexion suivante :

Exemple :       Copier le code

<?php
$seveur='localhost';
$utilisateur='root';
$motDePasse='';
$ma_base_de_données='teste';
// Connexion à la base de données
$link = mysqli_connect($seveur, $utilisateur, $motDePasse, $ma_base_de_données);
?>

Remplacer les valeurs des variables : $seveur, $utilisateur, $motDePasse et $ma_base_de_données , par vos valeurs

Remplacer aussi dans ce qui va suivre le nom de la table par votre table et les champs de votre table

Cas d'utilisation 1 : Mettre à jour des données

Dans ce cas d'utilisation, nous allons utiliser prepare() ou mysqli_prepare() pour mettre à jour des données dans la table perso dans la base de données teste.

Approche orientée objet

Exemple :       Copier le code

<?php
$seveur='localhost';
$utilisateur='root';
$motDePasse='';
$ma_base_de_données='teste';

// Connexion à la base de données
$link = mysqli_connect($seveur, $utilisateur, $motDePasse, $ma_base_de_données);

// Préparation de la requête
$stmt = $link->prepare("UPDATE perso SET nom = ?, prenom = ?, email = ?, age = ? WHERE id = ?");

// Lier les paramètres
$id = 1;
$nom = "John Doe Updated";
$prenom = "John";
$email = "john.doe@example.com";
$age = 31;
mysqli_stmt_bind_param($stmt, "ssssi", $nom, $prenom, $email, $age, $id);

// Exécution de la requête
mysqli_stmt_execute($stmt);
?>

Approche procédurale

Exemple :       Copier le code

<?php
$seveur='localhost';
$utilisateur='root';
$motDePasse='';
$ma_base_de_données='teste';

// Connexion à la base de données
$link = mysqli_connect($seveur, $utilisateur, $motDePasse, $ma_base_de_données);

// Préparation de la requête
$stmt = mysqli_prepare($link, "UPDATE perso SET nom = ?, prenom = ?, email = ?, age = ? WHERE id = ?");

// Lier les paramètres
$id = 1;
$nom = "John Doe Updated";
$prenom = "John";
$email = "john.doe@example.com";
$age = 31;
mysqli_stmt_bind_param($stmt, "ssssi", $nom, $prenom, $email, $age, $id);

// Exécution de la requête
mysqli_stmt_execute($stmt);
?>

Dans cet exemple, nous avons utilisé la fonction mysqli_stmt_bind_param() pour lier les variables id, nom, prenom, email et age aux marqueurs de paramètre ? dans la requête SQL. Cela permet d'éviter les injections SQL et d'améliorer la sécurité.

Cas d'utilisation 2: Supprimer des données

Dans cet exemple nous allons Supprimer l'eregistrement dont l'id est 10

Approche orientée objet

Exemple :       Copier le code

<?php
$seveur='localhost';
$utilisateur='root';
$motDePasse='';
$ma_base_de_données='teste';
// Connexion à la base de données
$link = mysqli_connect($seveur, $utilisateur, $motDePasse, $ma_base_de_données);

// Préparation de la requête
$stmt = $link->prepare("DELETE FROM perso WHERE id = ?");

// Lier les paramètres
$id = 1;
mysqli_stmt_bind_param($stmt, "i", $id);

// Exécution de la requête
mysqli_stmt_execute($stmt);
?>

Approche procédurale

Exemple :       Copier le code

<?php
$seveur='localhost';
$utilisateur='root';
$motDePasse='';
$ma_base_de_données='teste';
// Connexion à la base de données
$link = mysqli_connect($seveur, $utilisateur, $motDePasse, $ma_base_de_données);

// Préparation de la requête
$stmt = mysqli_prepare($link, "DELETE FROM perso WHERE id = ?");

// Lier les paramètres
$id = 10;
mysqli_stmt_bind_param($stmt, "i", $id);

// Exécution de la requête
mysqli_stmt_execute($stmt);

// Fermeture de la requête
mysqli_stmt_close($stmt);
?>

Dans cet exemple, nous avons utilisé la fonction mysqli_stmt_execute() pour exécuter la requête SQL. Une fois la requête exécutée, nous avons utilisé la fonction mysqli_stmt_close() pour fermer la requête.

Astuces et conseils d'utilisation pratique

  • Utilisez toujours les fonctions prepare() ou mysqli_prepare() pour préparer vos requêtes SQL. Cela permet de sécuriser vos applications contre les injections SQL.
  • Utilisez les paramètres de préparation pour spécifier les valeurs des variables utilisées dans vos requêtes SQL. Cela permet d'améliorer les performances et de faciliter la réutilisation des requêtes.
  • Utilisez la fonction mysqli_stmt_bind_param() pour lier les paramètres à votre requête. Cela permet d'éviter les erreurs de syntaxe et d'améliorer la sécurité.

Voir aussi nos tutoriel :

La variable globale de PHP get

La variable globale de PHP get

CSS3 couleur dégradé

Comment créer des couleurs dégradés en css3 ?

fonction strnatcmp, strnatcmp

Comparaison de chaînes avec l'algorithme d'"ordre naturel"