致命错误:在非对象上调用成员函数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());
}
答案 0 :(得分:1)
致命错误:调用成员函数 在非对象上准备()
通常意味着某些事情失败了,而你的变量并不是你所期望的那样。 $connection
可能是false
。
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对象 - 因此,如错误所示,您试图在不支持的对象上调用方法它。您的连接处理代码是什么样的?您是否检查过连接是否已成功创建?