我的代码有效,但它只适用于第一行。当我在MySQL中插入另一行并尝试使用不同的用户名和密码登录时,它返回我的错误。怎么了?
<?php
include_once('db.php');
$username = $_POST['username'];
$password = sha1($_POST['password']);
if(!empty($username) && !empty($password)) {
$loginSQL = "SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password'";
if($db->query($loginSQL)->fetchColumn() == 1) {
$fetchUsers = $db->query($loginSQL)->fetch(PDO::FETCH_ASSOC);
$userID = $fetchUsers['uid'];
$_SESSION['uid'] = $userID;
echo '<br /><br />You have successfully logged in. <a href="inner.php">Click here</a> to proceed.';
}
else {
echo '<br /><br />You have entered invalid log-in information.';
}
}
else {
echo '<br /><br />You have entered invalid log-in information.';
}
?>
答案 0 :(得分:2)
两个最大的问题是双获取和缺少准备好的语句。
<?php
include_once('db.php');
if(!empty($_POST['username'])) {
$username = $_POST['username'];
$password = sha1($_POST['password']);
$sql = "SELECT uid FROM `users` WHERE `username` = ? AND `password` = ?";
$stm = $db->prepare($sql);
$stm->execute(array($username,$password);
if($row = $stm->fetch()) {
$_SESSION['uid'] = $row['uid'];
}
}
答案 1 :(得分:0)
这里有一些问题。
fetchColumn()返回第一行的第一列,可能是也可能不是1,具体取决于数据库表的设置方式。
fetch()返回PDOStatement行指针所在的当前行。如果你不把它发送到下一行,它就不会移动。
由于两个不同的原因,您发送相同的错误,导致混淆。
如果你像@Your Common Sense那样对你的代码进行重构,那么真正有用的是什么呢?这将有助于您更好地发现问题。