info2gestion

MENU3

Accueil>

PHP

MySqli requête préparée select en pop - exemple

Test avec base de données d'adjectif anglais français

Test requête

Exemple de fichier de requête avec php mysqli (procédural)

Cet exemple montre une requête simple avec une sécurité contre les principales attaques par injection sql.

Les requêtes préparées (prepared statement ou prepared query en anglais) ou requêtes paramétrées utilisent des balises ou marqueurs à l'intérieur du texte de la requête. Ces balises ou marqueurs empêchent une utilisation détournée des formulaires web connectés à une base de données pour modifier les requêtes envoyées au serveur.

L'utilisation des requêtes préparées devraient être appliquées par défault aux bases de données relationnelles qui sont hébergées sur un serveur web.

Cette requête test avec des mots anglais français à titre d'exemple une connexion mysqli en procédural. La traduction est approximative, il s'agit d'un exemple de gestion de données.

Pour cet exemple, le paramètre passé dans la requête est la lettre sélectionnée par l'utilisateur dans le formulaire.


 <?php

$f_lettre_frm = $_POST['fletter']; 1

if (empty($f_letter)) {
  die("Sélection lettre requise"); // 2
}

include_once('config_glob.php'); // 3

$conn = mysqli_connect(SVR_IP, UTILISATEUR, MOTDEPASSE); // 4

if(mysqli_connect_errno()) { // 5
  exit("<p>Echec de la connexion: (" . mysqli_connect_errno() . ")</p>");
} else {
  echo "<p>Paramètres de connection à la base de données valides</p>";
}

mysqli_select_db($conn, "bdd_01"); // 6

$sql = "SELECT col1, col2, col3 
        FROM bdd_table 
        WHERE col1 LIKE ?"; // 7

$stmt = mysqli_prepare($conn, $sql); // 8
mysqli_stmt_bind_param($stmt, 's', $f_letterB); // 9

$f_lettre = $f_lettre_frm.'%'; // 10

mysqli_stmt_execute($stmt); // 11

$results = mysqli_stmt_get_result($stmt); // 12

if (!$results){
  //trigger_error(mysqli_error($conn), E_USER_ERROR);// 13
}

if (isset($conn)){
  mysqli_close($conn); // 14
}

echo "<table style = 'border:1px solid black;' border = 1>";
$ligne = ""; // 15

while($row = mysqli_fetch_array($results)){  // 16
  $ligne .= "<tr>";
  $ligne .= "<td>" . $row['Adjectif masculin fr'] . "</td>";
  $ligne .= "<td>" . $row['Adj féminin fr'] . "</td>";
  $ligne .= "<td>" . $row['Adj anglais'] . "</td>";
  $ligne .= "</tr>";
  echo $ligne;
}
echo "</table>";

mysqli_free_result($results); // 17

?>
  

1 Lecture de la sélection de la lettre dans la page web qui est transférée à php par javascript de manière asynchrone (la page ne recharge pas). Des exemples sur ces techniques et les alternatives (avec jquery notamment) seront publiés sur la partie développement javascript

2 Fin du script si la condition de sélection n'est pas remplie

3 - 5 Voir les étapes de connection

6 Sélection de la base de données avec mysqli_select_db()

7 Définition de la requête avec un ? pour servir de balise au(x) variable(s) de la requête préparée (voir 11)

8 Envoi de la requête au serveur de la base de données avec la fonction prepare() et création de la variable $stmt

9 Les variables en paramètre sont rattachées à la variable $stmt avec mysqli_stmt_bind_param(). Cette instruction peut évoluer selon le type et le nombre de paramètres. Il y a 4 types de paramètres (i pour les nombres entiers, d pour les nombres décimaux, s pour le texte et pour des formats binaire).

Le type de paramètre s peut s'appliquer en remplacement des autres types. Le nombre de paramètre est déterminé en fonction du nombre de type déclarés, par exemple sss = 3 paramètres de type texte.

10 A cette étape, les variables en paramètre peuvent être changées et la requête exécutée autant de fois que les variables changent.

11 Exécution de la requête préparée mysqli_stmt_execute()

12 Copie des données de la requête avec mysqli_stmt_get_result()

13 Libération de la mémoire qui contient les donnnées avec mysqli_free_result()

14 Fermeture de la connexion avec la fonction mysqli_close()

15 Variable pour l'affichage html

16 Affichage des données avec une boucle while et mysqli_fetch_array()

17 Libération de la mémoire qui contient les donnnées avec mysqli_free_result()


info site

date de modification:

octobre 2023