query
exécute une instruction SQL standard et vous oblige à échapper correctement toutes les données pour éviter les injections SQL et d'autres problèmes.
execute
exécute une instruction préparée qui vous permet de lier des paramètres pour éviter d'avoir à échapper ou à citer les paramètres. execute
fonctionnera également mieux si vous répétez une requête plusieurs fois. Exemple d'instructions préparées:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories);
$sth->bindParam(':colour', $colour);
$sth->execute();
// $calories or $color do not need to be escaped or quoted since the
// data is separated from the query
La meilleure pratique est de s'en tenir aux déclarations préparées et execute
pour une sécurité accrue .
Voir aussi: Les instructions préparées PDO sont-elles suffisantes pour empêcher l'injection SQL?
: calories
est-ce que cela équivautmysql_real_escape_string()
à arrêter les injections ou avez-vous besoin de plus que simplement$sth->bindParam(':calories', $calories);
pour renforcer la sécurité?query
retourne- t-il un PDOStatement , au lieu d'un booléen commeexecute
?Non, ce ne sont pas les mêmes. En plus de l'échappement côté client qu'il fournit, une instruction préparée est compilée une fois côté serveur, puis peut recevoir différents paramètres à chaque exécution. Ce qui signifie que vous pouvez faire:
Ils vous apporteront généralement une amélioration des performances, bien que cela ne soit pas perceptible à petite échelle. En savoir plus sur les instructions préparées (version MySQL) .
la source
La réponse de Gilean est excellente, mais je voulais juste ajouter qu'il existe parfois de rares exceptions aux meilleures pratiques, et vous voudrez peut-être tester votre environnement dans les deux sens pour voir ce qui fonctionnera le mieux.
Dans un cas, j'ai trouvé que cela
query
fonctionnait plus rapidement pour mes besoins car je transférais en masse des données de confiance à partir d'une machine Ubuntu Linux exécutant PHP7 avec le pilote Microsoft ODBC mal pris en charge pour MS SQL Server .Je suis arrivé à cette question parce que j'avais un script de longue durée pour un ETL que j'essayais de presser pour la vitesse. Cela m'a semblé intuitif qui
query
pourrait être plus rapide queprepare
&execute
parce qu'il n'appelait qu'une seule fonction au lieu de deux. L'opération de liaison de paramètres offre une excellente protection, mais elle peut être coûteuse et peut-être évitée si elle n'est pas nécessaire.Compte tenu de quelques conditions rares :
Si vous ne pouvez pas réutiliser une instruction préparée car elle n'est pas prise en charge par le pilote ODBC Microsoft .
Si vous ne vous inquiétez pas de la désinfection des entrées, une simple évacuation est acceptable. Cela peut être le cas car la liaison de certains types de données n'est pas prise en charge par le pilote ODBC Microsoft .
PDO::lastInsertId
n'est pas pris en charge par le pilote ODBC Microsoft.Voici une méthode que j'ai utilisée pour tester mon environnement, et j'espère que vous pourrez le reproduire ou quelque chose de mieux dans le vôtre:
Pour commencer, j'ai créé une table de base dans Microsoft SQL Server
Et maintenant, un test chronométré de base pour les mesures de performance.
J'ai joué avec plusieurs essais et comptages différents dans mon environnement spécifique, et j'obtiens constamment des résultats 20 à 30% plus rapides avec
query
queprepare
/execute
Je suis curieux de voir comment ce test se compare dans d'autres environnements, comme MySQL.
la source