我使用与sql db的会话创建了登录系统。当我输入正确的用户名和密码时,我可以登录。但是当我输入错误的消息时,它没有显示Incorrect username or password
消息,它保留在checklogin.php页面(空白页面)。我该如何解决这个问题?这是checklogin.php:
session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=...", $username, $password);
$sql = "select * from user where username='$myusername' and password='$mypassword' ";
foreach ($dbh->query($sql) as $row){
if (isset($myusername) && isset($mypassword)) {
if (($row['username']==$myusername) && ($row['password']==$mypassword)) {
$_SESSION['login']='true';
echo "Login successfully";
echo"<a href='log_out.php'>Logout</a>";
}else{
echo "Incorrect username or password";
}
}
}
答案 0 :(得分:1)
我在你的代码中看到一些奇怪的东西:一方面是PDO连接,另一方面是mysql_real_escape_string。
所以,为了使你的代码更具可读性,我会在PDO中使用预处理语句:
session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = "select * from user where username=:myusername AND password=:mypassword ";
$statement = $dbh->prepare($sql);
$statement->execute(array(':myusername'=>$myusername,':mypassword'=>$mypassword));
if($row = $statement->fetch(PDO::FETCH_ASSOC)){//if there is someone with given informations
echo "Welcome !";
else{
echo "Wrong password or identifier";
}
正如您所看到的,我执行查询(使用prepare / execute或with query)然后我使用fetch来获取结果。使用PDO,有一个函数fetchAll,它允许您获取整个结果数组,以便您可以使用foreach而不是while循环遍历它。
然后,我的代码遗漏了一些东西:你没有在连接字符串中提供你的数据库名称,所以它不起作用。
我还添加了一行来处理错误。
答案 1 :(得分:1)
$row=$dbh->query($sql);
if ($row['username']='' && $row['password']!='') {
if (($row['username']==$myusername) && ($row['password']==$mypassword)) {
$_SESSION['login']='true';
echo "Login successfully";
echo"<a href='log_out.php'>Logout</a>";
}else{
echo "Incorrect username or password";
}
}
答案 2 :(得分:1)
只计算$sql
返回的结果就足以检查用户凭据。如果count为1,则应该登录用户,否则应显示Incorrect Password or Username
消息。
session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=...", $username, $password);
$sql = "select count(*) from user where username='$myusername' and password='$mypassword'";
if (isset($myusername) && isset($mypassword))
{
$nRows = $dbh->query($sql)->fetchColumn();
$count= (int) count($nRows);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
$_SESSION['login']='true';
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}
}
else {
echo "Please enter Password and Username";
}
如果密码与显示错误不匹配,我建议您检查checklogin.php
的凭据以及成功将用户重定向到另一个页面login_success.php
(例如)在checklogin.php
。
答案 3 :(得分:0)
$sql = "select count(*) as exist from user where username='$myusername' and password='$mypassword' ";
foreach ($dbh->query($sql) as $row){
if (row['exist'] > 0) {
$_SESSION['login']='true';
echo "Login successfully";
echo"<a href='log_out.php'>Logout</a>";
}else{
echo "Incorrect username or password";
}
}
答案 4 :(得分:0)
您正在选择具有正确用户名和正确密码的用户。然后,你用foreach循环迭代它们
如果密码错误,语句将不会选择任何内容,并且foreach循环中的代码将不会被执行 - 错误消息在该循环内,因此不会被回显。
如果返回行,则必须检查数字,如果数字为零,则显示错误
但是在循环之外这样做。