2010-12-06 131 views
0

致命错误:调用一个成员函数准备()非对象PHP PDO:调用成员函数prepare()&list?

上是什么,我得到当我尝试做的事:

$sql = $connect->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE $user_cond AND banned = 0"); // SELECT 
$sql->execute(); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$num = $connect->rowCount(); 

林抱着重写我的系统中,取出所有mysql_ *并使用pdo来代替。

这是什么之前:

$result = mysql_query("SELECT `id`,`pwd`,`firstname`,`lastname`,`approved`,`user_level` FROM users WHERE 
      $user_cond 
      AND `banned` = '0' 
      ") or die (mysql_error()); 
$num = mysql_num_rows($result); 

我做了什么错?

而且随着列表()我有:

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = mysql_fetch_row($result); 

,而不是和mysql_fetch_row($结果);我应该在PDO中做什么?

我的PDO对象/连接:

try{ 
$connect = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} 
catch(PDOException $pe) 
{ 
    die('Could connect to the database because: ' .$pe->getMessage()); 

}

回答

1

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

通常意味着什么失败,您的变量是不是你希望它是什么。 $connection大概是false

PDOStatement::fetch

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = $sql->fetch(); 

也叫rowCount的声明,连接不上了:

$sql->rowCount(); 
+0

请参阅更新的问题。 $ connect – Karem 2010-12-06 14:09:56

+1

没有错误,也许你应该按顺序发布你的代码。不知何故`$连接`没有创建,你提供的是不足以找出问题所在。 – 2010-12-06 14:20:00

0

该错误是最有可能是由于MySQL连接失败 - 为此$connect不是有效的PDO对象 - 如错误所示,您正试图在不支持它的对象上调用方法。你的连接处理代码是什么样的?您是否检查连接是否成功创建?

1

由于您使用的是准备,您应该使$ cond成为一个命名参数,然后执行此操作: 在此示例中,条件仅为user_id,但您可以具有多个条件和多个命名参数,只需bind()以同样的方式

$sth = $pdo->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE user_id = :cond AND banned = 0"); 
$sth->bindParam(':cond', $some_user_id); 
$sth->execute(); 
$a = $sth->fetch(PDO::FETCH_ASSOC); 

的$ a将会是你assiciate数组的print_r($ A),看看有什么在它

1

看起来像一个范围问题。

你是在一个函数,类,名称空间中分配$connect还是在函数,类或命名空间中运行prepare?

如果您在函数中分配$connect,那么该函数应该返回PDO连接。我想介绍一个静态实例,像这样:

class Database extends PDO 
{ 
    private $instance = null; 
    public static function Instance() 
    { 
     if(self::$instance == null) 
     { 
      self::$instance = new Database(); 
     } 
     return self::$instance; 
    } 

    private function __construct(){} 
    private function __connect() 
    { 
     try 
     { 
      parent::__construct("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)) 
     }catch(PDOException $e) 
     { 
      die($e->getMessage()); 
     } 
    } 
} 

然后使用像这样:

$Database = Database::Instnace(); 

$Database->prepare("..."); 
相关问题