У меня проблемы с моим заказом в MySqli в PHP. Либо bind_param не работает, либо что-то еще. Я не уверен, что я здесь забываю, он просто не хочет принимать мою привязку. Заранее спасибо.
@ $db = new mysqli('localhost', 'root', '', 'books');
// if mysqli_connect_errno() is set, we did not successfully connect. Here we deal with the error.
if (mysqli_connect_errno()) {
echo 'Error: Could not connect to database. Please try again later.</body></html>';
die();
}
$sortOrder = 'title';
$query = "SELECT ISBN, Author, Title, Price FROM books ORDER BY ?";
$stmt = $db->prepare($query);
$stmt->bind_param('s', $sortOrder);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($isbn, $author, $title, $price);
echo "<p>Number of books found: " . $stmt->num_rows . "</p>";
$counter = 0;
if ($stmt->num_rows > 0) {
while ($stmt->fetch()) {
$newBook = new book($isbn, $author, $title, $price);
$bookList[$counter] = $newBook;
$counter++;
}
} else {
//Nothing
}
$stmt->free_result();
$db->close();






Вы не можете привязать идентификаторы (таблицы / столбцы), вы можете привязать только значения. Используйте белый список, чтобы проверить, является ли значение одним из известных пар, затем передайте его, если это так.
if (in_array($column, array('title', 'possible_other_column'))) {
$query = "SELECT ISBN, Author, Title, Price FROM books ORDER BY $column";
$stmt = $db->prepare($query);
$stmt->execute();
} else {
echo 'Column is not a valid name please select a valid column';
//or whatever behavior you want to happen, maybe just use a default column
Это имеет смысл. Интерполяция используется для интерполяции значений, а не имен столбцов. Например, WHERE id = ? необходимо преобразовать в WHERE id = "177". Так что mysqli, вероятно, просто интерполирует, даже не проверяя синтаксис SQL. Это означает, что ORDER BY ? превратится в ORDER BY "title", что неверно.
Спасибо вам за это, это помогло мне понять это