我正在使用MySQLi。此查询工作正常,我得到一个整数值。但这不是一个安全的查询,所以我试图做一个安全的。
$stm=mysqli_query($db,"SELECT post_amount FROM users WHERE login='$login'");
$stmone=mysqli_fetch_assoc($stm);
$stmtwo=implode($stmone);
echo($stmtwo);
这是我从不同来源尝试的内容。在这种情况下,我会收到关于get_result
和implode
以及白屏的警告。
$stm = $db->prepare('SELECT post_amount FROM users WHERE login = ?');
$stm->bind_param('s', $login);
$stm->execute();
$result = $stm->get_result();
$stmone=mysqli_fetch_assoc($result);
$stmtwo=implode($stmone);
echo($stmtwo);
在这种情况下,没有白屏,只显示没有值,并在日志中显示此警告
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result
代码:
$stm = $db->prepare('SELECT post_amount FROM users WHERE login = ?');
$stm->bind_param('s', $login);
$stm->execute();
$stmone=mysqli_fetch_assoc($stm);
echo($stmone);
有什么问题?任何人都可以解释如何做出正确,简单和有效的查询吗?
答案 0 :(得分:1)
您需要检查查询是否成功运行。
$stm = mysqli_query($db,"SELECT post_amount FROM users WHERE login='$login'");
if(!$stm) {
die('Error: ' . mysqli_error($db));
} else {
.. fetch results and all.
}
我建议你不要像你那样使用mysqli。您需要使用mysqli_real_escape_string()
或类似的东西来转义变量,因为当前查询会导致sqli注入。
最好在PDO中使用预先准备好的陈述。
虽然使用下一段代码,但您需要检查prepare()
是否成功。
if (!($stmt = $db->prepare('SELECT post_amount FROM users WHERE login = ?'))) {
echo "Prepare failed: (" . $db->errno . ") " . $db->error;
} else {
.. fetch data
}
下一个问题是,您可以检查执行是否也成功:
if(!$db->execute()) {
die("Execute failed: (" . $db->errno . ") " . $db->error;);
}
要获取数据,您需要使用:
while ($row = $stm->fetch_assoc()) {
.. do stuff with the data
}
答案 1 :(得分:0)
$result
为false,这就是您收到错误消息的原因。做一个if语句来测试$result = true
。
您还应该转义数据。查看mysqli_real_escape_string
我建议您使用“安全变量”,在我看来更为简单。
$unsafe_variable = $login;
$safe_variable = mysqli_real_escape_string($unsafe_variable);
$stm=mysqli_query($db,"SELECT post_amount FROM users WHERE login='" . $safe_variable . "'");
$stmone=mysqli_fetch_assoc($stm);
$stmtwo=implode($stmone);
echo($stmtwo);