Я хочу создать форму поиска для своего сайта и иметь возможность выполнять поиск, выбирая несколько параметров, используя LIKE и, в конечном итоге, ORDER BY. Поиск по имени, стране и дате.
InnoDB, сортировка utf8mb4_unicode_ci, php 5.6
<?php
if (isset($_POST['search'])){
$sql = 'SELECT * FROM radio_posts';
$where = array();
$params = array();
if (!empty($_POST['postRadioName'])) {
$where[] = "postName LIKE :searchRadioName";
$params[':searchRadioName'] = '%'.$_POST['postRadioName'].'%';
}
if (!empty($_POST['postCountryID'])) {
$where[] = "postCountryID = :postCountryID";
$params[':postCountryID'] = $_POST['postCountryID'];
}
if (!empty($where)) {
$sql .= ' WHERE (' . implode(') AND (', $where) . ') ' ;
}
$stmt = $db->prepare($sql);
foreach($params as $param => $value) {
$stmt->bindParam($param, $value);
}
$stmt->execute();
}
?>
Моя таблица - radio_posts, также есть несколько столбцов, postID, postName, postCountryID, postDate. В postName у меня несколько строк: новое радио, новое радио 2, новое радио 3. Когда я ищу термин, например «новый», отображаются все три строки, хорошо. Если я ищу по postCountryID, например «3», отображается только одна строка, что тоже хорошо, потому что только одна назначается идентификатору 3. Но когда я ищу оба, postName «new» и postCountryID «3» не отображаются результаты. Как это решить? для отображения строк, соответствующих как postName, так и postCountryID. В phpMyAdmin работает, но с формой поиска не работает:
SELECT * FROM `radio_posts` WHERE postName LIKE '%new%' AND postCountryID = 3
Также, если возможно, я хотел бы спросить, как лучше всего упорядочить результаты по столбцу postDate, по возрастанию, по убыванию.
Да, SQL выглядит правильно. Возможно, "3" не является обязательным как int? Тем более, что данные HTML-формы в PHP всегда являются строкой, пока вы явно не приведете их как что-то еще.
@Dominic В любом случае лучше всего использовать правильный тип данных, $params[':postCountryID'] = $_POST['postCountryID'] должен быть $params[':postCountryID'] = (int) $_POST['postCountryID'] - хорошо указано, но я не думаю, что это вызывает неожиданное поведение.
Спасибо @Jaquarh. Кроме того, я предпочитаю использовать $stmt->bindParam($param, $value, \PDO::PARAM_INT); (или соответствующую константу PDO типа данных).
Попробуйте изменить '%'.$_POST['postRadioName'].'%' на "'%{$_POST['postRadioName']}%'" - тогда кавычки будут включены при привязке значения к заполнителю.
Я пробовал $ where [] = "postName НРАВИТСЯ?"; $ params [] = '%'. $ _ POST ['postRadioName']. '%'; затем $ params [': postCountryID'] = (int) $ _POST ['postCountryID'], изменил '%'. $ _ POST ['postRadioName']. '%' на "'% {$ _ POST [' postRadioName ']} % '", похоже, ничего не работает.






После замены $stmt->bindParam($param, $value); на $stmt->bindValue($param, $value); код работает должным образом. Один результат получается для термина "новый" и ID страны = 3.
Вы пробовали заключать
postName LIKE :searchRadioNameв кавычки? Я обычно не использую именованные заполнители, только заполнители?с запросами, поэтому я не уверен, может ли изменение его наpostName LIKE ':searchRadioName'привести к ожидаемому результату.