Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 警告:PDO::prepare()要求参数1为字符串,对象为给定值_Php_Mysql_Pdo_Execute_Prepare - Fatal编程技术网

Php 警告:PDO::prepare()要求参数1为字符串,对象为给定值

Php 警告:PDO::prepare()要求参数1为字符串,对象为给定值,php,mysql,pdo,execute,prepare,Php,Mysql,Pdo,Execute,Prepare,我一直在尝试转换一个旧的mysql也pdo当我试图学习pdo如何工作时,我已经花了好几个小时在这个文件上工作了,现在我绞尽脑汁,弄不清哪里出了问题,我确信这是很多 try{ $check_user_data = $dbh->query("SELECT * FROM members WHERE username = '$username'"); $stmt = $dbh->prepare($check_user_data); $stmt->execute(

我一直在尝试转换一个旧的
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();
}

不确定致命事件是否与警告相关。

致命事件肯定与警告相关;您正在将
$dbh->query()
(一个PDOStatementObject)的结果传递到
$dbh->prepare
,导致
$dbh->prepare
返回非对象的内容


只需将SQL移到
$dbh->prepare
调用中,并完全删除
$dbh->query()

首先,更改这两行:

$check_user_data = $dbh->query("SELECT * FROM members WHERE username = '$username'");
$stmt = $dbh->prepare($check_user_data);
致:

这利用了prepared语句的参数特性,从而防止了SQL注入

接下来,PDO没有一个
bind_result
方法,这是MySQLI的一部分。要获得结果,您应该执行以下操作:

$get_user_data = $stmt->fetch(PDO::FETCH_ASSOC);
$data_exists = ($get_user_data !== false);

然后,您应该在
else
块中删除对
$stmt->fetch
的调用,因为它将尝试获取下一行结果。

对于可能来这里的人,我的问题有点不同,我试图在条令/symfony项目上启用过滤器,但意外地在以下行中出错:

$filter->setParameter($name, $someObject);
当我在
addFilterConstraint
函数中调用函数
getParameter($name)
时,我得到了相同的错误

警告:PDO::prepare()要求参数1为字符串,对象为给定值

后来我发现了错误。修复方法是将setParameter第二次输入从
$someObject
替换为
$someString
,如下所示:

$filter->setParameter($name, 'some string which is the real value you want to get later');

SQLSTATE[42000]:语法错误或访问冲突:1065查询为空
其他一切都很好。我将在新答案中发布更改。这是否发生在使用
$dbh->query($sql)
的行上?你分配了
$sql
?里面有这个,我认为我不需要它,所以我把它拿了出来,不知道它为什么在那里
foreach($dbh->query($sql)as$row)
,一切正常谢谢您的帮助。
$filter->setParameter($name, 'some string which is the real value you want to get later');