info2gestion

Accueil

PHP

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

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

Test requête

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

Cet exemple montre une requête simple non sécurisée. 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.



<?php

$f_lettre_frm = htmlspecialchars($_POST['fletter']); // 1

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

include_once('config_conn.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

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

$sql = "SELECT col1, col2, col3 
        FROM bdd_table 
        WHERE col1 LIKE '$f_lettre'";

$results = mysqli_query($conn, $sql); // 8

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

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

echo "<table style = 'border:1px solid black;' border = 1>";

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

mysqli_free_result($results); // 12

}
?>

1 Variable php POST du formulaire avec la fonction htmlspecialchars() normalement utilisée sur des saisies utilisateurs. Pour cette page, il s'agit d'une sélection de valeurs dans un menu déroulant. Par précaution, la fonction php diminue le risque d'un détournement des données du formulaire et le risque d'une vulnérabilité par injection sql.

2 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

3 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 Variable qui sera utilisée en paramètre dans la clause WHERE de la requête

8 Exécution de la requête avec mysqli_query()

9 Fonction d'affichage éventuel d'erreur si la requête n'affiche pas de résultats avec trigger_error(mysqli_error(), E_USER_ERROR) et mysqli_error() en paramètre

10 Fermeture de la connexion avec la fonction mysqli_close()

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

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


Pour l'exemple ci-dessus, le script ne propose pas de mesures de sécurité contre notamment les attaques par injection sql. C'est notamment le cas si l'utilisateur peut saisir du texte dans l'url ou dans l'un des champs du formulaire.

Une de ces mesures est l'utilisation de requêtes préparées ou paramétrées.

Cet exemple, peut servir pour comprendre des scripts anciens et les faire évoluer vers des requêtes préparées en procédural ou objet.

Le script de cet exemple a été testé mais le script qui s'applique utilise des requêtes préparées pour les raisons de sécurité évoquées.