【问题标题】:Error in PDO page Call to a member function bindValue() on a non-objectPDO 页面中的错误调用非对象上的成员函数 bindValue()
【发布时间】:2013-11-09 23:31:09
【问题描述】:

我对 PDO 很陌生。

我尝试在我的网站上创建一个登录页面,代码如下所示

<?php
     if(isset($_POST['username'])and isset($_POST['password']))
     { 

session_start();
$db = new PDO('mysql:host=localhost;dbname=hydra', 'root', '');

$username = $_POST['username'];
$password = $_POST['password'];

$query = $db->query("SELECT * FROM login where username=:username AND password=:password");
    $query->bindValue(":username", $username, PDO::PARAM_STR);
    $query->bindValue(":password", $password, PDO::PARAM_STR);
    $query->execute();

    if($query->rowcount() >0 )
    {
        echo "No Records Found!";
        header('Location: login.php');
    }
    else
    {
        $_SESSION['username'] = $_POST['username'];
        header("Location: home.php");

    }




           }
         ?>

尝试登录后,出现以下错误: 在非对象上调用成员函数 bindValue()

我的代码有什么问题?

【问题讨论】:

    标签: php pdo bindvalue


    【解决方案1】:

    试试这样:

    $stmt = $db->prepare("SELECT * FROM login WHERE username=:username AND password=:password");
        $stmt->bindValue(":username", $username, PDO::PARAM_STR);
        $stmt->bindValue(":password", $password, PDO::PARAM_STR);
        $stmt->execute();
    

    您必须通过 $db-&gt;prepare("sql") 而不是查询创建语句 ($stmt)。然后你可以将参数绑定到准备好的语句并执行它。

    【讨论】:

      【解决方案2】:

      PDO::query 返回值为 PDOStatement 对象或 FALSE 失败。

      在您的情况下发生了故障,返回值是 FALSE 而不是 PDOStatement 对象。

      $query = $db-&gt;query(... 之后使用var_dump 以确保您收到错误消息。并使用 PDO 错误检查找出错误信息是什么。

      【讨论】:

        【解决方案3】:

        尝试使用 prepare() 方法而不是 query()

        ```

        $query = $db->prepare("SELECT * FROM login where username=:username AND password=:password");
        
        $query->bindValue(":username", $username, PDO::PARAM_STR);
        $query->bindValue(":password", $password, PDO::PARAM_STR);
        $query->execute();
        

        ```

        【讨论】:

          【解决方案4】:

          你必须使用 prepare() 而不是 query()

          你的代码也太臃肿了。

          $stmt = $db->prepare("SELECT * FROM login where username=? AND password=?");
          $stmt->execute([$_POST['username'], $_POST['password']]);
          

          够了
          另外,您必须在连接后添加此行

          $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
          

          【讨论】:

            猜你喜欢
            • 2014-12-19
            • 2015-05-13
            • 2012-09-01
            • 2016-03-25
            • 1970-01-01
            • 2015-12-30
            • 1970-01-01
            • 1970-01-01
            • 2013-10-01
            相关资源
            最近更新 更多