Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PDO] zapytanie SELECT a bindowanie
--piotr--
post
Post #1





Goście







Uczac sie PDO trafilem na problem.
Otóz chce zadac zapytanie przez prepare/execute typu:

SELECT * WHERE id = :id AND kolumna = :kolumna

i teraz bindujac obie wartosci wszystko jest cacy.
Kiedy warunki w zapytaniu chce generowac dynamicznie pojawia się problem.
Załózmy ze w zaleznosci od innych zmiennych potrzebuje do powyzszego zapytania dodac kolejny warunek:

SELECT * WHERE id = :id AND kolumna = :kolumna AND filtr = 1

Z mysql_query robilem to sklejając zapytanie w php.
W pdo jest problem, poniewaz powyzsze zapytanie w takiej formie ( tzn. kolumna filtr ma stala wartosc '1') nie wykonuje się poprawnie. Jest na to jakis sposob?
Go to the top of the page
+Quote Post
Turson
post
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Nikt nie broni ci tego skleić
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To moze pokaz jaki masz teraz kod, jak generujesz te zapytanie, bo ciezko teraz jest wywrozyc co zrobiles źle.... Zbliza sie weekend i wrozki poleciały na łysą góre


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
-Gość-
post
Post #4





Goście







Podałem dokładnie jaki problem się pojawia. Przy doklejeniu do zapytania warunku ' AND filtr = 1' <-- dokładnie w takiej formie, baza odpowiada mi tak jakby całkowicie w warunku nie była uwzględniona kolumna filtr, (czyli zwraca dane z filtr = 2, 3, 5 itp)
Rozumiem ze takie zapytanie w prepare jest poprawne?

SELECT * WHERE id = :id AND kolumna = :kolumna AND filtr = 1

Czyli ze nie wszystkie kolumny musze bindowac?

W jaki sposób zrobić jeszcze jeżeli dynamicznie dopisany warunek tez chce bindowac? Dodatkowe IF w ktorych sa bindValue ? Bo jezeli binduje po :serial a tego :serial nie ma to wywala błąd.
Go to the top of the page
+Quote Post
Turson
post
Post #5





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Nie trzeba bindować wszystkich. Jak bindować dodatkowy
SELECT * WHERE warunek = :wartosc
->bindValue(':wartosc', $jakaśZmienna)
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Musisz dynamicznie zbudować zapytanie oraz listę parametrów dla niego:
  1. $sql = 'SELECT * WHERE id = :id AND kolumna = :kolumna';
  2. $params = [
  3. ':id' => 123,
  4. ':kolumna' => 'Ala ma kota'
  5. ];
  6.  
  7. if (...) {
  8. $sql .= ' AND filtr = 1';
  9. }
  10.  
  11. if (...) {
  12. $sql .= ' AND some_column = :some_column';
  13. $params[':some_column'] = 'DEF';
  14. }
  15.  
  16. $stmt = $pdo->prepare($sql);
  17. $stmt->execute($params);
Go to the top of the page
+Quote Post
-Gość-
post
Post #7





Goście







Dzieki Crozin - nie wiedziałem, ze można bindowac przez execude. Tylko nie widze jak zbindowac po INT albo STR tak jak jest w bindValue?
Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


PDOStatement::execute traktuje wszystkie parametry jako stringi. Jeżeli chciałbyś jednak móc dokładnie określić co jest przesyłane, musiałbyś to trochę rozbudować, do czegoś mniej-więcej takiego:
  1. $params['...'] = ['123', PDO::PARAM_STR];
  2. $params['...'] = [123, PDO::PARAM_INT];
  3.  
  4. // ...
  5.  
  6. $stmt = $pdo->prepare($sql);
  7.  
  8. foreach ($params as $key => $param) {
  9. $stmt->bindValue($key, $param[0], $param[1]);
  10. }
  11.  
  12. $stmt->execute();
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 Aktualny czas: 19.08.2025 - 19:39