是否可以将准备好的语句与*和ORDER BY一起使用?
因为我不知道怎么做。我已经试了一段时间了。我看了一些其他的线索,但还没有找到如何做到。如果没有,我该如何获得这样的mysqli查询并防止sql注入?
如果有任何想法或批评,我将不胜感激。
谢谢,马特
<?php
require ($_SERVER['DOCUMENT_ROOT'].'/db-connect.php');
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if ($stmt = $conn->prepare("SELECT * FROM websites ORDER BY ? DESC LIMIT 1")){
$id = 'id';
$stmt->bind_param('s',$id);
$stmt->execute();
$stmt->store_result();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
echo $row['title'];
$stmt->free_result();
$stmt->close();
}
$conn->close();
?>
不能使用占位符作为列名。您需要将其硬编码为:
$stmt = $conn->prepare("SELECT * FROM websites ORDER BY `id` DESC LIMIT 1");
或者做一些类似的事情来允许用户输入:
switch ($_POST['sortby']) {
// Add all possible column names here
case 'id':
case 'col2':
case 'col3':
case 'col4':
case 'col5':
$sortby = $_POST['sortby'];
break;
default:
throw new Exception("Invalid sort by");
}
$stmt = $conn->prepare("SELECT * FROM websites ORDER BY `$sortby` DESC LIMIT 1");