此查询是否可以安全使用?我不确定如何将它转换为准备好的语句,因为它没有使用用户的任何值:
$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;
}
这样安全吗?我该如何改进呢?
感谢。
答案 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
}