Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]PDO z mieszanymi wartosciami i parametrami
elmozaur
post 15.01.2014, 13:51:17
Post #1





Grupa: Zarejestrowani
Postów: 518
Pomógł: 18
Dołączył: 21.07.2008

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


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.


Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
YourFrog
post 15.01.2014, 20:09:30
Post #2





Grupa: Zarejestrowani
Postów: 124
Pomógł: 22
Dołączył: 10.01.2014

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


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);


Ten post edytował YourFrog 15.01.2014, 20:11:15
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 09:46