Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF]Dynamieczne zapytanie
Forum PHP.pl > Forum > PHP > Frameworki
JakubBab
Czesc,


Napisalem skrypt ktory ma automatycznie pobierac dane po wybraniu przez usera parametro wna podstawie nazwy akcji itp itd.

Chcialbym dynamicznie pobierac dane ale za kazdym razem wyrzucami blad sql i zastanawiam jak moge inaczej ugryzc problem.
Na moje oko to skrypt przetwarza "doslownie" to co zostalo napisane z tad "->".

Jakies sugestie?


  1. <?php
  2.  
  3. class My_Database_Queries_jacketQuery {
  4.  
  5. private $params = [];
  6.  
  7. public function __construct($params) {
  8.  
  9. $this->params[] = $params;
  10. echo "<pre>";
  11. print_r($this->loadResults());
  12. echo "</pre>";
  13. }
  14.  
  15. public function loadResults() {
  16. # $db = new Application_Model_DbTable_Jacket();
  17. $adapter = Zend_Db_Table::getDefaultAdapter();
  18. $select = new Zend_Db_Select($adapter);
  19.  
  20. $select->from('jacket', array('product_id'));
  21.  
  22. $joinInner = "";
  23. foreach ($this->params[0] as $key => $val) {
  24.  
  25. $joinInner.= "->join inner('product_" . $key . "', 'product_id' = 'product_" . $key . "." . $key . "_id')" . "</br>";
  26. foreach ($val as $k => $v) {
  27. $temp [] = 'product_' . $key . '.' . $v . ' = 1';
  28. }
  29. }
  30. $query[] = implode(" or ", $temp);
  31. $joinInner.="->where('" . $query[0] . "')";
  32. $select.=$joinInner;
  33.  
  34. $result = $adapter->fetchAll($select);
  35.  
  36. return $result;
  37. }
  38.  
  39. }


Taki blad

Message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '->join inner('product_color', 'product_id' = 'product_color.color_id')
->joi' at line 1, query was: SELECT `jacket`.`product_id` FROM `jacket`->join inner('product_color', 'product_id' = 'product_color.color_id')
->join inner('product_size', 'product_id' = 'product_size.size_id')
->where('product_color. black = 1 or product_size.large = 1')

Na moje oko to skrypt przetwarza "doslownie" to co zostalo napisane z tad "->".
nospor
Nom, doslowanie, bo niby czemu mialby tego nie robic skoro mu doslownie to napisales.... -> i takie tam robi sie na obiektach a nie w srodku tekstu. Zajrzyj do przykladow

I jeszcze ten br w srodku zapytania... Co ty chciales osiagnac?
JakubBab
Wczesniej nie robilem takich zapytan w zf wiec kombinuje na wszystkie sposoby.
nospor
Ale tu nie ma co kombinowac... Jak wejdziesz w specyfikacje to tam masz cala mase przykladow jak to sie robi.
JakubBab
Nie wiem o jaka specyfikacje Ci chodzi bo manuala i przyklady czytalem/czytam i tego nie znalazlem.

Poprawiony, dzialajcy:

  1. <?php
  2.  
  3. class My_Database_Queries_jacketQuery {
  4.  
  5. private $params = [];
  6.  
  7. public function __construct($params) {
  8.  
  9. $this->params[] = $params;
  10. echo "<pre>";
  11. print_r($this->loadResults());
  12. echo "</pre>";
  13. }
  14.  
  15. public function loadResults() {
  16.  
  17.  
  18. $where = "";
  19. $joinInner = "";
  20.  
  21.  
  22. $adapter = Zend_Db_Table::getDefaultAdapter();
  23. $select = new Zend_Db_Select($adapter);
  24.  
  25. $select->from('jacket', array('product_id'));
  26.  
  27. foreach ($this->params[0] as $key => $val) {
  28.  
  29.  
  30. $select->joinInner('product_' . $key, 'product_id = product_' . $key . "." . $key . '_id', array());
  31.  
  32.  
  33. foreach ($val as $k => $v) {
  34. $temp [] = 'product_' . $key . '.' . $v . ' = 1';
  35. }
  36. }
  37.  
  38.  
  39. $query[] = implode(" or ", $temp);
  40.  
  41. $select->where($query[0]);
  42.  
  43.  
  44. $result = $adapter->fetchAll($select);
  45.  
  46. return $result;
  47. }
  48.  
  49. }
nospor
Cytat
Nie wiem o jaka specyfikacje Ci chodzi bo manuala i przyklady czytalem/czytam i tego nie znalazlem.
No skoro uzywasz Zend Framework to rzecz jasna ze mowilem o specyfikacji Zend Framework....
http://framework.zend.com/manual/1.12/en/zend.db.html
Moze zamiast brac sie za kody, wpierw zabierz sie za ogarniecie troche calej otoczki, jak co uzywasz i gdzie masz dokumentacje do tego.
JakubBab
Cytat(nospor @ 20.04.2016, 15:55:54 ) *
Moze zamiast brac sie za kody, wpierw zabierz sie za ogarniecie troche calej otoczki, jak co uzywasz i gdzie masz dokumentacje do tego.



facepalmxd.gif
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.