Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PDO queryString z bindami
Siner
post 7.02.2009, 14:58:28
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 6
Dołączył: 2.01.2004

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
zaksmok
post 8.02.2009, 12:54:29
Post #2





Grupa: Zarejestrowani
Postów: 58
Pomógł: 2
Dołączył: 12.01.2006

Ostrzeżenie: (0%)
-----


można:
  1. <?
  2. $ids = array('4', '3', '5', '6');
  3. $idsString = implode(', ', $ids);
  4. $s =  "DELETE FROM test WHERE id IN($idsString)";
  5. ?>


Ten post edytował zaksmok 8.02.2009, 12:56:18
Go to the top of the page
+Quote Post
Zyx
post 8.02.2009, 13:56:20
Post #3





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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?


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
SongoQ
post 9.02.2009, 11:07:07
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
jarek_bolo
post 9.02.2009, 14:05:17
Post #5





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

Ostrzeżenie: (0%)
-----


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.


--------------------
"Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! |
Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!!
Go to the top of the page
+Quote Post
SongoQ
post 9.02.2009, 15:19:29
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


No tak tak. Czytajac tego posta za 1 razem zrozumialem zupelnie cos odwrotnie tongue.gif. Przepraszam za wprowadzenie w blad.


--------------------
Go to the top of the page
+Quote Post
Siner
post 10.02.2009, 03:00:20
Post #7





Grupa: Zarejestrowani
Postów: 159
Pomógł: 6
Dołączył: 2.01.2004

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 16:58