gpt4 book ai didi

php - mysqli_stmt 有问题(程序风格)

转载 作者:行者123 更新时间:2023-11-29 04:36:03 28 4
gpt4 key购买 nike

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

所以,我决定使用 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 是输入的用户名user) 它仍然说“没有那个用户名的用户”,这意味着 mysqli_stmt_num_rows($stmt) 出于某种原因返回 0。这是我不明白的。

我真的希望我已经足够清楚了,在此先感谢您的帮助。

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

最佳答案

您在 WHERE 子句中传递了一个变量:

WHERE username='$playername'

代替占位符,需要更改为:

WHERE username=?

因为您想使用准备好的语句。

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

使用适当的错误检查会有所帮助:

如果您要查看是否存在一行(这里似乎就是这种情况),请参阅我的一个答案,它使用了准备好的语句:

还有一个 PDO 方法。

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

$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.";

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

关于php - mysqli_stmt 有问题(程序风格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41349431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com