SQLSTATE [HY000]:PHP和PDO的常规错误

时间:2013-05-21 16:17:44

标签: php pdo

我有一点登录脚本。

function login($sql) {
try {                   
    $fbhost = "localhost";
    $fbname = "foodbank";
    $fbusername = "root";
    $fbpassword = "";
    $DBH = new PDO("mysql:host=$fbhost;dbname=$fbname",$fbusername,$fbpassword);
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $STH = $DBH->query($sql);       
    $STH->setFetchMode(PDO::FETCH_ASSOC);

    session_start();        
    if ($row = $STH->fetch()) {
        $_SESSION['username'] = "$row[username]";
        header("Location:index.php");   
    }
} catch(PDOException $e) {
    echo $e->getMessage();
}
}

编辑:

的index.php

$sql = "SELECT username from users where username = ". $_POST['username'] ." AND password = ". $_POST['password'] ."";
login($sql);

从插入更改为选择查询。现在我收到新的错误: SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'pvtpyro'

4 个答案:

答案 0 :(得分:8)

根据您的最新编辑:执行INSERT查询后无法使用PDO获取结果。见这里:http://www.php.net/manual/en/pdostatement.fetch.php#105682

编辑:我想,由于函数名为“login”,你想要像$ sql这样的东西:“SELECT password FROM users WHERE username =:username”,然后使用while循环迭代结果,如果密码匹配,则登录用户?

Edit2:根据您的编辑提供SELECT查询:不要使用此查询。您正在做的不是SQL注入证明。永远不要使用来自用户输入的变量(即$ _POST,$ _GET等)并将它们未经过滤地放入SQL查询中。请在SO或Google查找“准备好的陈述”一词。 如您所见,由于您忘记在双引号之前和之后放置单个刻度(撇号),MySQL认为您的输入引用另一列(“pvtpyro”),而不是将列中的值与字符串进行比较。总是使用“:username”,“:password”语法(带有前置冒号的语法)或者您的查询将不安全并且对您的应用程序造成极大的危险。

答案 1 :(得分:1)

PDO的构造函数使用2个变量,这些变量未在您提供的代码中定义 - $ fbhost和$ fbname。

编辑:
您在session_start()循环内调用while,这可能会导致错误。把它带出循环。

编辑2:
你应该真的调试代码。通过将die放在代码的不同部分,输出一些有用的信息(这是不太喜欢的方式)或者使用xdebug和IDE,这将允许您逐行运行,并查看每个变量的确切状态等。

答案 2 :(得分:1)

如果我没有正确查看,$data $STH->execute($data);应该是一个数组,即使值为1。因此,您可以尝试使用$STH->execute(array($data));

替换该查询

<强>编辑:

将您的行更改为:

$data = array($_POST["username"], $_POST["password"]);
$sql = "INSERT INTO users (username, password) value (?, ?)";


$STH = $DBH->prepare($sql);
$STH->execute($data);

答案 3 :(得分:0)

在我看来,你没有正确连接到你的数据库......我今天早些时候遇到了这个错误,正是出于这个原因。或者你有一个不正确的字符串