【问题标题】:Password/Username won't work using php/mysql密码/用户名无法使用 php/mysql
【发布时间】:2012-08-13 04:52:37
【问题描述】:

我正在尝试使用 PHP 和 MYSQL 创建一个非常简单的 CMS。我遇到的问题是,每当我尝试登录时,如果我输入了错误的用户名,我想要发生的事情就会发生。它进入一个显示错误输入的屏幕,并有一个返回登录页面的链接。但是,如果我输入了正确的用户名和错误的密码,它只会重新加载页面,如果我输入了正确的密码,则会出现相同的屏幕,就好像我输入了错误的用户名一样,告诉我用户名或密码错误。我检查了数据库以确保我输入的密码正确,并且用户名和密码都正确但它不起作用。谁能帮我解决这个问题?提前谢谢你

以下是您可能需要查看的功能:

function verifyUser($name, $pass)
{
// Escape strings
$username = mysql_real_escape_string($name);
$password - mysql_real_escape_string($pass);

$result = mysql_query("select * from users where username='$username' and       password-'$password' limit 1");

if (mysql_fetch_array($result))
{
    return true;
} else{
    return false;
}

}

function validateUser($name, $pass)
{
    $check = verifyUser($name, md5($pass));

    if($check)
    {
        $_SESSION['status'] = 'authorized';

        header('Location: http://localhost/cms/admin/index.php');

    } else{

        echo'Please enter a correct username and password <br />';
        echo "<a href='http://localhost/cms/admin/login.php'>Try Again?</a>";
        exit;
    }



}

这里是 login.php 文件:

require_once '../functions.php';

connect();

if($_POST['username'] && $_POST['password'])
{
$result = validateUser($_POST['username'], $_POST['password']);
}


?>

<form method="post" action="">
<p>
    <label for="name">Username: </label>
    <input type="text" name="username" />
</p>

<p>
    <label for="password">Password: </label>
    <input type="password" name="password" />
</p>

<p>
    <input type="submit" id="submit" value="Login" name="submit" />
</p>
</form>

我收到一条通知:未定义索引:第 14 行 C:\xampp\htdocs\cms\admin\login.php 中的用户名

【问题讨论】:

    标签: php mysql content-management-system


    【解决方案1】:

    尝试在您的header('Location: ...'); 行之后添加die(); 以成功登录尝试。

    要纠正未定义的索引错误,请在 login.php 中更改:

    if( isset($_POST['username']) &amp;&amp; isset($_POST['password']) )

    此外,您的查询中有错误。减号应该是等号(你有password-'$password'。除非你需要捕获用户数据,否则你应该尝试计算结果,而不是获取它们。

    $result = mysql_query("select * from users where username='$username' and       password='$password' limit 1");
    
    if ( mysql_num_rows( $result ) > 0 )
    

    【讨论】:

    • 好的,这解决了大部分问题,除了当我输入正确的组合时,登录页面只是重新加载而不是重定向到 index.php 页面。
    【解决方案2】:

    阅读mysql_fetch_array

    基本上,if (mysql_fetch_array($result)) 行是问题所在。它不一定像您的 if/else 期望的那样是布尔答案。相反,它要么返回一个资源,要么返回一个FALSE。因此,$check 永远不会被赋予true 的值。

    此外,但重要的是,您正在使用的功能正在被弃用。阅读MySQLiPDO_MySQL

    【讨论】:

    • 在这种情况下正确的功能是什么?我还在学习很多东西,我正在为此准备一个教程
    • if (mysql_num_rows($result)) - 注意另一个答案添加了一个不必要的&gt; 0。您将查询限制为最多 1 个结果,因此唯一的可能性是 1(正确的凭据)或 0(不正确的凭据)。
    • 还有@cadavid4j,一定要阅读这两种选择。如果你正在编写新代码,你真的应该学习没有被弃用的函数!
    • 非常感谢您的帮助。我仍然在学习 PHP 和 MYSQL 的过程中,现在我正试图在暑假期间自学它。所以请原谅我糟糕的代码。 :)
    【解决方案3】:

    这可能是微不足道的,但请注意您在密码变量后面有两次“-”而不是“=”

        $password - mysql_real_escape_string($pass);
    
    $result = mysql_query("select * from users where username='$username' and       password-'$password' limit 1");
    

    【讨论】:

    • 我已经修好了这个。在有人指出另一个之后,我也看到了这个。谢谢!!!
    【解决方案4】:

    使用正确的查询

    $result = mysql_query("select * from users where username='{$username}'
     AND password='{$password}' limit 1");
    if($result){
    return true;
    }else{
    return false;
    }
    

    也可以使用

    if(isset($_POST["username"]) && isset($_POST["password"])){
    $check=verifyuser($_POST["username"],sha1($_POST["password"]));//sha1 is more secure than md5
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多