准备好的PDO查询返回0个受影响的行

时间:2013-09-01 08:09:03

标签: php mysql pdo prepare

我真的花了几个小时谷歌搜索和搜索,我不知道我做错了什么。我正在使用POST,我在phpMyAdmin中自己尝试了查询,但是它有效,但是它在PDO中不起作用,我不知道为什么。当我使用mysql_query时没用,但是我想保护自己免受SQL注入。

这是我正在使用的代码:

<?php
    if(isset($_POST['user']) and isset($_POST['pass'])) {
        $name = $_POST['user'];
        $pass = $_POST['pass'];

        $db = new PDO('mysql:host=localhost;dbname=*****;charset=utf8', '*****', '*****');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $query = $db->prepare("SELECT * FROM stored WHERE _User LIKE :username AND _Pass LIKE :password");
        $query->bindValue(":username", $user, PDO::PARAM_STR);
        $query->bindValue(":password", $pass, PDO::PARAM_STR);

        $query->execute();

        echo $query->rowCount();
    }
?>

2 个答案:

答案 0 :(得分:1)

看起来你在第41行命名用户名变量$ name,但是当你在第46行绑定参数时,你称之为$ user。

答案 1 :(得分:0)

要么使用古老版本的PHP,要么数据库中没有符合条件的行。升级第一个并检查您的数据并查询第二个。

另外,正如Holy Linus对我们说的那样,“说话便宜,告诉我代码” 不要告诉我们“当我使用等等查询时它有效”。 运行它。在同一个文件中,旁边是这段代码。通过这种方式,您将获得证明。只有这样的证明很重要,而您的猜测则不然。

但是,严格来说,您根本不需要此功能,也不需要大部分代码

$stmt = $db->prepare("SELECT 1 FROM stored WHERE _User = ? AND _Pass = ?");
$stmt->execute(array($_POST['user'],$_POST['pass']));
echo $stmt->fetchColumn();

就够了。