我已经筋疲力尽了,一直想找到我的确切情况。我想了解为什么这行不通,而且我想确保这种逻辑在注入黑客攻击中更安全。我知道没有什么是100%安全的。以下代码不起作用:
$query= mysqli_prepare($con,"SELECT * FROM *table*
WHERE Resource = ? AND WorkDate >= ? AND WorkDate <= ? ORDER BY WorkDate, StartTime" );
mysqli_stmt_bind_param($query, "sss", $resource, $from, $to);
mysqli_execute($query);
if (!mysqli_stmt_execute($query))
{
die('Error: ' . mysqli_error());
}
mysqli_stmt_store_result($query);
mysqli_stmt_fetch($query);
$result= mysqli_query($con,$query, MYSQLI_STORE_RESULT); // or die("Could not get results: ".mysqli_error());
while($rows=mysqli_fetch_array($result)){<fill in table>
此代码在$ result行中终止。我已经在查询和所有变量上完成了var_dumps。当我进行var_dump查询时,它会正确告诉我受影响的行。所以对我来说,这意味着准备好的声明正在奏效。但是,当我尝试运行查询时,可以提取查询以在屏幕上输出数据。
现在这适用于mysql,但我正尝试将其转换为mysqli以避免注入。最初有完整的sql语句,但现在使用了准备好的语句来避免这种情况。
答案 0 :(得分:3)
您需要了解准备好的语句和常规查询之间的区别。从准备好的语句开始之后,您必须以这种方式运行到最后(除非您通过mysqli_stmt::get_result()
存储结果,然后您就可以使用mysqli::fetch_assoc()
和类似的函数-本文档未涵盖答案,请参见手册以获取示例)。
鉴于您的代码中包含*table*
,我认为这是不正确的。请相应地更改下面查询的前两行(您选择的列和您选择的表的形式)。
赋予bind_result()
的变量数量与您在查询中选择的列数量完全匹配非常重要。这些变量将保存每次迭代的列值。
这是指导您正确方向的起点。相应地更改column1
至column3
的名称(在查询字符串(prepare()
中)和在结果bind_result()
的绑定中)。如前所述,这些是一对一的匹配。您还必须相应地更改表的名称,myTableName
当前只是一个占位符(column1
到column3
也是这样)。
// Prepare the query
$stmt = $con->prepare("SELECT column1, column2, column3
FROM myTableName
WHERE Resource = ?
AND WorkDate >= ?
AND WorkDate <= ?
ORDER BY WorkDate, StartTime");
if (!$stmt) {
// Check for errors, if the prepare failed, it will return 'false'
echo "An unexpected error occurred, check the logs.";
error_log($con->error);
exit;
}
// Bind the parameters (?) in the query and execute it
$stmt->bind_param("sss", $resource, $from, $to);
if (!$stmt->execute()) {
echo "An unexpected error occurred, check the logs.";
error_log($stmt->error);
$stmt->close();
exit;
}
// Bind the results of each column into a variable
$stmt->bind_result($column1, $column2, $column3);
// In this loop we use the variables that we bound in the function bind_result above
// In this example, we simply print their values
while ($stmt->fetch()) {
echo "$column1 -- $column2 -- $column3";
}
// Close the statement after use!
$stmt->close();
手册也是阅读示例的好地方