PHP / MySQL - 检查结果

时间:2014-04-30 05:16:49

标签: php mysql

我尝试使用PHP创建登录系统,但SQL查询未返回我期待的结果。

我有一个典型的用户名和密码页面,我使用用户在其中键入的内容来检查帐户。我知道数据库包含真实的用户名和密码,但对mysqli_num_rows的调用始终返回0。

我做错了吗?

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysqli_query($con, "SELECT * FROM StaffTable WHERE staffNo='$username' AND password='$password'");

echo mysqli_num_rows($result); //This always prints out 0.
if(mysqli_num_rows($result) == 1)
{
    echo "OK";
}

2 个答案:

答案 0 :(得分:2)

忽略您声称知道的纯文本密码事物,或许这样......

$username = isset($_POST['username']) ? $_POST['username'] : null;
$password = isset($_POST['password']) ? $_POST['password'] : null;

$stmt = $con->prepare('SELECT 1 FROM StaffTable WHERE staffNo = ? AND password = ?');
if (!$stmt) {
    throw new Exception($con->error, $con->errno);
}
$stmt->bind_param('ss', $username, $password);
if (!$stmt->execute()) {
    throw new Exception($stmt->error, $stmt->errno);
}
if ($stmt->fetch()) {
    echo 'OK';
}

总结......

  • 我已检查输入变量是否已设置并指定默认值,如果他们不应该产生任何误报
  • 我已经使用带有绑定参数的预准备语句来避免SQL注入漏洞
  • 发生错误时抛出异常。这些很棒,因为它们会暂停执行并为您提供调试问题所需的所有信息。
    • 这是我在PDO上使用 mysqli 的主要问题。发生错误时, mysqli 根本不够嘈杂。您不必一直手动检查错误情况。
  • 我已将查询更改为简单的布尔检查,因为您使用的是所有内容。该行存在,或者它没有。

答案 1 :(得分:0)

尝试更多内容

                        $username=$_POST['username'];
                        $password=md5($_POST['password']);
                        $query="SELECT * FROM StaffTable WHERE staffNo='".$username."' AND password='".$password."'";
                        $result=mysqli_query($con,$query);
                        if (mysqli_num_rows($result)==0) 
                            { 
                                echo "Incorrect Password Or Username Combo";

                            }
                        else {
                            while($row=mysqli_fetch_object($result)) {
                                    $_SESSION['id']=$row['id'];
                                    }

我想说的是,至少现在至少在加密中运行密码,并在了解更多有关您正在查看的内容时查看SQL注入和升级。 除了已经指出的内容之外,你的最大缺陷是

($con, "SELECT * FROM StaffTable WHERE staffNo='$username' AND password='$password'");

使用变量,您不能将它们放在查询中;你想要做更多的事情

($con, "SELECT * FROM StaffTable WHERE staffNo='".$username."' AND password='".$password."'");

如果您注意到我从纯文本中转义,那么将设​​置变量。您每次返回0结果的原因是因为您实际上是在搜索用户名$ username并使用$ password作为其密码。 祝你好运!