Lors de l' *pas* utiliser les requêtes préparées?

Je suis re-engineering PHP driven web site qui utilise un minimum de base de données. La version originale utilisés "pseudo-préparé-états" (fonctions PHP qui ne citant et le paramètre de remplacement) pour éviter les attaques par injection et à la base de données distincte de la logique à partir de la page logique.

Il semblait naturel pour remplacer ces fonctions ad-hoc avec un objet qui utilise PDO et réel déclarations préparées à l'avance, mais après avoir fait ma lecture sur eux, je ne suis pas si sûr. AOP semble encore comme une grande idée, mais l'un des principaux points de vente de déclarations préparées à l'avance, c'est de pouvoir les réutiliser... je ne le sera jamais. Voici ma configuration:

  • Les états sont tous trivialement simple. La plupart sont dans la forme SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1. Le plus complexe de la déclaration dans le lot est tout simplement trois sélectionne réunis avec UNION ALLs.
  • Chaque page frappé exécute au plus une déclaration et l'exécute qu'une seule fois.
  • Je suis dans un environnement hébergé, et donc réticent à l'idée de le claquement de leurs serveurs en faisant une "stress tests" personnellement.

Donné que l'utilisation des requêtes préparées seront, au minimum, doubler le nombre de base de données allers-retours, je suis en train de faire, suis-je mieux de les éviter? Puis-je utiliser PDO::MYSQL_ATTR_DIRECT_QUERY pour éviter la surcharge de plusieurs voyages de base de données, tout en conservant le bénéfice de paramétrisation et l'injection de la défense? Ou de faire les appels binaires utilisés par l'instruction préparée API effectuer assez bien par rapport à l'exécution de non-requêtes préparées que je ne devrais pas m'en inquiéter?

EDIT:

Merci pour tous ces bons conseils, des gens. C'est celui où je souhaite que je pourrais cocher plus d'une réponse comme "accepté" — beaucoup de points de vue différents. En fin de compte, cependant, je dois donner rick son dû... sans sa réponse, j'aurais béatement parti et fait l'complètement Mauvaise Chose, même après suivantes de chacun des conseils. 🙂

Émulé déclarations préparées à l'avance, il est!

  • Attention: AOP émulé préparées sont vulnérables à l'injection SQL si le jeu de caractères est modifiée lors de l'exécution. Voir cette réponse et cette réponse pour une explication.
  • C'est simple: Si vous savez que la chaîne vient de votre demande et ne peut pas être manipulé par un utilisateur, il n'est pas nécessaire pour les déclarations préparées à l'avance, car il n'y a rien à injecter. Si vous n'êtes pas sûr (mauvais, mais en plus de projets non évitables) l'utilisation de l'instruction préparée.
InformationsquelleAutor Ben Blank | 2009-02-11