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

Bra*_*ans 0 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();
}
}
Run Code Online (Sandbox Code Playgroud)

EDITS:

的index.php

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

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

ste*_*f77 8

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

编辑:我想,由于该函数被称为"登录",你想要像$ sql这样的东西:"SELECT password FROM users WHERE username =:username",然后用while循环迭代结果,然后登录如果密码匹配,在用户中?

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