Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] MySQL i pole DATATIME
Forum PHP.pl > Forum > PHP > Frameworki
phpmack
Witam mam banalny problem z MySQL i polem typu datatime w zasadzie sama baza i zapytania działają tak jak chce dlatego nie piszę tego w dziale MySQL, problem pojawia się przy próbie wykonania tych zapytań w zendzie. Sprawa jest dosyć banalna mam DB raporty z której chciałbym za pomocą zapytania wyciągnąć raport w zależności od osoby oraz daty dodania raportu czyli np. coś takiego:
  1. SELECT *
  2. FROM `reports`
  3. WHERE `name` = 'janek'
  4. AND `datatime` > '2011-10-22 17:48:00'

no i zapytanie to działa ale przy próbie wykonania tego w zendzie wywala mi błąd składni...
mój model:
  1. class Application_Model_DbTable_Reports extends Zend_Db_Table_Abstract
  2. {
  3.  
  4. protected $_name = 'reports';
  5. protected $_primary = 'report_id';
  6.  
  7. public function getReports($datatime, $name)
  8. {
  9. //$sql = $this->getAdapter()->quoteInto('SELECT * FROM reports WHERE datatime > ? AND name = ?', $datatime, $name);
  10. $obiekt = $this->getAdapter()->query("SELECT * FROM reports WHERE name = $name AND datatime > $datatime");
  11. $wynik = $obiekt->fetchAll();
  12.  
  13. if (!$wynik) {
  14. throw new Exception("Could not find row");
  15. }
  16. else{
  17. return $wynik;
  18. }
  19. }
  20. }


w kontrolerze wywołuje:
  1. $tab_reports = new Application_Model_DbTable_Reports();
  2. $tmp = $tab_reports->getReports($datatime, $name);
  3. print_r($tmp);


próbowałem też:
$datatime = '2011-06-24 21:55:00';
$datatime = new DateTime('2011-06-24 21:55:00');

generalnie cała ta konstrukcja działa, problem pojawił się gdy chciałem w zapytaniu użyć pola datatime nie wiem jak poprawnie zbudować zapytanie do pola datatime?

melkorm
a dlaczego korzystasz z adaptera a nie normalnie z query buildera?
Spróbuj:
  1. $this->fetchAll(
  2. $this->select()->where('name = ?', $name)->where('datatime > ?', $datatime)
  3. );


Jeszcze w razie co podaj jaki błąd Tobie wywala.

Co do Twojego kodu jeszcze, sprawdź sobie co zwraca quoteInto a co zwraca query.
skowron-line
Chyba o czymś zapomniałeś
Kod
$obiekt = $this->getAdapter()->query("SELECT * FROM reports WHERE name = $name AND datatime > $datatime");


Kod
$obiekt = $this->getAdapter()->query('SELECT * FROM reports WHERE name = $name AND datatime > "'. $datatime .'" ');


zrzuć sobie zapytanie przez echo i zobaczysz co jest nie tak.
phpmack
Tak jest zapomniałem o dodatkowym apostrofie przy $datatime już działa wink.gif
A co do adaptera to zastosowałem go z tego powodu że select() działa dobrze dopóki nie tworzymy bardziej skomplikowanych zapytań bo wtedy wywala błędy nie wiedzieć czemu i 3 dni czytam manuala zamiast kończyć projekt;) Oczywiście wynika to z mojej nie wiedzy a nie winy samego select() ale tak czy inaczej łatwiej mi skonstruować zapytanie wprost w SQL i przetestować w PhpMyAdmin.

No i o też nie przejdzie:
Kod
$this->select()->where('name = ?', $name)->where('datatime > ?', $datatime)

$datatime musi być w dodatkowym apostrofie, quoteInto() też nie pomogło trzeba było ręcznie dopisać apostrof

pozdrawiam
melkorm
Nigdy nie miałem problemów z select i apostrofami ... ewentualnie jeszcze możesz dorzucić setIntegrityCheck na false jeżeli masz problemy.

Dla jasności:
  1. var_dump($this->select()->where('name = ?', $name)->where('datatime > ?', $datatime)->__toString());


Pokaż co otrzymujesz bo nie chce mi się wierzyć że nie dodaje apostrofów wink.gif
phpmack
Heh no nie wiem czemu ale mi nie działa taki zapis dopiero coś takiego zadziałało:
  1. $obiekt->where("datatime > '$datatime'");

inaczej zapytanie zwraca pusty wynik
teraz nie wiem czemu nie działa wyświetlenia daty z zadanego przedziału:D:
  1. $obiekt->where("datatime > '$databegin'");
  2. $obiekt->where("datatime < '$dataend'");

jak wyczytałem wstawienie kilku WHERE spowoduje niejawnie dodanie AND czyli wszystkie warunki muszą być spełnione ale dostaje pusty wynik biggrin.gif
oczywiście startowa i końcowa data jest odpowiednio odległa że powinienem dostać wszystkie rekordy....

Już działa - firefox trochę broił po wylogowywaniu nie kasował danych sesji
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.