8797 sujets
Hello jo_link_noir,
C'est ce que j'ai lu également. Cependant, le mysql_real_escape_string() ou PDO::quote() couplé en amont avec un htmlspecialchars ou htmlentities devrait résoudre les problèmes d'injection.
Pareil, pas encore servit mais je crois qu'il est bon de savoir comment ça fonctionne.
Arf, ça m'a échappé. Et c'est logique puisque c'est préparé.
J'ai compris que c'est un truc du style et la précision se ferait via un masque sprintf():
Là en lisant diverses docs et en comprenant le principe, ça évite de réécrire le INSERT .... C'est pas mal ce truc. Par contre, j'ai lu qu'on ne peut pas faire deux préparations de requête en même temps. Je vais faire des tests et mettre en pratique ce que je viens de lire.
Merci en tout cas.
Modifié par Nolem (14 Dec 2009 - 23:14)

jo_link_noir a écrit :
Évite les injections sql.
C'est ce que j'ai lu également. Cependant, le mysql_real_escape_string() ou PDO::quote() couplé en amont avec un htmlspecialchars ou htmlentities devrait résoudre les problèmes d'injection.
jo_link_noir a écrit :
Je sais pas exactement comment ça marche vu que je m'en suis pas encore servit
Pareil, pas encore servit mais je crois qu'il est bon de savoir comment ça fonctionne.
jo_link_noir a écrit :
Et c'est plus rapide pour les requête exécute plusieurs fois.
Arf, ça m'a échappé. Et c'est logique puisque c'est préparé.
jo_link_noir a écrit :
mais doit y avoir moyen de préciser le type des variables
J'ai compris que c'est un truc du style et la précision se ferait via un masque sprintf():
$sql = "INSERT INTO une_table(un_champ, un_autre) VALUES (:un_champ, :un_autre)";
$preparation = Mysql->prepare($sql);
$un_champ = "une valeur";
$un_autre = "une autre valeur";
$preparation->BindParam(":un_champ",$un_champ);
$preparation->BindParam(":un_autre",$un_autre);
$preparation->execute();
$un_champ = "une valeur secondaire";
$preparation->execute();
Là en lisant diverses docs et en comprenant le principe, ça évite de réécrire le INSERT .... C'est pas mal ce truc. Par contre, j'ai lu qu'on ne peut pas faire deux préparations de requête en même temps. Je vais faire des tests et mettre en pratique ce que je viens de lire.
Merci en tout cas.
Modifié par Nolem (14 Dec 2009 - 23:14)
a écrit :
Et c'est plus rapide pour les requête exécute plusieurs fois.
Il faut faire une nuance sur le plusieurs fois qui a toute son importance : c'est vrai seulement si c'est plusieurs fois dans le même script. La connexion MySQL étant relancée à chaque début de script et les requêtes préparées étant effacés à chaque déconnexion, ça ne sert en fait pratiquement à rien en php. Par contre dans d'autres langages où la connexion est permanente, on y gagne.
QuentinC a écrit :
Et c'est plus rapide pour les requête exécute plusieurs fois.
Il faut faire une nuance sur le plusieurs fois qui a toute son importance : c'est vrai seulement si c'est plusieurs fois dans le même script. La connexion MySQL étant relancée à chaque début de script et les requêtes préparées étant effacés à chaque déconnexion, ça ne sert en fait pratiquement à rien en php. Par contre dans d'autres langages où la connexion est permanente, on y gagne.
Hello QuentinC,
Es-tu sûr de ce que tu dis ? Or dans la documentation rien est indiqué. Je pense que la requête préparée est stocké dans l'Objet pdo::statement. Également, il ne faut pas oublier que Mysql ou pdo acceptent une connexion persistante. Après réflexion, je crois que cette technique est intéressante dans pas mal de cas (ex : gestion d'une galerie, news).
Modifié par Nolem (15 Dec 2009 - 00:58)
Salut,
Il se peut que dans un même script, tu aies une boucle (genre de 5000 itérations) qui font des insertions en base de données. Donc au lieu de préparer une lourde requête à la main qui va s'exécuter en fin de boucle avec un seul INSERT et tous les enregistrements, les requêtes préparées sont alors utiles pour faire un INSERT par itération sans affecter la lourdeur du script.
QuentinC a écrit :
ça ne sert en fait pratiquement à rien en php.
Il se peut que dans un même script, tu aies une boucle (genre de 5000 itérations) qui font des insertions en base de données. Donc au lieu de préparer une lourde requête à la main qui va s'exécuter en fin de boucle avec un seul INSERT et tous les enregistrements, les requêtes préparées sont alors utiles pour faire un INSERT par itération sans affecter la lourdeur du script.
a écrit :
Il se peut que dans un même script, tu aies une boucle (genre de 5000 itérations) qui font des insertions en base de données. Donc au lieu de préparer une lourde requête à la main qui va s'exécuter en fin de boucle avec un seul INSERT et tous les enregistrements, les requêtes préparées sont alors utiles pour faire un INSERT par itération sans affecter la lourdeur du script.
En effet. Je pensais plutôt à un update dans une boucle, mais ça pourrait aussi aller avec les insert.
bon, normalement, on peut faire des insert multiples en une seule requête (remarque les update aussi, avec replace into, je ne sais pas si ça a une incidence sur les performances un replace to vs plusieurs updates)