Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO] zapytanie SELECT a bindowanie
Forum PHP.pl > Forum > Przedszkole
-piotr-
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?
Turson
Nikt nie broni ci tego skleić
nospor
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
Gość
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.
Turson
Nie trzeba bindować wszystkich. Jak bindować dodatkowy
SELECT * WHERE warunek = :wartosc
->bindValue(':wartosc', $jakaśZmienna)
Crozin
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ść
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?
Crozin
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();
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.