Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][pdo] Dodanie kawałka zapytania przy prepare() i bindValue()?
luis2luis
post 26.03.2020, 13:05:29
Post #1





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 25.11.2015

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


Witam.
Jestem w trakcie nauki obsługi zapytań za pomocą PDO. Posiadam pewną klase wspomagającą, która fajnie się sprawdza przy operacjach INSERT i UPDATE.

Mam problem z wykonaniem zwykłego zapytania SQL w którym doklejam ze zmiennej kawałek kodu w zależności od potrzeb.

Otrzymuje błąd, że zapytanie jest niepoprawne,:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' ORDER BY z.id DESC LIMIT 100' at line 1

  1.  
  2. $sql_kat_id = '';
  3. //NASZ DODATKOWY ELEMENT ZAPYTANIA
  4.  
  5. if (!empty($_GET['z'])) {
  6. if (is_array($_GET['z'])) {
  7.  
  8. if ( count($_GET['z']) > 1) { //jesli pare kategorii
  9. $sql_kat_id = " AND z.kat_id IN (".ltrim(implode(',',$_GET['z']),',').") ";
  10. } else { //jesli jedna kategoria
  11. $sql_kat_id = " AND z.kat_id = ".(int)trim($_GET['z'][0])." ";
  12. }
  13.  
  14. } else { //jesli jedna kategoria
  15. $sql_kat_id = " AND z.kat_id =".(int)trim($_GET['z'])." ";
  16. }
  17. }
  18.  
  19.  
  20. $pdo = new DB;
  21. $pdo->setParameters($dbhost, $dbname, $dbuser, $dbpass);
  22. $pdo->setTablePrefix($dbprefix);
  23. $pdo->setCharset($config["encoding"]);
  24.  
  25. try {
  26. $sqlQuery = "SELECT k.*, z.* FROM ".$dbprefix."blog_art z, ".$dbprefix."blog_kat k WHERE z.user_id=k.user_id AND z.active =1 :kat_id ORDER BY z.id DESC LIMIT 100;";
  27.  
  28. $stmt = DB::getInstance()->prepare($sqlQuery);
  29. $stmt->bindValue(':kat_id', $sql_kat_id, PDO::PARAM_STR);
  30. $stmt->execute();
  31. $result = $stmt->fetchAll();
  32.  
  33. print_r($result);
  34. $stmt = null;
  35.  
  36. } catch(PDOException $e) {
  37. echo $e->getMessage();
  38. }
  39.  
  40.  


Czy można w takie sposób za pomocą BindValue wklejać całe kawałki kodu, czy nie jest taki kod realizowany?

Ten post edytował luis2luis 26.03.2020, 13:06:55
Go to the top of the page
+Quote Post
nospor
post 26.03.2020, 13:07:33
Post #2





Grupa: Moderatorzy
Postów: 35 209
Pomógł: 5918
Dołączył: 27.12.2004




Bindowanie sluzy wkladaniu wartosci do zapytania a nie calych kawalkow zapytan


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
luis2luis
post 26.03.2020, 13:19:33
Post #3





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(nospor @ 26.03.2020, 13:07:33 ) *
Bindowanie sluzy wkladaniu wartosci do zapytania a nie calych kawalkow zapytan


Dobrze rozumie.

