Wiem, że PDO nie obsługuje wielu zapytań wykonywanych w jednej instrukcji. Szukałem w Google i znalazłem kilka postów dotyczących PDO_MYSQL i PDO_MYSQLND.
PDO_MySQL jest bardziej niebezpieczną aplikacją niż jakiekolwiek inne tradycyjne aplikacje MySQL. Tradycyjny MySQL dopuszcza tylko jedno zapytanie SQL. W PDO_MySQL nie ma takiego ograniczenia, ale istnieje ryzyko wstrzyknięcia wielu zapytań.
Od: Protection against SQL Injection using PDO and Zend Framework (czerwiec 2010; Julian)
Wygląda na to, że PDO_MYSQL i PDO_MYSQLND zapewniają obsługę wielu zapytań, ale nie jestem w stanie znaleźć więcej informacji na ich temat. Czy te projekty zostały przerwane? Czy jest teraz jakikolwiek sposób na uruchamianie wielu zapytań przy użyciu PDO.
Odpowiedzi:
Jak wiem,
PDO_MYSQLND
zastąpionyPDO_MYSQL
w PHP 5.3. Mylące jest to, że imię wciąż jestPDO_MYSQL
. Teraz ND jest domyślnym sterownikiem MySQL + PDO.Ogólnie rzecz biorąc, aby wykonać wiele zapytań jednocześnie, potrzebujesz:
PDO::ATTR_EMULATE_PREPARES
jest ustawione na1
(domyślne). Alternatywnie możesz uniknąć używania przygotowanych wyciągów i używać ich$pdo->exec
bezpośrednio.Korzystanie z exec
Korzystanie z instrukcji
Notka:
Korzystając z emulowanych przygotowanych instrukcji, upewnij się, że ustawiłeś odpowiednie kodowanie (odzwierciedlające faktyczne kodowanie danych) w DSN (dostępne od 5.3.6). W przeciwnym razie może wystąpić niewielka możliwość wstrzyknięcia kodu SQL, jeśli zostanie użyte dziwne kodowanie .
źródło
Po pół dnia bawiąc się tym, okazało się, że PDO ma błąd, w którym ...
-
-
-
Wykona
"valid-stmt1;"
, zatrzyma się"non-sense;"
i nigdy nie zgłosi błędu. Nie uruchomię"valid-stmt3;"
, powróci prawda i kłamie, że wszystko poszło dobrze.Spodziewałbym się, że wystąpi błąd,
"non-sense;"
ale tak się nie dzieje.Oto gdzie znalazłem te informacje: Nieprawidłowe zapytanie PDO nie zwraca błędu
Oto błąd: https://bugs.php.net/bug.php?id=61613
Więc próbowałem to zrobić z mysqli i tak naprawdę nie znalazłem żadnej solidnej odpowiedzi na temat tego, jak to działa, więc pomyślałem, że zostawię to tutaj dla tych, którzy chcą go używać.
źródło
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
bez dwóch poprzednich plików exec? Mogę sprawić, że wyrzuci błędy w środku, ale nie podczas wykonywania po pomyślnym wykonaniu .$pdo->exec("")
są od siebie niezależne. Teraz podzielę je, aby wskazać, że nie muszą być ułożone w kolejności, aby pojawił się problem. Te 3 to 3 konfiguracje uruchamiania wielu zapytań w jednej instrukcji exec.exec
na stronie, ale jeśli uruchomię wieleexec
z wieloma instrukcjami SQL w nich, wtedy odtwarzam tutaj ten sam błąd. Ale jeśli to jedynaexec
strona, to nie mogę jej odtworzyć.exec
na twojej stronie zawierało wiele stwierdzeń?Szybkie i brudne podejście:
Dzieli się w rozsądnych punktach końcowych instrukcji SQL. Nie ma kontroli błędów, nie ma ochrony wtrysku. Zrozum swoje zastosowanie przed użyciem. Osobiście używam go do wysyłania surowych plików migracyjnych do testów integracyjnych.
źródło
;
przypadku przerw, jeśli SQL zawiera definicje procedur lub wyzwalaczy ... powody, dla których to nie jest dobre.Podobnie jak tysiące ludzi, szukam tego pytania:
Mogę uruchomić wiele zapytań jednocześnie, a jeśli byłby jeden błąd, żaden nie byłby uruchomiony Wszedłem na tę stronę wszędzie
Ale chociaż znajomi tutaj udzielili dobrych odpowiedzi, te odpowiedzi nie były dobre dla mój problem
Więc napisałem funkcję, która działa dobrze i prawie nie ma problemu z wtryskiem sql.
Może to być pomocne dla tych, którzy szukają podobnych pytań, więc umieściłem je tutaj do wykorzystania
do użytku (przykład):
i moje połączenie:
Uwaga:
To rozwiązanie ułatwia uruchamianie wielu instrukcji jednocześnie.
Jeśli wystąpi niepoprawna instrukcja, nie zostanie wykonana żadna inna instrukcja
źródło
Wypróbowałem następujący kod
Następnie
I dostał
Jeśli zostanie dodany
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
po$db = ...
Potem dostałem pustą stronę
Jeśli zamiast tego
SELECT
spróbowanoDELETE
, w obu przypadkach pojawił się błąd, taki jakWięc mój wniosek, że żaden zastrzyk nie jest możliwy ...
źródło
but you risk to be injected with multiple queries.
Moja odpowiedź dotyczy zastrzykuWypróbuj tę funkcję: mltiple queries i wstawianie wielu wartości.
źródło
ChNP to obsługuje (od 2020 r.). Po prostu wykonaj wywołanie query () na obiekcie PDO jak zwykle, oddzielając zapytania; a następnie nextRowset (), aby przejść do następnego wyniku SELECT, jeśli masz wiele. Zestawy wyników będą w tej samej kolejności co zapytania. Oczywiście pomyśl o implikacjach dla bezpieczeństwa - więc nie akceptuj zapytań dostarczonych przez użytkownika, używaj parametrów itp. Używam go na przykład do zapytań generowanych przez kod.
źródło