使用php的用户和管理员的不同访问级别

时间:2012-12-08 05:26:29

标签: php mysql

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

我有一个带有users表的数据库,users表基本上有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脚本的末尾:最后一个,但$sql似乎是正确的(我可能在这里错了)。

任何人都知道这里可能出现什么问题?

3 个答案:

答案 0 :(得分:0)

将字符串括在引号中:

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

将其替换为:

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

答案 1 :(得分: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

答案 2 :(得分: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 depreciated;停止将其用于新项目,并将现有项目转换为MySQLiPDO
第二,该代码非常不安全;由于SQL注入,您的数据可以被擦除。使用第一点中建议的方法使其更安全。

希望这对......有帮助。