jakis_login
14.01.2014, 19:46:27
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:
try{
$this->dbh = new PDO('mysql:host='.HOSTNAME.';dbname='.DATABASE.';charset:UTF-8', USERNAME, PASSWORD);
}catch (PDOException $e) {
return "Error!: " . $e->getMessage();
}
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
14.01.2014, 19:50:46
Pokaż ten kod, gdzie używasz prepare
nospor
14.01.2014, 19:51:23
utf8 a nie utf-8
jakis_login
14.01.2014, 20:10:09
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
15.01.2014, 10:14:17
Ja osobiscie nie ustawiam kodowania w polaczeniu, tylko po wykonaniu polaczenia wykonuje od razu zapytanie:
set names 'utf8'
Dziala niezaleznie od hostingu
Turson
15.01.2014, 10:44:03
Po raz kolejny piszę, żebyś pokazał kod z prepare
jakis_login
15.01.2014, 19:25:38
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
<?php
define( "HOSTNAME", "localhost" ); define( "USERNAME", "login" ); define( "PASSWORD", "haslo" );
class DBH {
private $dbh;
public function __construct(){
try{
$this->dbh = new PDO('mysql:host='.HOSTNAME.';dbname='.DATABASE, USERNAME, PASSWORD);
}catch (PDOException $e) {
return "Error!: " . $e->getMessage();
}
}
public function select( $table ){
$query = $this->dbh->prepare("SELECT * FROM $table");
$query->execute( );
return $query->fetchAll( PDO::FETCH_OBJ );
}
}
$dbh = new DBH;
$query = $dbh->select('users');
foreach($query as $row)
YourFrog
15.01.2014, 19:34:01
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
15.01.2014, 20:03:37
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
15.01.2014, 20:17:21
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
15.01.2014, 20:39:38
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:
new PDO('mysql:host='.HOSTNAME.';port=3307;dbname='.DATABASE.';charset:UTF-8', USERNAME, PASSWORD);
YourFrog
15.01.2014, 20:41:12
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.