0

我想要做的是设置不同的登录页面,登录后,基于访问级别,我当然是在谈论 PHP 和 MySQL :)

我有一个带有用户表的数据库,用户表基本上有 3 个字段:

user,pass,access

我有 2 个基本访问级别:

(1=user, 5=admin)

我在网上找到了一些例子,甚至在这里,但由于某种原因,我无法使它工作。这是我得到的:

login.php

<form id="form" name="form" method="POST" action="login_engine.php">
<p>Please enter your login information:</p>
<label>User</label><input type="text" name="Username" id="Username" />
<label>Password</label><input type="password" name="Password" id="Password" />
<input name="submit" type="submit" id="submit" value="Login">
</form>

这是引擎:

<?php
include "connect.php";

// username and password sent from form
$MyUsername = $_POST['Username'];
$MyPassword = $_POST['Password'];


$sql="SELECT * FROM tbl_users WHERE user=$MyUsername and pass=$MyPassword";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count===1){
  // Register $myusername, $mypassword and redirect to file "home.php"
  session_register("user");
  session_register("pass");
  while($row = mysql_fetch_array($result))
  {
    if($row['access']=='5')
    {
      header("home1.php");
    }
    else
    {
      header("home2.php");
    }
  }
} else {
  echo "Invalid! Please try again PC.";
  echo "<br>";
  echo $_POST['Username'];
  echo "<br>";
  echo $MyUsername;
  echo "<br>";
  echo $_POST['Password'];
  echo "<br>";
  echo $MyPassword;
  echo "<br>";
  echo $sql;
  echo "<br>";
  echo $result;
  echo "<br>";
  echo $count;
}

//mysql_close();
?>

这是输出:

Invalid! Please try again PC.
userdemo
userdemo
mypassword
mypassword
SELECT * FROM tbl_users WHERE user=userdemo and pass=mypassword

出现问题的第一个迹象是变量 $result 和 $count 没有打印在错误消息上(然后我显示了一些消息,但我更改了代码太多以至于我忘记了我做了什么然后停止显示信息,但我记得 $result 显示的是“... #4”,而 $count 显示的是“0”。)

我知道出了点问题,因为它到了 PHP 脚本的末尾:最后一个 else,但$sql似乎是正确的(我可能在这里错了)。

有人知道这里可能出了什么问题吗?

4

3 回答 3

0

将字符串括在引号内:

SELECT * FROM tbl_users WHERE user=userdemo and pass=mypassword

将其替换为:

SELECT * FROM tbl_users WHERE user='userdemo' and pass='mypassword'
于 2012-12-08T05:29:07.740 回答
0

单引号应该可以正常工作,但您也可以尝试:

<?php
include "connect.php";

if (!empty($_POST)) {
    // username and password sent from form
    $MyUsername = mysql_real_escape_string($_POST['Username']);
    $MyPassword = mysql_real_escape_string($_POST['Password']);

    $sql = "SELECT * FROM tbl_users WHERE user='" . $MyUsername . "' AND pass='" . $MyPassword . "'";
    $result = mysql_query($sql) or die(mysql_error());
    $count = mysql_num_rows($result);

    if ($count) {
        // Register $myusername, $mypassword and redirect to file "home.php"
        session_register("user");
        session_register("pass");
        while ($row = mysql_fetch_array($result)) {
            if ($row['access'] == '5') {
                header("home1.php");
            } else {
                header("home2.php");
            }
        }
    } else {
        echo "Invalid! Please try again PC.";
        echo "<br>";
        echo $_POST['Username'];
        echo "<br>";
        echo $MyUsername;
        echo "<br>";
        echo $_POST['Password'];
        echo "<br>";
        echo $MyPassword;
        echo "<br>";
        echo $sql;
        echo "<br>";
        echo $result;
        echo "<br>";
        echo $count;
    }
}
//mysql_close();
?>

您还应该考虑将查询限制为 1 个结果,然后摆脱 while 循环。我还添加mysql_real_escape_string()了您的$_POST变量。

于 2012-12-08T06:29:12.940 回答
0

您当前的代码应始终将行数返回为 0;这是因为 sql 语句中的所有字符串输入。代替

 
  $sql="SELECT * FROM tbl_users WHERE user=$MyUsername and pass=$MyPassword";
 

 
  $sql="SELECT * FROM tbl_users WHERE user='$MyUsername' and pass='$MyPassword'";
 

这解决了您当前的部分问题,除非用户传递输入中包含撇号,在这种情况下,我们将回到原点。
使用

 
   $MyUsername = mysql_real_escape_string($MyUsername);
   $MyPassword = mysql_real_escape_string($MyPassword);
 

在我的初始代码应该解决该问题之前。
这回答了您的问题并解决了您当前的问题。

更重要的是

一是mysql已经贬值;_ 停止将它用于新项目,并将现有项目转换为MySQLiPDO
其次,该代码非常不安全;由于 SQL 注入,您的数据可能会被擦除。使用第一点中建议的方法使其更安全。

希望这会有所帮助......在所有。

于 2012-12-08T06:55:23.007 回答