在 mysql/php 中选择查询无法正常工作


Select query in mysql/php does not work correctly

我用PHP和Mysql为登录页面编写了一个简单的代码但它总是在条件 (if) 中返回 false 值。怎么了?这是我的代码:

..... (successfully connected to database)
$User = $_POST['username'];
    $Pass = md5($_POST['password']);
      $sql = "SELECT ID FROM users WHERE Username=$User and Password=$Pass";
      $result = $conn->query($sql);
      $count = mysql_num_rows($result);
      if($count == 1) {
            $_SESSION['username'] = $User;
            header( 'Location: panel.php' ) ;
        }
         else {
               header( 'Location: login.php?status=1' ) ;
              }
    }

我的印象是,您在使用mysqli_函数时$result = $conn->query($sql);然后使用mysql_函数mysql_num_rows()之后使用面向对象的样式进行连接。

  • mysql_不支持此方法。

根据手册
的面向对象的连接样式示例http://php.net/manual/en/mysqli.query.php:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

这些不同的 API 不会相互混合。

旁注:如果不是这种情况,那么您需要向我们展示您用于连接到数据库的 API。

另外,事实上,在注释中已经建立了您需要在WHERE子句中引用变量的事实。

因此,您需要更改

$count = mysql_num_rows($result);

$count = mysqli_num_rows($result);

$count = $result->num_rows;

根据 http://php.net/manual/en/mysqli-result.num-rows.php 使用面向对象的样式。

以及 WHERE 条款

WHERE Username='$User' and Password='$Pass'

我注意到您正在使用MD5。如果是这种情况,强烈建议不要这样做,因为它很旧并且被认为是"破损的"。

我建议您使用 CRYPT_BLOWFISH 或 PHP 5.5 的 password_hash() 函数。对于 PHP <5.5,请使用 password_hash() compatibility pack

另外,关于SQL注入,这是你的代码所受的,将mysqli预准备语句一起使用,或者将PDO与预准备语句一起使用,它们要安全得多

@Fred-ii-是正确的。

$sql = "SELECT ID FROM users WHERE Username=$User and Password=$Pass";

将导致此查询发送到数据库:

SELECT ID FROM users WHERE Username=user and Password=password

你需要引用userpassword,否则MySQL不会知道它们是字符串:

$sql = "SELECT ID FROM users WHERE Username='$User' and Password='$Pass'";

获得$count的正确方法是

$count = $result->rowCount();

如果还有其他问题,我会在这个答案中添加更多内容。