-2

这个查询使用安全吗?我不确定如何将其转换为准备好的语句,因为它没有使用来自用户的任何值:

$result = mysqli_query($cxn, "SELECT * FROM table WHERE datetime > DATE_SUB(NOW(), INTERVAL 15 DAY) ORDER BY RAND() LIMIT 1");

while ($row = mysqli_fetch_array($result)) {
  $title = $row['title'];

  echo $title;
}

这可以安全使用吗?我该如何改进它?

谢谢。

4

3 回答 3

3

是的,它是安全的。那里根本没有使用用户输入;没有任何东西有可能弄乱查询语法或以任何方式操纵结果。

至于改进,如果您只使用字段,则无需返回表中的每个title字段。通常,您应该避免使用通配符 ( *) 进行 SELECT 查询,除非是出于测试目的。

此外,DATE_SUB(NOW(), INTERVAL 15 DAY)可以简化为NOW() - INTERVAL 15 DAY。更短更甜;没有不必要的函数调用。

于 2013-09-09T01:20:05.873 回答
1

你能做的最大的改进就是改变

SELECT * FROM table WHERE datetime > DATE_SUB(NOW(), INTERVAL 15 DAY) ORDER BY RAND() LIMIT 1

SELECT title FROM table WHERE datetime > DATE_SUB(NOW(), INTERVAL 15 DAY) ORDER BY RAND() LIMIT 1

因为您只使用title代码中的列。

于 2013-09-09T02:38:47.380 回答
0

是的,它是安全的。如果您决定将参数传递给您的 sql,最好使用准备好的语句。这是带有参数的示例:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

这是您的 sql 的示例/答案:

  $stmt = $dbConnection->prepare('SELECT * FROM table WHERE datetime > DATE_SUB(NOW(), INTERVAL 15 DAY) ORDER BY RAND() LIMIT 1');
    $stmt->execute();

    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }
于 2013-09-09T01:22:47.750 回答