-piotr-
6.06.2014, 11:49:53
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
6.06.2014, 11:52:18
Nikt nie broni ci tego skleić
nospor
6.06.2014, 11:52:33
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
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
6.06.2014, 12:06:47
Nie trzeba bindować wszystkich. Jak bindować dodatkowy
SELECT * WHERE warunek = :wartosc
->bindValue(':wartosc', $jakaśZmienna)
Crozin
6.06.2014, 12:37:05
Musisz dynamicznie zbudować zapytanie oraz listę parametrów dla niego:
$sql = 'SELECT * WHERE id = :id AND kolumna = :kolumna';
$params = [
':id' => 123,
':kolumna' => 'Ala ma kota'
];
if (...) {
$sql .= ' AND filtr = 1';
}
if (...) {
$sql .= ' AND some_column = :some_column';
$params[':some_column'] = 'DEF';
}
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
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
6.06.2014, 13:32:12
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:
$params['...'] = ['123', PDO::PARAM_STR];
$params['...'] = [123, PDO::PARAM_INT];
// ...
$stmt = $pdo->prepare($sql);
foreach ($params as $key => $param) {
$stmt->bindValue($key, $param[0], $param[1]);
}
$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.