Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO queryString z bindami
Forum PHP.pl > Forum > PHP
Siner
Chciałem sobie zrobić mini-profiler w klasie opartej o PDO.
A dokładniej to chodzi mi o to, że metoda queryString przy wykorzystaniu z pdo::prepare zwraca zapytanie w takiej postaci: "DELETE FROM test WHERE id IN(?, ?)"
Chciałbym zrobić żeby podane w tablicy argumenty do zapytania były zamienione ze znakami '?' w kolejności, czyli tak to by wyglądało: "DELETE FROM test WHERE id IN(4, 5)";
Kombinowałem trochę na najprostszym sposobem tego rozwiązania np:
  1. <?php
  2. $s = "DELETE FROM test WHERE id IN(?, ?)";
  3. $binds = array(4, 5);
  4. echo str_ireplace ('?' , array_shift(&$binds) , $s);
  5. ?>

co oczywiście nie działa winksmiley.jpg I się zastanawiam czy da się to uzyskać w kilku linijkach bez tworzenia pętli i przewijania zapytania po kolei po wszystkich argumentach do zamiany?
zaksmok
można:
  1. <?
  2. $ids = array('4', '3', '5', '6');
  3. $idsString = implode(', ', $ids);
  4. $s =  "DELETE FROM test WHERE id IN($idsString)";
  5. ?>
Zyx
Podpinanie parametrów pod zapytanie jest realizowane przez PDO jedynie w sytuacji, kiedy baza danych nie obsługuje takiego rozwiązania. W pozostałych przypadkach rola PDO ogranicza się jedynie do wysłania zestawu danych oraz szkieletu zapytania do serwera i to on zajmuje się resztą. W ogóle operacja podpinania to coś więcej, niż zwykłe sklejenie wyjściowego zapytania z tablicy, dlatego też z PDO takiej informacji nie uzyskasz i musisz sobie sam posklejać wynik zwykłymi operacjami na tekście.

zaksmok -> a co Twoje "rozwiązanie" ma wspólnego z PDO?
SongoQ
Cytat(Zyx @ 8.02.2009, 13:56:20 ) *
Podpinanie parametrów pod zapytanie jest realizowane przez PDO jedynie w sytuacji, kiedy baza danych nie obsługuje takiego rozwiązania


Chyba odwrotnie
jarek_bolo
Nie odwrotnie.
Zapytywanie bazy przy użyciu bindowania jeśli baza to wspiera jest efektywniejsze.
Więc PDO jeśli tylko baza wspiera tworzenie bindowanych zapytań nie robi tego po stronie PHP.
SongoQ
No tak tak. Czytajac tego posta za 1 razem zrozumialem zupelnie cos odwrotnie tongue.gif. Przepraszam za wprowadzenie w blad.
Siner
Ok dzięki za wyjaśnienie. Napisałem kawałek kodu który działa, ale może macie jakiś inny pomysł na zamianę znaku "?" w stringu na kolejne elementy tablicy.
Moje rozwiązanie.
  1. <?php
  2. $queryString = $stmt->queryString;
  3.            foreach ($binds as $bind) {
  4.                $queryString = preg_replace('/?/', "$bind", $queryString, 1);
  5.            }
  6. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.