2012-06-02 53 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

相关问题