mysqli使用select*和一个准备好的语句和查询

nukf8bse  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(347)

我已经找了又找,想找到我的确切情况。我想了解为什么这不起作用,我也想确保这个逻辑是安全的注入黑客。我知道没有什么是百分之百安全的。以下代码不起作用:

$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语句来避免这种情况。

inkz8wg9

inkz8wg91#

您需要理解准备语句和常规查询之间的区别。一旦您以一个准备好的语句开始,您就必须以这种方式运行直到结束(除非您存储了结果) 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();

手册也是阅读示例的好地方 mysqli::prepare() mysqli::bind_param() mysqli::bind_result()

相关问题