我已经找了又找,想找到我的确切情况。我想了解为什么这不起作用,我也想确保这个逻辑是安全的注入黑客。我知道没有什么是百分之百安全的。以下代码不起作用:
$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\u转储。当我使用var\u dump查询时,它会正确地告诉我受影响的行。所以对我来说,这意味着准备好的声明是有效的。但是,当我试图运行查询以便在屏幕上获取并输出数据时。
现在mysql也可以使用,但我正在尝试将其转换为mysqli以避免注入。最初有完整的sql语句,但现在使用prepared语句来避免这种情况。
1条答案
按热度按时间inkz8wg91#
您需要理解准备语句和常规查询之间的区别。一旦您以一个准备好的语句开始,您就必须以这种方式运行直到结束(除非您存储了结果)
mysqli_stmt::get_result()
,则可以使用mysqli::fetch_assoc()
以及类似的函数——这在本答案中没有涉及,请参见手册中的示例)。既然你有
*table*
在你的代码中,我认为这是不正确的。请相应地更改下面查询的前两行(所选列和所选表)。重要的是
bind_result()
与您在查询中选择的列数完全匹配。这些变量将为每个迭代保存列的值。这里有一个起点来引导你朝着正确的方向前进。更改的名称
column1
通过column3
相应地(都在查询字符串中(prepare()
)在结果的约束中bind_result()
). 如前所述,这是一对一的匹配。您还必须相应地更改表的名称,myTableName
当前只是一个占位符(按原样column1
通过column3
).手册也是阅读示例的好地方
mysqli::prepare()
mysqli::bind_param()mysqli::bind_result()