mysqli使用带有预准备语句和查询的select *

时间:2018-07-02 21:00:02

标签: php mysql select mysqli

我已经筋疲力尽了,一直想找到我的确切情况。我想了解为什么这行不通,而且我想确保这种逻辑在注入黑客攻击中更安全。我知道没有什么是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语句,但现在使用了准备好的语句来避免这种情况。

1 个答案:

答案 0 :(得分:3)

您需要了解准备好的语句和常规查询之间的区别。从准备好的语句开始之后,您必须以这种方式运行到最后(除非您通过mysqli_stmt::get_result()存储结果,然后您就可以使用mysqli::fetch_assoc()和类似的函数-本文档未涵盖答案,请参见手册以获取示例)。

鉴于您的代码中包含*table*,我认为这是不正确的。请相应地更改下面查询的前两行(您选择的列和您选择的表的形式)。

赋予bind_result()的变量数量与您在查询中选择的列数量完全匹配非常重要。这些变量将保存每次迭代的列值。

这是指导您正确方向的起点。相应地更改column1column3的名称(在查询字符串(prepare()中)和在结果bind_result()的绑定中)。如前所述,这些是一对一的匹配。您还必须相应地更改表的名称,myTableName当前只是一个占位符(column1column3也是这样)。

// 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();

手册也是阅读示例的好地方