遇到问题mysqli_stmt(程序风格)

时间:2016-12-27 17:22:47

标签: php mysql

所以,我正在尝试为我的浏览器游戏创建一个登录表单,这需要多个查询才能正常工作。我首先开始使用PHP和MySQL查询的正常程序,但很快就发现由于SQL注入它不是最好的方法。

所以,我决定使用stmt,根据stackoverflow,它更安全。

我的代码比这个大,但是我会把这个部分放在这里(我调试了剩下的代码,其他一切都很好,包括连接到MySQL服务器)

$stmt = mysqli_prepare($conn, "SELECT username FROM users WHERE username='$playername'");
    ´
//Im pretty sure this is where the bug is
mysqli_stmt_bind_param($stmt, "s", $playername);
//----------------------------------------  

mysqli_stmt_execute($stmt);

mysqli_stmt_bind_result($stmt, $dbusername);

mysqli_stmt_fetch($stmt);

$row_cnt = mysqli_stmt_num_rows($stmt);

if($row_cnt === 0) {

    mysqli_stmt_close($stmt);
    $error = true;
    $errorid = "There is no player registered with that username.";
    echo $errorid;

    }

我使用用户名" Syvered"在数据库中创建了一个条目。这是我目前正在测试的那个,当尝试在登录表单上使用该用户名时(注意$ playername是用户输入的用户名),它仍然说"没有这样的用户使用该用户名& #34;这意味着mysqli_stmt_num_rows($ stmt)由于某种原因返回0。这是我不明白的。

我真的希望我对你很清楚,谢谢你的帮助。

我检查过的问题,但遗憾的是没有帮助:

1 个答案:

答案 0 :(得分:4)

您在WHERE子句中传递变量:

WHERE username='$playername'

而不是占位符,需要更改为:

WHERE username=?

因为你想要使用准备好的陈述。

确保$playername确实有值,并且您已使用mysqli_ API成功连接。

使用正确的错误检查会有所帮助:

如果您正在查看是否存在某行(这里似乎就是这种情况),请参阅我的一个使用预准备声明的答案:

和PDO方法。

从我的一个答案中取得的一个例子,这是您需要做的事情,并将其替换为您在查询和变量中使用的内容:

$query = "SELECT `email` FROM `tblUser` WHERE email=?";

if ($stmt = $dbl->prepare($query)){

        $stmt->bind_param("s", $email);

        if($stmt->execute()){
            $stmt->store_result();

            $email_check= "";         
            $stmt->bind_result($email_check);
            $stmt->fetch();

            if ($stmt->num_rows == 1){

            echo "That Email already exists.";
            exit;

            }
        }
    }

修改

在测试代码之后,有些事情你在这里做得不正确。

你需要"存储"您的代码中缺少的结果。

然而,让我们尝试一种稍微不同的方法并检查它是否确实存在并回应它确实存在,如果没有;表明它没有。

旁注:如果有多个匹配,我在>=中使用了if($row_cnt >= 1)。如果需要,您可以更改它。

$playername = "Syvered"; // This could also be case-sensitive.

$stmt = mysqli_prepare($conn, "SELECT username FROM users WHERE username = ?");

    mysqli_stmt_bind_param($stmt, "s", $playername);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt); // Store the results which was missing.
    mysqli_stmt_bind_result($stmt, $dbusername);
    mysqli_stmt_fetch($stmt);

$row_cnt = mysqli_stmt_num_rows($stmt);

 if($row_cnt >= 1) {

    $error = false; // Changed from true
    $errorid = "It exists.";
    echo $errorid;

    mysqli_stmt_close($stmt);

    }

else{

echo "It does not exist.";

}
  • 您可以恢复使用条件的方式,但请记住"存储"结果。