2014-01-17 105 views
0
$hostname = 'localhost'; 
$username = 'uname'; 
$password = 'password'; 
$dbName = 'events'; 
if (class_exists('PDO')){ 
    echo("PDO Exists"); 
} 
else { 
    echo("PDO Does Not Exist"); 
} 
try { 
    $pdo = new PDO("mysql:host=$hostname;dbname=$dbName", $username, $password); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(PDOException $e) { 
    $error = $e->getMessage(); 
    die($error); 
} 
$stmt = $pdo->prepare('SELECT * FROM event'); 
$stmt->execute(); 
$events = $stmt->fetchAll(PDO::FETCH_ASSOC); 
echo json_encode($events); 

輸出是爲什麼此PDO連接失敗?

PDO Exists 
Fatal error: Call to a member function prepare() on a non-object in /home/blah/getEvents.php on line 25 
+0

在您試圖實例化之後,$ pdo的var_dump會給你什麼? –

+0

var_dump($ pdo)spits object(PDO)#1(0){} – TijuanaKez

+0

這真的很奇怪。所以你有一個有效的PDO對象,但幾行後,似乎你不能調用'prepare()'。 –

回答

0

這是因爲$pdo對象未在該範圍限定。移動

$stmt = $pdo->prepare('SELECT * FROM event');$pdo變量聲明和實例化後的try語句。

,以便執行該查詢你需要調用execute方法:

$stmt->execute();

要調試這一點,你需要做一個var_dump($pdo)看到它所包含的內容。

+2

不正確。 PHP沒有像這樣的塊級別範圍。 –

+0

我敢打賭,這個答案是在正確的軌道,但。 OP可能正在執行一個他們沒有顯示的功能的準備。而PHP *不具有函數級別範圍,因此函數必須聲明'global $ pdo'或者將其作爲參數傳遞給函數。 –

+0

這不是功能。我更新了帖子以顯示php括號內的所有內容。這是一個非常簡單的文件,我不知道爲什麼它不應該工作。 – TijuanaKez

0

可能不會引發異常。啓用例外情況如下:

try { 
    $pdo = new PDO("mysql:host=$hostname;dbname=$dbName", $username, $password); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
+1

這也是我最初的想法,儘管文檔會建議不管PDO :: ATTR_ERRMODE設置如何,構造函數都會拋出PDOException。請參閱本頁中途的註釋:http://us2.php.net/manual/en/pdo.error-handling.php對於我如何不設置PDO對象而言,這是一個令人頭疼的問題構造函數拋出PDOException。我會試圖刪除try-catch塊來看看會發生什麼。 –

+0

好處,文檔確實說明了這一點。我的猜測是,我們並沒有看到所有的代碼。 – itsmejodie

+0

添加了額外的代碼行和相同的錯誤。 – TijuanaKez