我一直试图转换一个旧的mysql
pdo
,因为我正在努力了解pdo
的工作方式,我一直在研究这个文件好几个小时现在已经破坏了我的头脑并且无法弄清楚出了什么问题,而且我确定了很多。
try{
$check_user_data = $dbh->query("SELECT * FROM members WHERE username = '$username'");
$stmt = $dbh->prepare($check_user_data);
$stmt->execute();
$result->bind_result($username);
$data_exists = ($check_user_data->fetchColumn() > 0) ? true : false;
if($data_exists = false){
$final_report.="This username does not exist..";
}else{
$get_user_data = $stmt->fetch(PDO::FETCH_ASSOC);
if($get_user_data['password'] == $password){
$start_idsess = $_SESSION['username'] = "".$get_user_data['username']."";
$start_passsess = $_SESSION['password'] = "".$get_user_data['password']."";
$final_report.="You are about to be logged in, please wait a few moments.. <meta http-equiv='Refresh' content='2; URL=members.php'/>";
}
}
foreach ($dbh->query($sql) as $row){
}
$dbh = null;
}
catch(PDOException $e){
echo $e->getMessage();
}
也是致命的
Fatal error: Call to a member function execute() on a non-object
不确定致命事件是否与警告有关。
答案 0 :(得分:2)
首先,改变这两行:
$check_user_data = $dbh->query("SELECT * FROM members WHERE username = '$username'");
$stmt = $dbh->prepare($check_user_data);
为:
$stmt = $dbh->prepare("SELECT * FROM members WHERE username = :username");
$stmt->bindParam(':username', $username);
这使用了预准备语句的参数功能,这可以防止SQL注入。
接下来,PDO没有bind_result
方法,这是MySQLI的一部分。要获得结果,您应该:
$get_user_data = $stmt->fetch(PDO::FETCH_ASSOC);
$data_exists = ($get_user_data !== false);
然后,您应该移除对$stmt->fetch
块中else
的调用,因为它会尝试获取下一行结果。
答案 1 :(得分:0)
致命绝对与警告有关;您将$dbh->query()
(PDOStatementObject)的结果传递给$dbh->prepare
,导致$dbh->prepare
返回不是对象的内容。
只需将SQL移到$dbh->prepare
调用中即可完全摆脱$dbh->query()
。
答案 2 :(得分:0)
对于那些可能来到这里的人,我的问题有点不同,我试图在doctrine / symfony项目上启用过滤器,并在下一行意外地犯了错误:
$filter->setParameter($name, $someObject);
当我在getParameter($name)
函数中调用函数addFilterConstraint
时,我得到了相同的错误
警告:PDO :: prepare()期望参数1为字符串,对象为
后来我发现了这个错误。修复方法是将$someObject
的setParameter第二个输入替换为$someString
,如下所示:
$filter->setParameter($name, 'some string which is the real value you want to get later');