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

时间:2015-01-17 20:26:23

标签: php mysql

我使用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' ) ;
              }
    }

3 个答案:

答案 0 :(得分: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使用面向对象的样式。

和<{p}的WHERE子句

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

我注意到你正在使用MD5。如果是这种情况,则非常气馁,因为它已经过时并被视为“破损”。

我建议您使用CRYPT_BLOWFISH或PHP 5.5的password_hash()功能。对于PHP&lt; 5.5使用password_hash() compatibility pack

另外,关于SQL注入,这是您的代码所适用的,use mysqli with prepared statementsPDO with prepared statements,它们更安全

答案 1 :(得分:0)

@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'";

答案 2 :(得分:0)

获得$ count的正确方法是

$count = $result->rowCount();

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