2017-02-15 2 views
3

Ich benutze PHP und MySQL mit PDO. Manchmal muss ich eine Anweisung mit einer Variablen (Platzhalter) vorbereiten, die mehrmals in dieser Abfrage verwendet wird.Warum PDO mehrere Platzhalter mit demselben Namen nicht zulassen?

Beispiel:

SELECT * FROM messages WHERE from_id = :user OR to_id = :user 

Allerdings, wenn ich versuche, diese Aussage bereite ich einen Fehler haben, damit ich dies wie dies in einer Weise tun müssen, um:

SELECT * FROM messages WHERE from_id = :user1 OR to_id = :user2 

diese Aussage zu nennen, Ich brauche ein Array wie folgt:

array('user1'=>$user_id, 'user2'=>$user_id); 

Es sieht so dumm für mich! Warum erlaubt mir MySQL (PDO?) Nicht, einen Platzhalter mehr als einmal zu verwenden und mich dazu zu zwingen, zusätzliche Variablen zu verwenden, die mehr Kontrolle erfordern ?!

Dies kann einfach gehandhabt werden, wenn die Abfrage relativ einfach ist (wie ich oben gepostet habe), aber jetzt habe ich eine Abfrage mit 5 (!!!) Verwendungen der einzelnen Variablen erstellt. Jedes Mal, wenn ich den Platzhalter hinzufüge, muss ich den Code an vielen Stellen überprüfen, um es in Ordnung zu bringen.

Gibt es eine Einstellung oder eine Optimierung, um dies zu umgehen?

Antwort

6

Gibt es eine Einstellung oder eine Optimierung, um dies zu umgehen?

Ja, gibt es. You can turn emulation mode ON und können denselben Platzhalter mehrmals verwenden.

So wird das beschriebene Verhalten nur beobachtet, wenn die Emulation ausgeschaltet ist. Ich verstehe nicht wirklich, warum es so ist, aber hier ist eine Erklärung von Wez Furlong (der Autor der PDO):

Die Änderung wurde aus zwei Gründen vorgenommen; In erster Linie, wenn Sie die gleiche Variable in einer Bindung wiederverwenden, ist es möglich, einen Absturz zu verursachen, wenn Sie einige Treiber verwenden. Es ist nicht möglich zu garantieren, das Richtige zu tun, und eine Möglichkeit, einen Absturz auszulösen, kann manchmal als ein Angriffsvektor für einen Sicherheits-Exploit verwendet werden.

Der zweite Grund ist der Portabilität. Einige Treiber würden diese Überprüfung intern durchführen und einen Fehler ausgeben. Wenn Sie mit den Treibern codieren, die dies nicht erzwingen, funktioniert Ihr Code nicht bei denen, die dies nicht tun.

http://paul-m-jones.com/archives/243#comment-740

+0

Danke, YCS! Ich sollte besser emulieren verwenden, da es für vorbereitende Anweisungen langsamer ausgeführt werden sollte. Recht? –

+0

Nun, der Emulationsmodus ist eigentlich * schneller *, aber ich würde nicht sagen, dass der Unterschied signifikant ist. Der Link oben ist zu meinem Artikel, wo ich alle Vor-und Nachteile für die jeder Modus –

+0

Faster diskutieren ?! Wow, unerwartete Sache ... In diesem Fall werde ich gehen und eine Lesung darüber finden ... Danke! –

Verwandte Themen