我正在创建一个登录表单并且无法成功登录。我的表单看起来像这样
<form method="post" action="phpScripts/loginProcess.php">
<input type="text" name="uname" value="" placeholder="Username">
<input type="password" name="pass" value="" placeholder="Password">
<input id="submit" type="submit" value="submit">
</form>
我已经检查过,我正在连接数据库,我的uname和pass都是正确的。我经过多次双重检查。问题在我的查询中。这是loginProcess.php文件
<?php
require_once ('dbconn.php');
if(isset($_POST['login'])){
$uname = mysqli_real_escape_string($_POST['uname']);
$pass = mysqli_real_escape_string($_POST['pass']);
$query = mysql_query ("SELECT * FROM staff WHERE uname='$uname'");
$numrows = mysql_num_rows($query);
if ($numrows !=0){
die("Success!!");
}
else{
die("That user doesnt exist");
}
}
else{
echo "Username or Password incorrect";
}
?>
在Fred-ii-的帮助下,我能够找出错误并快速修复登录问题!我想提供我用来登录的代码,以防其他人遇到这个问题。
以下是我用来登录的代码。我觉得我可以使用execute和$ userSql / $ pwSql减少冗余。任何建议清理这一点将不胜感激!
<?php
ini_set('display_errors', 1); error_reporting(E_ALL);
require_once ('dbconn.php');
$uname = $_POST['uname'];
$pass = $_POST['pass'];
$userSql = "SELECT * FROM staff WHERE uname=:uname";
$getUser = $conn->prepare($userSql);
$getUser->execute(array(
':uname' => $uname
));
if($getUser->rowCount()){
$pwSql = "SELECT pass FROM staff WHERE uname =:uname";
$getPw = $conn->prepare($pwSql);
$getPw->execute(array(
':uname' => $uname
));
$pw = implode($getPw->fetch(PDO::FETCH_ASSOC));
if(password_verify($pass,$pw)){
header("Location: ../../staffHome.php");
}else{
echo "Oops! You have entered in an incorrect password!";
}
}else{
echo "Oops! That user doesn't exist!";
}
?>
答案 0 :(得分:5)
这是独家新闻。
您的条件语句if(isset($_POST['login'])){...}
将永远不会发生,因为表单不包含name属性(除非您使用JS / jQuery)。您需要为提交命名。 <input name="submit" id="submit" type="submit" value="submit">
,因为PHP不依赖于“id”,它依赖于“name”属性(或者再次,如果你使用的是JS / jQuery,但这不是这里的情况)。然后从name="login"
删除 <form>
。
然后你没有将连接传递给你的转义函数。
然后你混合了mysql_
个函数,以便不与mysql_
以外的任何东西混合。
我们也不知道您使用哪个MySQL API进行连接。
因此,在连接到查询时使用相同的一个,使用mysqli_
或PDO,最好使用预准备语句。
编辑评论:“我正在使用PDO进行连接。”
mysql_
或mysqli_
与PDO混合。请教:
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:只应在暂存时进行显示错误,而不是生产。
<强>密码强>
我还注意到您可能以纯文本格式存储密码。不建议这样做。
使用以下其中一项:
crypt()
bcrypt()
scrypt()
password_hash()
功能。其他链接:
您目前的代码向SQL injection开放。使用mysqli_*
with prepared statements或PDO与prepared statements。