Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO] Dlaczego query zamiast obiektu zwraca mi boolean
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
Witam.
Zmieniam strukturę swojego CMS-a dostosowywując go do PDO.
Niestety przy wykonaniu:
  1. <?php
  2. $query = 'SELECT COUNT(n_id) AS count FROM `news` WHERE `lang`=''.USER_LANG.''';
  3. $result = $this->db->query($query);
  4. $row = $result->fetch(DB::FETCH_ASSOC);
  5. ?>

Pojawia się komunikat:
Fatal error: Call to a member function fetch() on a non-object in
Dodałem linijkę echo gettype($result);
żeby sprawdzić co zwraca mi zapytanie okazało się że wartość boolowską.
Już nie sprawdzałem ale jest to zapewne fałsz.
Dziwi mnie to bo zapytanie (po uprzednim wykonaniu echo $query) działa dobrze w PhpMyAdmin.
Co jest grane ?

Drugą sprawą jest to że chciałbym wiedzieć jak metoda query() zwraca obiekt klasy PDOStatement ?
Generalnie to chodzi o to jak w ogóle metoda zwracać może obiekt.
Prosiłbym o przykład bo zdaje się że z PDO będę miał więcej udręki niż pociechy i będę musiał poprawić swoją poprzednią klasę do obsługi połączeń z bazą danych. ( poza tym zdaje się nie będę mógł dodać do metody query() zliczania ilości zapytań co też mnie frustruje ) Bardzo bym prosił o szybką odpowiedź.
Kicok
Dopisz sobie jeszcze kod, który wyświetli błąd zwrócony przez bazę danych w przypadku błędnego zapytania. Ja z tym przypadku stawiam na alias: count.
"count" jest słowem kluczowym, więc jeśli chcesz go użyć jako nazwy kolumny/tabeli/aliasu to musisz umieścić go w odwróconych apostforach `count` (Przynajmniej dla bazy danych MySQL. W MSSQL będą to nawiasy kwadratowe: [count] a w przypadku innych baz sam nie wiem co ;] )
starach
Ale ja chce pobrać ilość reordów z bazy właśnie przy pomocy słowa kluczowego count tongue.gif co widać aha nie widać bo nie podałem tutaj zapytania. Przepraszam, mea kulpa. $query = 'SELECT COUNT(n_id) AS count FROM `news` WHERE `lang`=\''.USER_LANG.'\'';
Jabol
chodzi o część
  1. AS count
zamień to na np:
  1. AS newscount
albo na:
  1. AS `count`
Sedziwoj
lub na :
  1. AS "count"

(PG)

ale lepiej nie używać słów kluczowych, wtedy przy zmianie bazy nie trzeba będzie poprawiać "ciapków"

P.S. chyba nie ma to wiele wspólnego z obiktowością...
starach
Ale ze mnie 'ciapek'.
Nie zwróciłem uwagi na to ... swoją drogą wie ktoś dlaczego przy wysyłaniu zapytania przez mysqli_query wszystko jest ej oł kej, a przez PDO::query() odwala mu ? Poprawiłem już właściwie swoją własną klasę (tylko 5 godzin roboty) ona mi przynajmniej przez wyjątek od razu wywala że zapytanie jest niepoprawne tongue.gif
Ludvik
Cytat
Drugą sprawą jest to że chciałbym wiedzieć jak metoda query() zwraca obiekt klasy PDOStatement ?
Generalnie to chodzi o to jak w ogóle metoda zwracać może obiekt.
Prosiłbym o przykład bo zdaje się że z PDO będę miał więcej udręki niż pociechy i będę musiał poprawić swoją poprzednią klasę do obsługi połączeń z bazą danych. ( poza tym zdaje się nie będę mógł dodać do metody query() zliczania ilości zapytań co też mnie frustruje ) Bardzo bym prosił o szybką odpowiedź.

Metoda może zwracać cokolwiek, obiekty także. Tworzysz obiekt, zwracasz referencję. Jak chcesz zrobić licznik zapytań, to po prostu stwórz klasę dziedziczącą po PDO i nadpisz metodę query, zapisując licznik (zwracając uwagę na nieudane zapytania...).
starach
Cytat
Metoda może zwracać cokolwiek, obiekty także.
Tak wiem sprawdziłem po tym jak to napisałem tongue.gif
Cytat
Jak chcesz zrobić licznik zapytań, to po prostu stwórz klasę dziedziczącą po PDO i nadpisz metodę query, zapisując licznik
Nie podoba mi się pomysł dziedziczenia po klasie której struktury nie mogę sprawdzić.
Ludvik
Cytat
Nie podoba mi się pomysł dziedziczenia po klasie której struktury nie mogę sprawdzić.

Na pewno będzie to wygodniejsze i mnie pracochłonne niż wkomponowanie instancji obiektu PDO w inny. Poza tym nie widzę nic złego w dziedziczeniu z klasy, której nie znamy wewnętrznej struktury. Przecież wystarczy interfejs, żeby dołożyć warstwę kontroli na wywoływaną metodę.
Sedziwoj
Do tego to jest chyba jedne z ważniejszych założeń programowania obiektowego, hermetyzacja. Wiedząc jaki ma interfejs możesz już korzystać. (kłopoty są czasem jak jest kiepski opis, lub to co korzystamy ma jakieś błędy)
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.