2013-05-05 3 views
10

laisser les références à un objet PDO égal PDO et non itself-- AOPDifférence entre PDO-> query() et PDO-> exec()

Je vois here qu'il est à la fois PDO->query() et PDO->exec(). Dans la page qui a été liée, il apparaît que PDO->query(); est utilisé pour SELECT instructions SEULEMENT, et PDO->exec() est utilisé pour UPDATE, INSERT, DELETE instructions. Maintenant, je suis tout nouveau à PDO, donc je ne sais pas ce qui se passe en termes d'utilisation tout à fait encore, donc j'apprécierais une explication sur la façon d'utiliser les différentes méthodes, et pourquoi il existe différentes méthodes.

Répondre

19

En dépit de toute différence théorique, aucune de ces fonctions ne devrait être utilisée de toute façon - il n'y a donc rien à craindre. La seule raison d'utiliser PDO est support pour les instructions préparées, mais aucune de ces fonctions ne l'offre. Donc, ils ne devraient pas être utilisés.

Utilisez prepare()/execute() à la place, en particulier pour les instructions UPDATE, INSERT, DELETE.

Veuillez noter que bien que les déclarations préparées soient largement annoncées comme mesure de sécurité, ce n'est que pour attirer l'attention des gens. Mais leur but réel est mise en forme appropriée requête. Ce qui vous donne aussi de la sécurité - comme une requête correctement formatée ne peut pas être injectée - tout comme un effet secondaire. Mais encore une fois - le formatage est un objectif principal, juste parce que même des données innocentes peuvent provoquer une erreur de requête si elles ne sont pas formatées correctement.

EDIT: S'il vous plaît noter que execute() ne renvoie que TRUE ou FALSE pour indiquer le succès de l'opération. Pour d'autres informations, telles que le nombre d'enregistrements affectés par un UPDATE, des méthodes telles que rowCount() sont fournies. Voir le docs.

+1

C'est vrai, je viens de le lire dans la page que je suis en train de lire. Merci pour votre contribution aussi. Est-ce que je ne devrais pas préparer et exécuter seulement être utilisé quand j'ai affaire à des variables (entrée de l'utilisateur), et pas quand je saisis des informations pour moi-même qui ne dépend pas de quoi que ce soit mis dans n'importe quelle entrée? Encore merci pour votre contribution. :) –

+1

Les instructions préparées ne sont pas pour "n'importe quel type d'entrée". Ils sont pour exécuter des requêtes correctement, peu importe si vous les exécutez pour vous-même ou pour quelqu'un d'autre. C'est une question de formatage des requêtes, pas de sécurité. –

+0

ah, d'accord. Désolé, je n'ai pas encore été aussi loin. Merci pour l'explication! –

13

Regardez le official docs for PDO:

  • PDO::exec() - « Exécuter une instruction SQL et retourne le nombre de lignes affectées »
  • PDO::query() - « Exécute une instruction SQL, retourne un jeu de résultats en tant qu'objet PDOStatement »

Les deux fonctions exécutent la requête, mais exec() renvoie uniquement le nombre de lignes affectées. Ceci est utile pour une requête UPDATE où rien d'utile n'est retourné et il est seulement utile de savoir si le nombre correct de lignes a été modifié.