Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PDO::prepare(), bindValue(), a tworzenie zapytania w pętli
Piotrbaz
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 2
Dołączył: 15.09.2012

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


Witajcie, mam nietypowy (chyba) problem (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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

Ten post edytował Piotrbaz 9.03.2013, 12:54:25
Go to the top of the page
+Quote Post
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Ale może dać :keyword i bindować

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

o ile dobrze zrozumiałem problem.
Go to the top of the page
+Quote Post
Piotrbaz
post
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 2
Dołączył: 15.09.2012

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


Hm nie bardzo wiem, gdzie umieścić taką 'konstrukcję'. Możesz rozwinąć razem z bindowaniem ? (IMG:style_emoticons/default/tongue.gif) Może być na ogólnym przykładzie.
Go to the top of the page
+Quote Post
Damonsson
post
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


To znaczy?

Jaką konstrukcję?

  1. $sth = $dbh->prepare('SELECT * FROM fruit WHERE colour = :colour');
  2. $sth->bindValue(':colour', '%'.$colour.'%');
  3. $sth->execute();


Ten post edytował Damonsson 9.03.2013, 16:05:56
Go to the top of the page
+Quote Post
Piotrbaz
post
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 2
Dołączył: 15.09.2012

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


A spoko (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.

Ten post edytował Piotrbaz 9.03.2013, 16:24:47
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 10:18