Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO::prepare(), bindValue(), a tworzenie zapytania w pętli
Forum PHP.pl > Forum > PHP > Object-oriented programming
Piotrbaz
Witajcie, mam nietypowy (chyba) problem wink.gif

W swoim modelu mam funkcję do obsługi wyszukiwarki, która przyjmuje tablicę słów do wyszukania w bazie. W całym modelu używam PDO i funkcji prepare() oraz execute() więc chciałbym również i w tym przypadku je zastosować, ponieważ zależy mi na bindValue().

Problem w tym, że zapytanie SELECT konstruuję w taki sposób:

  1. public function getSearchedData(array $keywords_array){
  2.  
  3. $where = null;
  4. $total_keywords = count($keywords_array); //ilosc slow wpisanych w szukajke
  5.  
  6. //pętla foreach do konstrukcji warunku(ów) WHERE
  7. foreach($keywords_array as $key => $keyword){
  8.  
  9. $where .= "((ads_advertisement.title LIKE '%$keyword%')
  10. OR (ads_advertisement.description LIKE '%$keyword%')
  11. OR (ads_advertisement.content LIKE '%$keyword%'))"; // szukam po title, description i content
  12.  
  13. if($key !== ($total_keywords - 1)){
  14.  
  15. $where .= " AND "; // jesli było więcej niż jedno słowo, dodaję AND i zabawa od początku
  16.  
  17. }
  18. }
  19.  
  20. $query = "SELECT (...) WHERE $where"; //ogólna konstrukcja zapytania SELECT
  21.  
  22.  
  23. $result = $this->db->prepare($query);
  24. $this->select_Ads($result); // w funkcji select_Ads jest między innymi $result->execute();
  25.  
  26. return $this->ads;
  27.  
  28. }
  29.  
  30.  


Mam nadzieję, że do tej pory wszystko jasne. Teraz chciałbym dla $keyword zastosować bindValue(), żeby mi jakiś życzliwy hakier nie próbował zrobić zastrzyku.
No i mam problem. Bo w miejsce '%$keyword%' nie mogę dać '%:keyword%'. I jestem w kropce tongue.gif Mogę oczywiście dać PDO::quote() albo zwykłe addslashes() dla $keyword, ale jak już używam PDO::prepare(), to dobrze by było przy tym zostać w każdej funkcji modelu.


Pozdrawiam
Damonsson
Ale może dać :keyword i bindować

'keyword' => '%'.$keyword.'%'

o ile dobrze zrozumiałem problem.
Piotrbaz
Hm nie bardzo wiem, gdzie umieścić taką 'konstrukcję'. Możesz rozwinąć razem z bindowaniem ? tongue.gif Może być na ogólnym przykładzie.
Damonsson
To znaczy?

Jaką konstrukcję?

  1. $sth = $dbh->prepare('SELECT * FROM fruit WHERE colour = :colour');
  2. $sth->bindValue(':colour', '%'.$colour.'%');
  3. $sth->execute();
Piotrbaz
A spoko wink.gif Nie wiedziałem, że mogę jako drugi argument bindValue() podać cokolwiek innego niż samą zmienną. I że mogę się odwołać do $keyword spoza foreach snitch.gif


  1. foreach($keywords_array as $key => $keyword){
  2. $where .= "((ads_advertisement.title LIKE :keyword) OR (ads_advertisement.description LIKE :keyword) OR (ads_advertisement.content LIKE :keyword))";
  3. (...)
  4. }
  5.  
  6. (...)
  7. $result->bindValue(':keyword', '%'.$keyword.'%', PDO::PARAM_STR);
  8.  


Seems legit. Dzięki.
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.