Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PDO z mieszanymi wartosciami i parametrami
Forum PHP.pl > Forum > Przedszkole
elmozaur
Witam ponownie.
Tym razem na tapecie pojawilo sie trudniejsze zadanie. Pytanie wygenerowane w sposob tradycyjny wyglada mniej wiecej tak:
  1. $sql = "SELECT a,b,c FROM tresc WHERE kategoria = 1 OR kategoria = 2 OR kategoria = 3 AND (grupa LIKE '%slowo%' OR grupa LIKE '%slowo2%' OR grupa LIKE '%slowo3%') ORDER BY kolejnosc DESC LIMIT 0, 10";


Chcodzi o to, że mam w tym zadaniu kilka roznych danych do przekazania w zapytaniu np:
pierwszy warunek to rożne id kategorii;
drugi to AND w którym są słowa wyszukiwane metodą LIKE;
nastepnie jest ORDER po kolumnie kolejnosc;
i na końcu LIMIT.

Co mam a co chcę osiągnąć:
- kategorie mam w tablicy i moge zamienic na string ?,?,?,?,?,?,?,?,? iwstawic WHERE IN - i bedzie ok
- slowa ktore maja byc wyszukane za pomoca LIKE chyba też tak moge zrobic - ale nie wiem czy moge przekazać do execute() dwie tablice ? a dodatkowo jak to połączyć ANDem
- ORDER BY tu mam na stałe wpisane 'kolejnosc DESC' - ale czy moglbym to rozbic na 2 dodatkowe zmienne i dynamicznie podstawic do zapytania ? bind Param można do tego użyć ?
- LIMIT - no tu tez mam zagadke - gdyby zapytanie bylo proste dalbym zwykly bindValue ale poniewaz wczesniej byly uzyte ?,?,?,? to zastanawiam sie czy nie dolaczyc tego co jest za LIMIT jak 2 dodatkowe ?,? i przeslac jako 1 tablica ?

Ogólnie tak jak widze sporo jest zamieszania z tym PDO.


YourFrog
W PDO niema możliwości podpinania wartości do innych miejsc niż "where". Także na wstępie możesz zapomnieć o podpięciu nazw tabeli bądź limitów. Kolejną wadą jest brak możliwości podpinania danych w tablicy. O te wszystkie dane musisz sam zadbać. Co do zapytania. Rozumiem że wartości do "where" masz dynamicznie zmieniające się i nie zawsze one występują.

Osobiście buduję warunek "where" w tablicy, a później ją tylko imploduje z potrzebnym dla mnie operatorem. Co do order by oczywiście że możesz go sobie również zbudować. O ile się nie mylę to w zendzie standardowa ich biblioteka opiera się o SQL Builder. Możesz się na nich wzorować.

Przykład sklecony na szybkości.
  1. <?php
  2.  
  3. $category = array(1, 2, 3);
  4. $word = array("mama", "tata", "marihuana");
  5. $where = array();
  6.  
  7. if( !empty($category) )
  8. $where[] = 'category IN (' . implode(',', $category) . ')';
  9.  
  10. if( !empty($word) )
  11. {
  12. $temp = array();
  13. foreach($word as $val)
  14. $temp[] = 'grupa LIKE "%' . $val . '%"';
  15.  
  16. $where[] = '(' . implode(' OR ', $temp) . ')';
  17. }
  18.  
  19. $sql = 'SELECT
  20. *
  21. FROM
  22. table
  23. WHERE
  24. ' . implode(' AND ', $where) . '
  25. ORDER BY
  26. position ASC
  27. LIMIT
  28. 0, 10';
  29.  
  30. var_dump($sql);
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.