Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLSTATE[HY000]:PHP和PDO的一般错误_Php_Pdo - Fatal编程技术网

SQLSTATE[HY000]:PHP和PDO的一般错误

SQLSTATE[HY000]:PHP和PDO的一般错误,php,pdo,Php,Pdo,我有一个小的登录脚本 function login($sql) { try { $fbhost = "localhost"; $fbname = "foodbank"; $fbusername = "root"; $fbpassword = ""; $DBH = new PDO("mysql:host=$fbhost;dbname=$fbname",$fbusername,$fbpassword); $DBH-

我有一个小的登录脚本

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]:未找到列:“where子句”中的1054未知列“pvtpyro”

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

PDO的构造函数使用了两个未在您提供的代码中定义的变量-$fbhost和$fbname

编辑:
您正在
while
循环中调用
会话\u start()
,这可能会导致错误。把它从循环中去掉

编辑2:

您应该真正调试代码。通过将
die
放在代码的不同部分,在前面输出一些有用的信息(这是不太可取的方式),或者使用xdebug和IDE,这样可以让您逐行运行,并查看每个变量的确切状态等。

如果我理解不正确,
$data
$STH->执行($data);
应该是一个数组,即使值是一。因此,您可以尝试用
$STH->execute(array($data));

编辑:

将您的行更改为:

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


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

根据最新编辑:执行插入查询后,无法使用PDO获取结果。请参见此处:

Edit:我想,由于函数名为“login”,您希望有这样的$sql:“从username=:username的用户中选择密码”,然后使用while循环迭代结果,如果密码匹配,则登录用户

Edit2:根据您的编辑提供一个选择查询:不要使用此查询。您所做的不是SQL注入证明。永远不要使用来自用户输入的变量(即$\u POST、$\u GET等)并将其未经过滤地放入SQL查询中。请在SO或Google中查找术语“准备好的语句”。
如您所见,由于您忘记在双引号之前和之后加上单勾号(撇号),MySQL认为您的输入引用了另一列(“pvtpyro”),而不是将该列中的值与字符串进行比较。请始终使用“:username”,“:password”语法(带有前缀冒号的语法)否则,您的查询将是不安全的,并且对您的应用程序非常危险。

$data和$sql的值是多少?@Herode我在底部添加了我的代码。请注意我回答中的编辑。不要使用您提供的SELECT查询,因为它对sql注入不安全。您应该编辑此帖子以删除sql注入声明如stef77所述,我们不希望任何寻求帮助的人复制并使用它。数组是通过函数传递的。我更改了上面的代码以显示传递的内容。如果以这种方式传递数组,我是否仍应添加数组?是的,只是尝试一下。在
常规错误之后是什么?
?我们需要查看完整的错误代码是的。就是这么说的。实际上“with”根本不存在。添加额外的数组会给我这个错误:注意:在C:\xampp\htdocs\inc\foodbankdb.php的第28行SQLSTATE[HY093]中进行数组到字符串的转换:无效参数编号:绑定变量的数量与我打算使用“select”的标记的数量不匹配奇怪的是,我不知道以前为什么会这样。谢谢:)不客气!我还可以添加一个提示,您应该考虑用单->取回替换while循环,因为多次启动会话和发送头位置不止一次是没有意义的。当然,如果用户名在数据库中是唯一的,则不会出现任何问题,但是您应该替换while循环,以明确您的意图(我想您不想与“多个用户中的日志”进行通信)。@BrandiEvans您提交的文本中有
(appostrophe)哦,我从来没有听说过xdebug。谢谢:)