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.