Protection du code et optimisation
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:
Code:
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); |
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?
Voici le nouveau code:
Code:
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); |
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.
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).
Code:
1 2
| SELECT `ID`, `Name`, `id_1`, `proba_1`, `id_2`, `proba_2`
FROM table_1 |
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 ...
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.
Code:
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]); |
Je fait donc maintenant le code suivant:
Code:
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";
}
} |
J'ai vu ceci dans la doc sur PDO:
Citation:
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.
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 ...
Merci d'avance.