【问题标题】:Unable to retrieve data from MySQL table无法从 MySQL 表中检索数据
【发布时间】:2013-02-13 09:06:04
【问题描述】:

首先,我是 php 新手。我也是 MySQL 的新手,所以对我要温柔。其次,我知道 mysql_* 已贬值,一旦我了解更多,这将在稍后修复。

所以我有以下代码:

        if(isset($_POST['email']) && !empty($_POST['email']) AND isset($_POST['password']) && !empty($_POST['password'])){
            $email = mysql_escape_string($_POST['email']);
            $password = mysql_escape_string($_POST['password']);

            $search = mysql_query("SELECT * FROM users WHERE email='".$email."' AND password='".$password."' AND active='1'") or die(mysql_error()); 
            $match  = mysql_num_rows($search);

            if($match > 0){
                $user=$search['forename'] .' '.$search['surname'];
                $_SESSION['username']=$user;
                $msg = 'Login Complete! Thanks, '.$user.'!';
            }else{
                $msg = 'Login Failed!<br /> Please make sure that you enter the correct details and that you have activated your account.';
            }
        }

很简单,我正在检查电子邮件和密码是否匹配(我知道这不是散列密码……再说一次,这不是问题,因为它是一个测试)。如果他们这样做了,并且帐户已被激活,那么我想返回用户的名字和姓氏(用户表中的名字/姓氏)并将它们存储在会话变量中。如果该变量 isset,我想使用此信息来确认用户已登录(因此可以访问某些页面)。但是,此测试不返回用户名,而是输出:

登录完成!谢谢!

任何帮助将不胜感激。

【问题讨论】:

  • mysql_num_rows 现在已弃用。使用 PDO 或 mysqli。
  • 你需要 mysql_fetch_array: while ($row = mysql_fetch_array($search)) { $user=$row['forename'] .' '.$row['姓氏']; }
  • 运行这个会发生什么?你得到一个sql连接错误?还是什么都没有?
  • 请阅读帖子。我知道它已被弃用(我实际上是这样说的)。另外,我在帖子底部附近列出了脚本的输出。
  • 首先,请不要使用mysql_*。此扩展自 PHP 5.5.0 起已弃用。 php.net/manual/en/function.mysql-query.php 您可以使用 mysqli_query() 或 PDO::query()。

标签: php mysql sql


【解决方案1】:

你需要做$row = mysql_fetch_array($search);

然后

$user=$row['forename'] .' '.$row['surname'];

【讨论】:

    【解决方案2】:

    请记住mysql_query 返回的值是资源,因此您需要将结果行作为关联数组获取。

    while ($row = mysql_fetch_assoc($search)) 
    {
        $user=$row['forename'] .' '.$row['surname'];
        $_SESSION['username']=$user;
    }
    

    作为旁注,如果变量的值(s)来自外部,则查询很容易受到SQL Injection 的攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

    【讨论】:

    • 这非常有效。我删除了循环,因为它应该最多只有 1 条记录(电子邮件是主键)。现在我只需要开始检查会话是否运行良好。我一直想了解更多关于停止注射的信息,所以我一定会检查链接,谢谢!
    • 这与 mysql_fetch_array 有何不同?
    【解决方案3】:

    你替换你的代码 /*************您的代码****/ if(isset($_POST['email']) && !empty($_POST['email']) AND isset($_POST['password']) && !empty($_POST['password'])){ $email = mysql_escape_string($_POST['email']); $password = mysql_escape_string($_POST['password']);

            $search = mysql_query("SELECT * FROM users WHERE email='".$email."' AND password='".$password."' AND active='1'") or die(mysql_error()); 
            $match  = mysql_num_rows($search);
    
            if($match > 0){
                $user=$search['forename'] .' '.$search['surname'];
                $_SESSION['username']=$user;
                $msg = 'Login Complete! Thanks, '.$user.'!';
            }else{
                $msg = 'Login Failed!<br /> Please make sure that you enter the correct details and that you have activated your account.';
            }
        }
    

    /************* strong>我的代码****/

        if(isset($_POST['email']) && !empty($_POST['email']) AND isset($_POST['password']) && !empty($_POST['password'])){
            $email = mysql_escape_string($_POST['email']);
            $password = mysql_escape_string($_POST['password']);
    
            $search = mysql_query("SELECT * FROM users WHERE email='".$email."' AND password='".$password."' AND active='1'") or die(mysql_error()); 
            $match  = mysql_num_rows($search);
    
            if($match > 0){
                $search = mysql_fetch_array($search); 
                $user=$search['forename'] .' '.$search['surname'];
                $_SESSION['username']=$user;
                $msg = 'Login Complete! Thanks, '.$user.'!';
            }else{
                $msg = 'Login Failed!<br /> Please make sure that you enter the correct details and that you have activated your account.';
            }
        }
    

    【讨论】:

    • 请不要举出mysql_*等已弃用函数的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2021-05-25
    • 2022-08-14
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多