2

我对 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()

我的代码有什么问题?

4

4 回答 4

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();

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

于 2013-10-30T11:55:58.687 回答
0

您必须使用 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 );
于 2013-10-30T11:53:01.847 回答
0

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

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

立即使用var_dump$query = $db->query(...确保您收到错误。并使用 PDO 错误检查找出错误消息是什么。

于 2013-10-30T11:55:03.937 回答
0

尝试使用 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();

```

于 2013-10-30T11:59:33.673 回答