- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我目前正在尝试为我的浏览器游戏创建一个登录表单,这需要多个查询才能正常工作。我首先开始使用 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/
我在尝试修改某些表时不断收到此错误。这是我的代码: /** = 1){ //$this->mysqli->autocommit(FALSE); //insert th
这是我的代码...它是关于使用 php mysqli 扩展 connect_errno) { die('Unable to connect to database'); } mysqli_se
这个问题已经有答案了: Catchable fatal error: Object of class mysqli_stmt could not be converted to string (2 个
我在向 MySQL 中插入数据时遇到问题。这是错误,我找不到解决方案。phpmyadmin 阵营和某些名称在 : PHPMYADMIN - 名称: 电子邮件 -> 电子邮件 密码 -> pass1 n
我正在使用 mysqli 类和准备好的语句在 PHP 中编写一个数据库处理程序类。我试图打印出结果。它并没有立即起作用,所以我决定进行一些调试。我尝试使用 mysqli_statement 类中的 n
我正在尝试将日期字段添加到源并保存到 PHP/MySQL 数据库。我正在使用 phpMyAdmin 并将“edate”字段设置为“DATE”类型。 我保存数据的 PHP 文件是: $statement
这是我的登录PHP代码 prepare($sql); $stmt->bind_param("s",$user_uid); $stmt->execute();
我很难理解如何正确使用bindParam(); 我一直在关注以下 URL 的详细信息:http://php.net/manual/en/pdo.prepared-statements.php其中的示例
这是我的代码: include 'conn.php'; $conn = new Connection(); $query = 'SELECT EmailVerified, Blocked FROM u
这个问题已经有答案了: warning :: invalid object or resource mysqli_stmt. What is the meaning and solution(s)?
我正在创建一个用户注册系统,当我开始修改数据库时出现错误“警告:mysqli_stmt::bind_param():类型定义字符串中的元素数量与第 41 行/opt/lampp/htdocs/Proj
这个问题已经有答案了: Call to undefined method mysqli_stmt::get_result (10 个回答) 已关闭 9 年前。 我正在将所有脚本更改为使用 mysqli
所以,我目前正在尝试为我的浏览器游戏创建一个登录表单,这需要多个查询才能正常工作。我首先开始使用 PHP 和 MySQL 进行查询的正常过程,但很快发现由于 SQL 注入(inject),这并不是最好
这是我的代码: include 'conn.php'; $conn = new Connection(); $query = 'SELECT EmailVerified, Blocked FROM u
这是我的代码: include 'conn.php'; $conn = new Connection(); $query = 'SELECT EmailVerified, Blocked FROM u
这个问题在这里已经有了答案: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in
这是我的代码: include 'conn.php'; $conn = new Connection(); $query = 'SELECT EmailVerified, Blocked FROM u
我试图将可变数量的参数传递给类的方法。这是我试图调用的类的函数: class DbHelper{ .... public function Execute($query, $params){
下面的代码抛出了神秘的警告。我不明白他们的意思。这些错误表明什么以及如何消除它们? require "conn.php"; $q = mysqli_stmt_init($dbconn); $query
我正在构建一个简单的留言板,需要从 3 个不同的表中获取信息来显示主要摘要页面。我正在使用 mysqli_stmt 协议(protocol),无法弄清楚如何获取每个讨论的第一条消息和作者姓名,因为所有
我是一名优秀的程序员,十分优秀!