Ich weiß, dass PDO nicht mehrere Abfragen unterstützt, die in einer Anweisung ausgeführt werden. Ich habe googelt und einige Beiträge gefunden, die über PDO_MYSQL und PDO_MYSQLND sprechen.
PDO_MySQL ist eine gefährlichere Anwendung als alle anderen herkömmlichen MySQL-Anwendungen. Herkömmliches MySQL erlaubt nur eine einzige SQL-Abfrage. In PDO_MySQL gibt es keine solche Einschränkung, aber Sie riskieren, mit mehreren Abfragen injiziert zu werden.
Von: Schutz vor SQL-Injection mit PDO und Zend Framework (Juni 2010; von Julian)
Es scheint, dass PDO_MYSQL und PDO_MYSQLND Unterstützung für mehrere Abfragen bieten, aber ich kann keine weiteren Informationen darüber finden. Wurden diese Projekte eingestellt? Gibt es jetzt eine Möglichkeit, mehrere Abfragen mit PDO auszuführen?
Antworten:
Wie ich weiß,
PDO_MYSQLND
ersetztPDO_MYSQL
in PHP 5.3. Verwirrender Teil ist, dass der Name immer noch istPDO_MYSQL
. Jetzt ist ND der Standardtreiber für MySQL + PDO.Um mehrere Abfragen gleichzeitig ausführen zu können, benötigen Sie Folgendes:
PDO::ATTR_EMULATE_PREPARES
, dass1
(Standard) eingestellt ist. Alternativ können Sie die Verwendung vorbereiteter Anweisungen vermeiden und$pdo->exec
direkt verwenden.Mit exec
Anweisungen verwenden
Eine Notiz:
Stellen Sie bei der Verwendung emulierter vorbereiteter Anweisungen sicher, dass Sie im DSN (verfügbar seit 5.3.6) die richtige Codierung festgelegt haben (die die tatsächliche Datencodierung widerspiegelt). Andernfalls besteht möglicherweise eine geringfügige Möglichkeit für die SQL-Injection, wenn eine ungerade Codierung verwendet wird .
quelle
Nachdem ich einen halben Tag damit herumgespielt hatte, stellte ich fest, dass PDO einen Fehler hatte, bei dem ...
- -
- -
- -
Es würde das ausführen
"valid-stmt1;"
, anhalten"non-sense;"
und niemals einen Fehler auslösen. Wird das nicht laufen lassen"valid-stmt3;"
, wahr zurückgeben und lügen, dass alles gut gelaufen ist.Ich würde erwarten, dass es auf dem fehlerhaft ist,
"non-sense;"
aber es tut es nicht.Hier habe ich diese Informationen gefunden: Eine ungültige PDO-Abfrage gibt keinen Fehler zurück
Hier ist der Fehler: https://bugs.php.net/bug.php?id=61613
Also habe ich versucht, dies mit mysqli zu tun und habe keine wirklich solide Antwort darauf gefunden, wie es funktioniert. Deshalb dachte ich, ich lasse es einfach hier für diejenigen, die es verwenden möchten.
quelle
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
ohne die beiden vorherigen Execs ausführen ? Ich kann es dazu bringen , Fehler in die Mitte zu werfen, aber nicht, wenn es nach erfolgreicher Ausführung ausgeführt wird .$pdo->exec("")
sind unabhängig voneinander. Ich habe sie jetzt aufgeteilt, um anzuzeigen, dass sie nicht in einer Reihenfolge vorliegen müssen, damit das Problem auftritt. Diese 3 sind 3 Konfigurationen zum Ausführen mehrerer Abfragen in einer exec-Anweisung.exec
auf der Seite ist. Wenn ich jedoch mehrere mitexec
jeweils mehreren SQL-Anweisungen ausführe , reproduziere ich hier denselben Fehler. Aber wenn es das einzigeexec
auf der Seite ist, kann ich es nicht reproduzieren.exec
auf Ihrer Seite mehrere Aussagen?Ein schneller und schmutziger Ansatz:
Teilt an angemessenen Endpunkten der SQL-Anweisung. Es gibt keine Fehlerprüfung, keinen Einspritzschutz. Verstehen Sie Ihre Verwendung, bevor Sie es verwenden. Persönlich verwende ich es zum Seeding von Rohmigrationsdateien für Integrationstests.
quelle
;
Pausen, wenn Ihr SQL Prozedur- oder Triggerdefinitionen enthält ... Viele Gründe, warum es nicht gut ist.Wie Tausende von Menschen suche ich nach dieser Frage:
Kann mehrere Abfragen gleichzeitig ausführen, und wenn es einen Fehler gäbe, würde keiner ausgeführt. Ich bin überall auf diese Seite gegangen.
Aber obwohl die Freunde hier gute Antworten gaben, waren diese Antworten nicht gut für Mein Problem
Also habe ich eine Funktion geschrieben, die gut funktioniert und fast kein Problem mit SQL Injection hat.
Es könnte für diejenigen hilfreich sein, die nach ähnlichen Fragen suchen, deshalb habe ich sie hier verwendet
zur Verwendung (Beispiel):
und meine Verbindung:
Hinweis: Mit
dieser Lösung können Sie mehrere Anweisungen zusammen
ausführen. Wenn eine falsche Anweisung auftritt, wird keine andere Anweisung ausgeführt
quelle
Versuchte folgenden Code
Dann
Und bekam
Wenn
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
nach hinzugefügt$db = ...
Dann bekam leere Seite
Wenn stattdessen
SELECT
versuchtDELETE
, dann bekam in beiden Fällen Fehler wieAlso meine Schlussfolgerung, dass keine Injektion möglich ist ...
quelle
but you risk to be injected with multiple queries.
Meine Antwort ist über InjektionProbieren Sie diese Funktion aus: mehrere Abfragen und das Einfügen mehrerer Werte.
quelle
Die gU unterstützt dies (ab 2020). Führen Sie einfach wie gewohnt einen query () -Aufruf für ein PDO-Objekt aus und trennen Sie die Abfragen durch; und dann nextRowset (), um zum nächsten SELECT-Ergebnis zu gelangen, wenn Sie mehrere haben. Die Ergebnismengen werden in derselben Reihenfolge wie die Abfragen angezeigt. Denken Sie natürlich über die Auswirkungen auf die Sicherheit nach - akzeptieren Sie also keine vom Benutzer bereitgestellten Abfragen, verwenden Sie Parameter usw. Ich verwende sie beispielsweise bei Abfragen, die durch Code generiert werden.
quelle