我有一点登录脚本。
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'
答案 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)
在我看来,你没有正确连接到你的数据库......我今天早些时候遇到了这个错误,正是出于这个原因。或者你有一个不正确的字符串