Bonjour,
J'ai regardé quelques tuto comme http://fmaz.developpez.com/tutoriels...omprendre-pdo/
Voici l'ancienne version de ma 1ère requête SQL de ma page PHP:
J'ai eu un peu de mal à sortir la variable de la requête (pour le bindValue) mais j'ai réussi. Avec les symbole "%" cela ne me trouvait aucun résultat. Il semble qu'on ne peut pas avoir les "%" dans la requête. Savez-vous pourquoi?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $post_name = trim($_POST['name']); $prep = $database->prepare("SELECT `ID`, `Name` FROM table_1 WHERE `Name` LIKE \"%".$post_name."%\" ORDER BY `Name` ASC LIMIT 0, 10;"); $prep->execute(); $num_rows = $prep->rowCount(); $result = $prep->fetch(PDO::FETCH_ASSOC);
Voici le nouveau code:
Reste-t-il quelque chose à faire pour ne pas avoir de problème de sécurité? L'injection SQL me fait peur mais apparemment l'api PDO (avec le prepare bien utilisé) permet d'éviter ces problèmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 $post_name = trim($_POST['name']); $prep = $database->prepare("SELECT `ID`, `Name` FROM table_1 WHERE `Name` LIKE :name ORDER BY `Name` ASC LIMIT 0, 10;"); $prep->bindValue(':name', "%".$post_name."%", PDO::PARAM_STR); $prep->execute(); $num_rows = $prep->rowCount(); $result = $prep->fetch(PDO::FETCH_ASSOC);
S'il y a plusieurs résultats dans la 1ère requête, j'affiche une liste des résultats. S'il n'y en a qu'un seul, je refais la requête en récupérant plus de résultats comme dans la requête suivante (il y a 32 id et proba en tout).
J'avais pensé que c'était une bonne idée quand la 1ère requête renvoie trop de résultat. Mais je me demande si ce ne serais pas mieux de le faire dès le début ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT `ID`, `Name`, `id_1`, `proba_1`, `id_2`, `proba_2` FROM table_1
Ensuite je regarde les "proba_x" et s'ils sont différents de "0" je passe une requête pour récupérer les noms associés dans une autre table. J'avais testé avec quelque chose comme le code suivant mais sans succès : il me manquait quelques résultats. J'avais peut être faire une erreur ou alors la requête était trop longue ? J'aurais ensuite associé la proba et le nom via du code php.
Je fait donc maintenant le code suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $prep = $database->prepare("SELECT `ID`, `Name` FROM table_2 WHERE `ID` = ".$result_base[$id_1]." OR `ID` = ".$result_base[$id_2]);
J'ai vu ceci dans la doc sur PDO:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $prep = $database->prepare("SELECT `ID`, `Name` FROM table_2 WHERE `ID` = :id"); for ($i = 1; $i <= 32; $i++) { $id_search = "id_".$i; $proba_search = "proba_".$i; if ( $result_base[$proba_search] != 0 ) { $prep->bindValue(':id', $result_base[$id_search], PDO::PARAM_INT); $prep->execute(); $result_nom = $prep->fetch(PDO::FETCH_ASSOC); echo round($result_base[$proba_search]*100, 2)."% : ".$result_nom['Name']."<br />\r\n"; } }
Est-ce donc gênant de remplacer une requête sql (donc un seul parcourt de la table) et du code php par 32 requête sql? Pour le moment, ça ne me plait pas trop ...Outre le fait que vos paramètres sont bien protégés, l'avantage initial des requêtes préparées est la réutilisation du moule de la requête. En effet, le SGBD à déjà effectué une partie du traitement sur la requête. Il est donc possible de ré-exécuter la requête avec de nouvelles valeurs, sans pour autant devoir reprendre le traitement du départ; le découpage et l'interprétation ont déjà été fait !
...
Dans ce type de cas de figure qui oblige souvent l'exécution de requêtes dans des boucles, les requêtes préparées représentent une optimisation à ne pas négliger.
Merci d'avance.
Partager