PHP PDO:调用成员函数prepare()&清单?

时间:2010-12-06 14:00:24

标签: php pdo

致命错误:在非对象上调用成员函数prepare()

当我尝试时,我得到的是:

$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()我有:

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

而不是mysql_fetch_row($ result);我该怎么做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());

}

4 个答案:

答案 0 :(得分:1)

  

致命错误:调用成员函数   在非对象上准备()

通常意味着某些事情失败了,而你的变量并不是你所期望的那样。 $connection可能是false

PDOStatement::fetch

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

同时在声明中调用rowCount,而不是在连接上调用:

$sql->rowCount();

答案 1 :(得分:1)

由于您使用prepare,您应该使$ 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)来查看其中的内容

答案 2 :(得分: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("...");

答案 3 :(得分:0)

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