2012-06-02 73 views
1

我有一個使用的功能:調用一個成員函數準備()非對象與PDO

require_once("connect.php"); 

function get_username($uid){ 
    $stmt = $pdo->prepare("SELECT username FROM users WHERE uid= ?"); 

try { 
    $stmt->execute(array($uid)); 
} catch (PDOException $e) { 
    echo $e -> getMessage(); exit; 
} 

     $row = $stmt->fetch(); 
     return($row['username']); 
} 

$id = 1; 
echo get_username($id); 

但它說:

Call to a member function prepare() on a non-object 

我有點糊塗上這是什麼意思,我錯了,我想知道是否因爲我在函數中使用它?

編輯:

我的連接script¬

$dsn = 'mysql:dbname=test_db;host=127.0.0.1'; 
$user = 'test_user'; 
$password = 'test_pass'; 

try { 
    $pdo = new PDO($dsn, $user, $password); 

} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
    exit; 
} 

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

error_reporting(E_ALL); 
session_start(); 
+0

首先創建$的對象傳遞$pdo pdo然後用,就這麼簡單 –

回答

6

是的,這是因爲你在函數中調用它。 $pdo處於全局範圍內,並且不在函數的範圍內。

您也需要在函數引用它作爲一個全局變量來訪問$pdo全球:

function get_username($uid){ 
    global $pdo; 
    $stmt = $pdo->prepare("SELECT username FROM users WHERE uid= ?"); 

或者當你調用函數

function get_username($uid, $pdo){ 

... 
... 
} 

get_username($id, $pdo); 
+0

哪一個是最佳選擇? – Sir

+3

最好的選擇是第二個,這是依賴注入的非OOP方法。 – nickb

+0

好的 - 謝謝你的建議! :)當它允許我時,將打勾你的答案! – Sir

相關問題