【问题标题】:How can I compare the content of the database with the input? [duplicate]如何将数据库的内容与输入进行比较? [复制]
【发布时间】:2013-09-26 18:46:30
【问题描述】:

我知道我可以连接到数据库。在我修改我的代码之前,我已经检查过了。

当管理员登录时,我想重定向到tableedit.php,但如果用户不是管理员,我想重定向到tableuser.php

这是错误:

警告:mysql_fetch_array() 期望参数 1 是资源,字符串在第 47 行的 C:\xampp\htdocs\joy\inventory\login.php 中给出 查询失败

代码如下:

//Create query
$qry="SELECT * FROM user WHERE username='$username' AND password='".md5($_POST['password'])."'";

while($row=mysql_fetch_array($qry));

$result = $row['username'];
{
//Check whether the query was successful or not
if($result) {
    if(mysql_num_rows($result)== 'admin'){
        session_regenerate_id();
        $member = mysql_fetch_assoc($result);
        $_SESSION['SESS_MEMBER_ID'] = $member['id'];
        $_SESSION['SESS_FIRST_NAME'] = $member['username'];
        $_SESSION['SESS_LAST_NAME'] = $member['password'];
        session_write_close();
        header("location: tableedit.php");
        exit();
    }
    elseif(mysql_num_rows($result) != 'admin') {
        //Login Successful   
        session_regenerate_id();
        $member = mysql_fetch_assoc($result);
        $_SESSION['SESS_MEMBER_ID'] = $member['id'];
        $_SESSION['SESS_FIRST_NAME'] = $member['username'];
        $_SESSION['SESS_LAST_NAME'] = $member['password'];
        session_write_close();
        header("location: tableuser.php");
        exit();
    } else {
        //Login failed
        $errmsg_arr[] = 'Username and password not found.';
        $errflag = true;
        if($errflag) {
            $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
            session_write_close();
            header("location: index.php");
            exit();
        }
    }
} else {
    die("Query failed");
}}

【问题讨论】:

  • 坦率地说,代码是一团糟。在寻求帮助之前,请尝试阅读 php 手册php.net/docs.php

标签: php mysql sql database session


【解决方案1】:

您应该首先执行 mysql_query 并将结果放入一个数组中。在此之后:

   $qry="SELECT * FROM user WHERE username='$username' AND
         password='".md5($_POST['password'])."'";

这样做:

$result = mysql_query($qry);

接下来,

 while($row = mysql_fetch_array($result)){
    // stuff
    }

此外,建议您将 salt 与 md5 一起使用,以获得良好的安全性。要进一步补充, 您可以使用 sha1 以获得更好的安全性

【讨论】:

    【解决方案2】:

    mysql_fetch_array 需要一个 MySQL 资源作为参数。资源是从mysql_query返回的,所以应该是

    $qry = 'YOUR QUERY';
    $res = mysql_query($qry);
    while ($row = mysql_fetch_array($res))
    

    并且...mysql_num_rows 永远不会返回'admin'(它返回整数,给定资源中的行数),因此您将始终被重定向到tableuser.php

    在这种情况下你不需要“elseif”,“else”在这里会很棒:)

    还有,为什么要使用 mysql_* 函数?试试 PDO :)

    【讨论】:

      【解决方案3】:

      您的代码存在许多问题...很多mysql_* 函数并没有像您认为的那样工作,您使用什么资源来学习?

      对于大多数 php 函数,您可以访问:http://php.net/FUNCTION_NAME

      例子:

      1. http://php.net/mysql_query
      2. http://php.net/mysql_num_rows
      3. http://php.net/mysql_fetch_array

      代码

      以下代码应该可以帮助您入门。您可以在相关位置添加所有 $_SESSION 内容(参见 cmets)。

      $password = md5($password);
      $qry= mysql_query("SELECT * FROM user WHERE username='$username' AND password='$password'");
      if(mysql_num_rows($qry)){
          while($row = mysql_fetch_array($qry)){
              if($row['uername'] == 'admin'){
                  //The user IS the admin
                  header('location:tableedit.php');
              }
              else{
                  //The user is NOT admin
                  header('location:tableuser.php');
              }
          }
      }
      else{
          //Login failed
          header('location:/');
      }
      
      exit; //Only need this once at the end
      

      mysqli::

      我强烈建议您也考虑更改为mysqli(或PDO)...如果您要这样做,以下内容将帮助您开始:

      $mysqli = new mysqli('localhost', 'USERNAME', 'PASSWORD', 'DATABASE'); //Replace USERNAME, PASSWORD, DATABASE to the actual database username etc.
      
      $password = md5($password);
      $qry= $mysqli->query("SELECT * FROM user WHERE username='$username' AND password='$password'");
      if($qry->num_rows){
          while($row = $qry->fetch_assoc()){
              if($row['uername'] == 'admin'){
                  //The user IS the admin
                  header('location:tableedit.php');
              }
              else{
                  //The user is NOT admin
                  header('location:tableuser.php');
              }
          }
      }
      else{
          //Login failed
          header('location:/');
      }
      
      exit; //Only need this once at the end
      

      有关更多信息,请查看文档:

      1. http://php.net/mysqli_query
      2. http://php.net/mysqli_num_rows
      3. http://php.net/mysqli_fetch_assoc
      4. http://php.net/mysqli

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多