Czy poniższy zapis jest poprawny, czy jeszcze szukać innego sposobu?

  1. $sql_kat_id = '';
  2.  
  3. if (!empty($_GET['z'])) {
  4. if (is_array($_GET['z'])) {
  5.  
  6. if ( count($_GET['z']) > 1) { //jesli pare kategorii
  7. $sql_kat_id = " AND z.kat_id IN (:kat_id) ";
  8. $sql_kat_id_bind = ltrim(implode(',',$_GET['z']),',');
  9. } else { //jesli jedna kategoria
  10. $sql_kat_id = " AND z.kat_id = :kat_id ";
  11. $sql_kat_id_bind = (int)trim($_GET['z'][0]);
  12. }
  13.  
  14. } else { //jesli jedna kategoria
  15. $sql_kat_id = " AND z.kat_id=:kat_id ";
  16. $sql_kat_id_bind = (int)trim($_GET['z']);
  17. }
  18. }
  19.  
  20.  
  21. try {
  22. $sqlQuery = "SELECT k.*, z.* FROM ".$dbprefix."blog_art z, ".$dbprefix."blog_kat k WHERE z.user_id=k.user_id AND z.active =1 ".$sql_kat_id." ORDER BY z.id DESC LIMIT 100;";
  23.  
  24. $stmt = DB::getInstance()->prepare($sqlQuery);
  25. $stmt->bindValue(':kat_id', $sql_kat_id_bind, PDO::PARAM_STR);
  26. $stmt->execute();
  27. $result = $stmt->fetchAll();
  28.  
  29. print_r($result);
  30. $stmt = null;
  31.  
  32. } catch(PDOException $e) {
  33. echo $e->getMessage();
  34. }


Ten post edytował luis2luis 26.03.2020, 13:22:57
Go to the top of the page
+Quote Post
Pyton_000
post 26.03.2020, 13:48:40
Post #4





Grupa: Zarejestrowani
Postów: 7 896
Pomógł: 1386
Dołączył: 26.10.2005

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


Działa?
Go to the top of the page
+Quote Post
luis2luis
post 26.03.2020, 14:07:59
Post #5





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 25.11.2015

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


Cytat(Pyton_000 @ 26.03.2020, 13:48:40 ) *
Działa?

Narazie ułożyłem na forum, zaraz bede testował.
Go to the top of the page
+Quote Post
viking
post 26.03.2020, 14:21:39
Post #6





Grupa: Zarejestrowani
Postów: 5 560
Pomógł: 948
Dołączył: 30.08.2006

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


Oczywiście że ci nie zadziała bo bindujesz cały ciąg 1,2,3 zamiast poszczególnych wartości.
https://prophp.pl/advice/show/15/jak_skasow...ola_checkbox%3F


--------------------
Go to the top of the page
+Quote Post
luis2luis
post 26.03.2020, 14:43:46
Post #7





Grupa: Zarejestrowani
Postów: 131
Pomógł: 0
Dołączył: 25.11.2015

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


W sumie po to się się binduje , żeby nie wklejać ze zmiennej dodatkowy kod smile.gif i zabezpieczenie usuwa potencjalnie niebezpieczny kod, czyli taki co może wpłynąć na wygląd zapytania.

Mój drugi kod, który podałem działa. Czyli najpierw zmienną wklejam części kodu a później binduje konkretną wartość.
Go to the top of the page
+Quote Post
nospor
post 26.03.2020, 16:06:30
Post #8





Grupa: Moderatorzy
Postów: 35 209
Pomógł: 5918
Dołączył: 27.12.2004




Cytat
Mój drugi kod, który podałem działa

A testowales to dla kilku kategorii czy zawsze tylko dla jednej? wink.gif

Inna sprawa ze w takim przypadku jak tutaj nie ma sensu sie bawic w zadne bindowanie. Masz zwykle liczby do wlozenia wiec rzutujesz na INT kazda po kolei i wkldasz normalnie do zapytania jako tekst


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kreatiff
post 26.03.2020, 17:30:32
Post #9





Grupa: Zarejestrowani
Postów: 289
Pomógł: 97
Dołączył: 7.08.2012

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


  1. ' AND z.kat_id IN (' . str_repeat('?,', count($_GET['z']) - 1) . '?)';
  2. // nic już nie bindujesz
  3. $stmt->execute($_GET['z']); // zakładam, że $_GET['z'] jest zwalidowane


Ten post edytował kreatiff 26.03.2020, 17:30:51
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: 5.04.2020 - 01:43