2012-05-15 73 views
1

我正在抓取我的noob头发。无法理解为什么下面的代码不起作用。页面加载正常,但是当我尝试使用数据库中的用户名和密码登录时,页面只是通过登录表单重新加载到其原始状态,而我实际上希望看到注销按钮。我也试着比较没有盐和散列的密码与数据库中未加标签的,未加标记的等价物。不工作。密码验证不会登录,只是重新加载登录页面

我得到的唯一警告是“依靠系统的时区设置是不安全的。”,我不认为这些与密码验证功能有关。

页开始时是这样的:

session_start(); 

error_reporting(-1); ini_set('display_errors', 'On'); 

然后如下一些HTML。然后:

if (isset($_POST['log_out'])) { 
    session_unset(); 
    session_destroy(); 
    $_SESSION = array(); 
} 

注销按钮,当按下时,设置$_POST['log_out']。然后是一个功能,我从一本书了,用来防止SQL注入:

function mysql_fix_string($string) { 
    if (get_magic_quotes_gpc()) $string = stripslashes($string); 
    $string = htmlspecialchars($string, ENT_QUOTES); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

然后是密码验证的一部分,如果用户提交了登录表单(这回发到同一页应该只运行,从而设置$_POST['username']$_POST['password']):

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

    $salt1 = 'how'; 
    $salt2 = 'pony'; 
    $password = md5($salt1 . $_POST['password'] . $salt2); 

    $db_hostname = 'xxxxxxxxx'; 
    $db_username = 'xxxxxxxxx'; 
    $db_password = 'xxxxxxxxx'; 
    $db_database = 'xxxxxxxxx'; 

    $db_server = mysql_connect($db_hostname, $db_username, $db_password); 

    if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()); 

    mysql_select_db($db_database) 
     or die("Unable to select database: " . mysql_error()); 

    $username = mysql_fix_string($_POST['username']); 

    $query = "SELECT password FROM users WHERE name = '" . $username . "'"; 

    $result = mysql_fetch_assoc($query); 
    $passwordindatabase = $result['password']; 

    if ($password == $passwordindatabase) { 
     $_SESSION['logged_in'] = true; 
     $_SESSION['user'] = $username; 
     unset($_POST['username']); 
     unset($_POST['password']); 
    } 

} 

的位进一步向下来登录表单,只示出if ($_SESSION['logged_in'] != true)。它将输入字段usernamepassword的值发布到$_SERVER['REQUEST_URI'](同一页)。

+1

你可以给var_dump()的$ passwordindatabase和$ password吗?检查它们是否匹配? – Bono

+0

感谢您的评论。实际上,$ password是字符串(32)“a18c15de5dbeb62f3bb78d4212bcc3b8”,但$ passwordindatabase为NULL。显然这里有一个问题。 – Johanna

+1

您确定您使用的用户是否存在于数据库中?另外,$ username和$ _POST ['username']是否匹配?整个mysql_fix_string()可能会造成你不想使用的东西。 **编辑**还要确保您在SQL语句中引用的表和字段是正确的。 – Bono

回答

4

在我看来,你错过了mysql_query()函数,这意味着你没有真正执行查询。

的mysql_query - 发送一条MySQL查询

执行以下操作,看看它的工作原理:

$result = mysql_query($query); 

$passwordindatabase = mysql_fetch_assoc($result); 

编辑
在一个完全不同的说明,你不应该使用mysql函数,因为它们很老式,并且具有mysql_injection漏洞。我会建议你尽快开始使用PDO,如果做得对的话,它没有mysql_injection的功能。

+1

+1为PDO颠簸:)去需要一段时间的MySQL *死于互联网:( – Cylindric

+0

谢谢,善良的先生!它的工作!:) – Johanna

+0

@Cylindric你的评论是什么意思?请解释一个noob ... :)(至少如果它对我的代码很重要) – Johanna

0

要使用基于cookie的会话,必须在向浏览器输出任何内容之前调用session_start()

但是,时区警告是之前发送的。

设置php.ini文件的时区。

编辑.. 不仅这个问题。您必须在mysql_fetch_assoc()之前对sql请求使用mysql_query()函数。

+1

谢谢,但我不认为这是这里的问题。在添加密码验证功能之前,session_start()处于最佳状态,并在此页面上正常工作。 (之前有一个静态的用户名和密码。) – Johanna

0

是“闻香”约你显示代码的唯一一点是这样的:

if ($password == $passwordindatabase) { 

我更愿意看到这样的事情:

if (strcmp($password, $passwordindatabase) == 0) { 

而且我们需要看到您实际将值插入到users表中的代码,因为明确$password$passwordindatabase不匹配。

+0

我做到了“丑陋的方式”:$ salt1 ='how'; $ salt2 ='小马'; $ password = md5($ salt1。“qwerty”。$ salt2); echo $ password;然后将查询浏览器中回复的内容复制到SQL插入查询中。只是想要测试一下。表用户有三个字段:id(自动递增整数),名称和密码。 – Johanna