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。谢谢:)