Php 为什么不是';此登录页面是否检测到正确的密码?

Php 为什么不是';此登录页面是否检测到正确的密码?,php,login,admin,Php,Login,Admin,我正在做一个PHP登录管理员。我关注了Youtube上的两个教程,所有的评论都说这很有效。但这对我不起作用 如果我输入了错误的密码,那么我会得到预期的“错误的用户名和密码”。但是如果我输入了正确的密码,我也会得到“错误的用户名和密码”。与数据库的连接似乎正常 index.htm(主登录名): 用户名: 密码: 这是checklogin.php: <? $host = "cpanel1"; $username = "trekking_test"; $password = "test

我正在做一个PHP登录管理员。我关注了Youtube上的两个教程,所有的评论都说这很有效。但这对我不起作用

如果我输入了错误的密码,那么我会得到预期的“错误的用户名和密码”。但是如果我输入了正确的密码,我也会得到“错误的用户名和密码”。与数据库的连接似乎正常

index.htm(主登录名):



用户名:

密码:

这是checklogin.php:

<?
$host = "cpanel1";
$username = "trekking_test";
$password = "testtest";
$db_name = "trekking_test";
$tbl_name = "members";

mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error_db());

$myusername = $_POST['myusername'];
$mypassword = $_POST['mypassword'];

$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='mypassword'";
$result = mysql_query($sql);

$count = mysql_num_rows($result);

if($count==1) {
    session_register("myusername");
    session_register("mypassword");
    header("location:control.php");
    }
    else {
        echo "Wrong Username or Password";
        }

?>
您在SQL查询中忘记了“mypassword”之前的“$”

您的HTML表单输入字段称为“用户名”和“密码”,但您要在$\u POST数组中查找“myusername”和“mypassword”

还要阅读SQL注入。您的代码易受攻击。

好吧,因为有一件事是贬值的

改为这样做:

if(!isset($_SESSION['myusername'])){...}
还添加somwhere以输出mysql错误,如:

$result = mysql_query($sql) or die(mysql_error());

表中是否有多行与查询匹配?由于您正在使用:

if($count==1) {

如果找到两个或多个匹配项,您将收到失败消息。

您的输入不应该命名为“myusername”和“mypassword”吗?这就是你在用你的$_帖子['myusername']寻找的东西

我敢打赌,如果您在PHP中设置$myusername和$mypassword后立即回显它们,您会发现它们是空的,因为您没有发布'myusername',只发布'username'。

好的,这很好:

$host = "cpanel1";
$username = "trekking_test";
$password = "testtest";
$db_name = "trekking_test";
你不需要这个,它会让你的SQL读起来很混乱

$tbl_name = "members";
那很好

mysql_connect($host, $username, $password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error_db());
不错。始终转义用户输入数据编辑,并且您的表单名称不匹配:

$myusername = $_POST['username'];
$mypassword = $_POST['password'];
这应该是:

$myusername = mysql_real_escape_string($_POST['username']);
$mypassword = mysql_real_escape_string($_POST['password']);
您不需要所有列,因为您只是在检查计数,
mypassword
的格式不正确

$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='mypassword'";
应该是:

$sql = "SELECT `username` FROM `members` WHERE `username`='$myusername' and `password`='$mypassword'";
您假设查询成功。您应始终处理以下情况:

$result = mysql_query($sql);
if(!$result) {
   // Let the user know something went wrong
}
session\u register
会让不熟悉传统
$\u session['name']='value'
语法的人感到困惑,请改用更传统的形式。您只想知道他们已登录,并且未调用
会话\u start()

if($count==1) {
    session_start();
    $_SESSION['logged_in'] = true;
    // The correct format is "Location: control.php"
    header("Location: control.php");
    exit; //Always exit after sending Location headers
}
else {
    echo "Wrong Username or Password";
}
然后在您的页面上:

session_start();
if(!isset($_SESSION['logged_in'])) {
    // Once again, Location: 
    header("Location: index.htm");
    exit; // exit after redirect
}

这不是你问题的答案。这就是为什么YouTube教程不是完美的学习媒介

  • 您需要清理输入以防止SQL注入。查看有关您所防范的内容的良好信息。MySQL需要的函数是,但是请记住,在连接到数据库之前不能调用它,所以请记住这一点
  • 密码应决不以纯文本形式存储。最好使用单向散列算法。当然,这有两个自己的警告:

    a。确保您选择了合适的算法<代码>MD5
  • SHA1
    不合适。一些查找方法有
    Eksblowfish
    (也称为
    bcrypt
    ,不要与双向加密分组密码
    blowfish
    )混淆)、
    Tiger
    SHA-256
    SHA-512
    whirpool

    b。您可能认为这对于您的目的来说太过分了,但是您实践的最佳实践越多,它们对您来说就越自然,并且您将成为更好的程序员。你应该使用一种叫做nonce的循环盐来提高密码的安全性。salt是在密码加密或散列之前添加到密码中的字符串,因此
    传递\u hash\u actual=hash\u函数(salt+密码)

    • :本文将向您介绍在PHP中针对bcrypt的具体实现,但我主要是将其链接到它所链接的文章中,这将为您提供如何以及为什么在密码中使用nonce的详细概述
    我本打算在这里写一份实施指南,但onteria的指南为您提供了该部门所需的一切。快乐编码

    if($count>0) {
    

    如果登录详细信息正确,查询将返回一个单行结果集,如果登录详细信息不正确,则返回零行结果集。使用
    mysql\u num\u rows
    查找结果集中的行数,从而确定登录详细信息是否正确。

    我不擅长这个。。。。当我发布我的问题时,所有的HTML PHP代码都消失了。。。。我猜我在输入代码时做错了什么你有一个SQL注入漏洞。确保清理从用户inputi获得的任何数据,并为u。也接受你之前问题2的一些答案。您的代码易受SQL注入攻击:您需要在开始使用之前修复该漏洞。是的,请接受您的问题的答案。这就是这个网站的全部目的,提出问题,获得答案,让每个人都知道哪一个是正确的,这样将来人们就不必猜测了。问题是,如果我们使用
    username
    检查登录详细信息,它必须是唯一的。记住这一点,
    $count
    必须等于1或0,否则会出现错误,因为这意味着您需要清理坏数据。当然,如果你有一个唯一的索引,那么这个索引将被更早地捕获。talbe看起来像这个ID用户名密码--------------------1 hulemo kurbitur 2 Inthor 1234Yes,我发现了这个错误,现在我已经修复了它,它似乎正在工作:)只需点击答案旁边的复选标记,就可以回答这个(和你以前的)问题了。:)它现在起作用了。。。。但是我注意到url应该加密,对吗?这是非常可怕的重定向和路径只是admin.php…thanx的链接,我要看看它
    session_start();
    if(!isset($_SESSION['logged_in'])) {
        // Once again, Location: 
        header("Location: index.htm");
        exit; // exit after redirect
    }
    
    if($count>0) {