【问题标题】:Warning: PDO::prepare() expects parameter 1 to be string, object given警告:PDO::prepare() 期望参数 1 是字符串,给定对象
【发布时间】:2014-11-29 01:01:57
【问题描述】:

我一直在尝试转换旧的 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

不确定致命是否与警告有关。

【问题讨论】:

    标签: php mysql pdo execute prepare


    【解决方案1】:

    致命肯定与警告有关;您将$dbh-&gt;query()(这是一个PDOStatementObject)的结果传递给$dbh-&gt;prepare,导致$dbh-&gt;prepare返回不是对象的东西。

    只需将 SQL 移动到 $dbh-&gt;prepare 调用中,然后完全摆脱 $dbh-&gt;query()

    【讨论】:

      【解决方案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);
      

      这利用了prepared statements的参数特性,防止了SQL注入。

      接下来,PDO 没有bind_result 方法,这是 MySQLI 的一部分。要获得结果,您应该这样做:

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

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

      【讨论】:

      • SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty 其他一切都很好。我会在新答案中发布更改。
      • 这种情况发生在$dbh-&gt;query($sql) 行吗?你分配$sql了吗?
      • 有这个我觉得我不需要它所以我把它拿出来了,不知道为什么它在那里。 foreach ($dbh-&gt;query($sql) as $row),一切正常,感谢您的帮助。
      【解决方案3】:

      对于可能来到这里的人来说,我的问题有点不同,我试图在学说/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');
      

      【讨论】:

        猜你喜欢
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 2013-11-24
        • 1970-01-01
        相关资源
        最近更新 更多