Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]problem z pdo
Forum PHP.pl > Forum > Przedszkole
jakis_login
Witam
Mam problem z połączenie się do bazy. Wywala mi błąd: Call to a member function prepare().
Mój kod połączenia to:
  1. try{
  2. $this->dbh = new PDO('mysql:host='.HOSTNAME.';dbname='.DATABASE.';charset:UTF-8', USERNAME, PASSWORD);
  3. }catch (PDOException $e) {
  4. return "Error!: " . $e->getMessage();
  5. }


hosting mam na nazwa.pl, jak skopiowałem na home.pl to działa bez problemów na moim localu też działa jeśli usunę charset:UTF-8 a na nazwa.pl nie chce ruszyć, dane do bazy mam dobrze wpisane - sprawdzałem już 100 razy. Doczytałem, że to może być coś z kodowaniem mimo że błąd na to nie wskazuje ale co konkretnie trzeba zrobić to nie wiem. usuwałem już to charset... i dodawałem różne ale nie pomaga. pomocy.
Turson
Pokaż ten kod, gdzie używasz prepare
nospor
utf8 a nie utf-8
jakis_login
nie pomaga ani utf-8 ani utf8.
Jak skopiuje wszystko i kod i baze na home.pl to śmiga aż miło a wystarczy ze podepnę baze z nazwa.pl to już się sypie - dane są dobre do bazy wpisane na pewno.
nospor
Ja osobiscie nie ustawiam kodowania w polaczeniu, tylko po wykonaniu polaczenia wykonuje od razu zapytanie:
set names 'utf8'
Dziala niezaleznie od hostingu
Turson
Po raz kolejny piszę, żebyś pokazał kod z prepare
jakis_login
Proszę bardzo poniżej kod ( kod działa na home.pl a nie działa na nazwa.pl ) - usunełem nawet kodowanie i nic. Na nazwa.pl zwraca błąd: Call to a member function prepare() on a non-object

  1. <?php
  2.  
  3. define( "HOSTNAME", "localhost" );
  4. define( "DATABASE", "baza" );
  5. define( "USERNAME", "login" );
  6. define( "PASSWORD", "haslo" );
  7.  
  8.  
  9. class DBH {
  10.  
  11. private $dbh;
  12.  
  13. public function __construct(){
  14. try{
  15. $this->dbh = new PDO('mysql:host='.HOSTNAME.';dbname='.DATABASE, USERNAME, PASSWORD);
  16. }catch (PDOException $e) {
  17. return "Error!: " . $e->getMessage();
  18. }
  19. }
  20.  
  21.  
  22.  
  23. public function select( $table ){
  24.  
  25. $query = $this->dbh->prepare("SELECT * FROM $table");
  26. $query->execute( );
  27.  
  28. return $query->fetchAll( PDO::FETCH_OBJ );
  29. }
  30. }
  31.  
  32. $dbh = new DBH;
  33.  
  34. $query = $dbh->select('users');
  35. foreach($query as $row)
  36. echo $row->id.'<br />';
YourFrog
Skopiowałem do ciebie. Podpiełem (byłem pewny że nie mam bazy danych na serwerze). I bum. Kod w konstruktorze przeszedł ;P dopiero później zauważyłem tam "return".

Może kilka faktów:
1. Kontruktor nie zwraca wartości.
2. Jak złapałeś wyjątek to nigdzie nie odnotowałeś brak utworzenia obiektu. Później odwołujesz się do null'a no i masz błąd,
3. Tworzenie obiektu robimy poprzez wywołanie konsturktora. Dla php to taka magiczna METODA, a więc i nawiasy okrągłe piszemy "new DBH()".
jakis_login
Człowieku założę się, że kod w kostruktorze Ci nie przeszedł! Zamiast return wstaw sobie tam echo a zobaczysz. Nigdy nie używałem nawiasów tam gdzie nie musiałem i działało bez problemów.
YourFrog
Oczywiście siedzę wieczorami przed komputerem i nie mam co robić tylko cię okłamywać ;P
Widzisz ty nie używasz i dajesz returny w konstruktorze i masz problemy. Ja nie daję i nawiasów używam zawsze, a problemów nie mam. No to faktycznie twój sposób programowania jest lepszy !

Posłuchaj. Dałeś return'a i konstruktor skończył się wykonywać po czym z niego wyszło. To nie oznacza że kod się dalej nie wykonał. Wykonuje się on i odwołuje się później do null'a w "$this->dbh". Co za tym idzie wali ci błędem. Proste prawda ?
jakis_login
Zawsze używałem tej klasy do łączenia się z bazą i było ok.
Tak czy owak problem już rozwiązałem. Dla potomnych: Coś takiego ja nazwa.pl przy połączeniu pdo wymaga aby port był wpisywany oddzielnie czyli:
  1. new PDO('mysql:host='.HOSTNAME.';port=3307;dbname='.DATABASE.';charset:UTF-8', USERNAME, PASSWORD);
YourFrog
Super że rozwiązałeś. A czekaj albo i nie rozwiazałeś. Jedynie zamaskowałeś problem naprawiając to co ci napisałem w 1 moim poście....

Tam masz błąd i uświadom to sobie bo będziesz dziurawe aplikacje pisał...
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.