这个查询可以安全使用吗?准备好的声明?

时间:2013-09-09 01:11:15

标签: php mysql mysqli

此查询是否可以安全使用?我不确定如何将它转换为准备好的语句,因为它没有使用用户的任何值:

$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;
}

这样安全吗?我该如何改进呢?

感谢。

3 个答案:

答案 0 :(得分:3)

是的,这很安全。根本没有用户输入;没有任何东西可能会破坏查询语法或以任何方式操纵结果。

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

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

答案 1 :(得分: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列。

答案 2 :(得分:-1)

是的,这是安全的。如果你决定将参数传递给你的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
    }