#php #mysql
#php #mysql
Вопрос:
Здравствуйте, я пытаюсь создать функцию поиска для своего веб-сайта. У меня есть этот метод, который имеет запрос
public function search_all($data)
{
$query = [];
$result = $this->db->query('
SELECT blog_title FROM blog WHERE blog_title LIKE "%'. $data . '%"
UNION
SELECT body FROM blog WHERE body LIKE "%'. $data . '%"
UNION
SELECT username FROM users WHERE username LIKE "%'. $data . '%"
');
while ($row = $result->fetch_assoc())
{
$query[] = $row;
}
$result->free();
return $query;
$mysqli->close();
}
Тогда у меня есть метод, который обрабатывает пользовательский ввод
public function search()
{
if (isset($_POST['search']))
{
$search_term = trim($_POST['search_term']);
$terms = $this->search->search_all($search_term);
foreach ($terms as $term)
{
var_dump($term);
}
}
}
Поиск работает вроде. Если я ищу имя пользователя или название блога, я могу повторить его следующим образом
echo $term['blog_title'];
если я var_dump, то я получаю что-то вроде
array (size=1)
'blog_title' => string 'BillyBob' (length=8)
Мой вопрос в том, почему он всегда перезапускает blog_title в качестве ключа. Я думал, что мне придется сделать что-то вроде
Если я хочу повторить заголовок блога
echo $term['blog_title'];
Если я хочу повторить имя пользователя
echo $term['username'];
Ответ №1:
При объединении двух таблиц либо поля обеих таблиц должны быть одинаковыми, либо псевдоним должен быть одинаковым для обеих таблиц.
Пожалуйста, попробуйте этот запрос.
$result = $this->db->query('
SELECT body,blog_title,'' as username FROM blog WHERE blog_title LIKE "%'. $data . '%" OR body LIKE "%'. $data . '%" OR username LIKE "%'. $data . '%"
UNION
SELECT '' as body,'' as blog_title,username FROM users WHERE username LIKE "%'. $data . '%"
');
Этот запрос будет выбирать записи, когда поиск будет соответствовать blog_title или body или username . И вы сможете получить значение всех трех полей для выбранных записей.
Комментарии:
1. имя пользователя извлекается из другой таблицы с именем users
2. Хорошо, и есть ли какая-либо связь между таблицей blog и users?
3. Никакого отношения. Я хочу, чтобы пользователь мог искать и находить либо пользователей, либо сообщения в блоге. Я пытался добавить больше объединений, чтобы они могли найти и другие вещи, когда столкнулся с этой проблемой.
4. Для объединения имя поля таблицы должно быть одинаковым. Таким образом, в этом случае либо вам придется выполнять два отдельных запроса, либо псевдоним должен быть одинаковым для обеих таблиц. Например, проверьте обновленный запрос в ответе.