|
|
|
| Здравствуйте, использую вот такой запрос
$query="SELECT * FROM $tableName WHERE name_job LIKE '%".$find_text."%'";
$query=mysql_query($query);
|
в результате выводится всё содержимое :(
Можно ли использовать такой синтаксис? | |
|
|
|
|
|
|
|
для: Den*s
(20.09.2009 в 19:21)
| | >в результате выводится всё содержимое :(
А что нужно?
>Можно ли использовать такой синтаксис?
Можно, это типичное использование синтаксиса оператора LIKE. | |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 19:24)
| | >А что нужно?
В базе есть три поля типа varchar(250) и они заполнены на подобие
1) Биография Юлия Цезаря
2) Иванов Пётр Сергеевич
3) История
есть форма поиска, в которой пользователь заполняет данные в 3 поля поиска, заполнить одно поле, а может все три.
И вот по этим данным нужно сделать поиск в таблице, вот код
<?
$tableName = "posob";
if ($name1 || $avtor || $predmet)
{
$query = "SELECT * FROM $tableName WHERE name1 LIKE '%".$name1."%' OR avtor LIKE '%".$avtor."%' OR predmet LIKE '%".$predmet."%' ";
$query = mysql_query($query);
while (list($id_temp, $text_page_temp) = @mysql_fetch_row($query))
{
//$count_find++;
$id_array=$id_temp;
$text_page_array=trim(strip_tags($text_page_temp));
$count_sym=strlen($text_page_array);
if ($count_sym>49) $text_page_array=substr($text_page_array, 0, 50)."...";
print "$text_page_array<br>";
$ok = "yes";
}
if ($ok == "") print "<p style='color:red'>По вашему запросу ничего не найдено</p>";
}
?>
|
может ошибка в while (list($id_temp, $text_page_temp) = @mysql_fetch_row($query)) | |
|
|
|
|
|
|
|
для: Den*s
(20.09.2009 в 19:31)
| | Если у вас не заполнено хотя бы одно поле - у вас будут выводиться все записи, так как сравнивать вы будете с %% - что эквивалентно совпадению с любой записью. Если поле не заполнено - его условие нужно исключать из конструкции WHERE. | |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 19:46)
| | Спасибо :)
действительно, если переменные приходят пустыми то отображаются все записи в результате запроса
избавился от этого вот так
<?
$name1 = @trim (htmlspecialchars (mysql_real_escape_string ($_POST["name1"]), ENT_QUOTES) );
$avtor = @trim (htmlspecialchars (mysql_real_escape_string ($_POST["avtor"]), ENT_QUOTES) );
$predmet = @trim (htmlspecialchars (mysql_real_escape_string ($_POST["predmet"]), ENT_QUOTES) );
if (!$name1) $name1 = "<";
if (!$avtor) $avtor = "<";
if (!$predmet) $predmet = "<";
?>
|
так как у меня стоит htmlspecialchars на принятии переменной, то такой знак в базу не запишется, получается корректный выбор, только наверно это не эффективно... | |
|
|
|
|
|
|
|
для: Den*s
(20.09.2009 в 20:11)
| | Хм... условие будет в холостую работать всякий раз, даже если поле не заполнено. Обычно поступают следующим образом
<?php
...
$where = array();
if(!empty($name1)) $where[] = "name1 LIKE '%".$name1."%'";
if(!empty($avtor)) $where[] = "avtor LIKE '%".$avtor."%'";
if(!empty($predmet)) $where[] = "predmet LIKE '%".$predmet."%'";
if(!empty($where))
{
$query = "SELECT * FROM $tableName WHERE ".implode(" OR ", $where);
...
}
...
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 20:18)
| | Спасибо ещё раз, прям то что доктор прописал :) | |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 19:24)
| | > Можно, это типичное использование синтаксиса оператора LIKE.
Но не нужно. ) Мускулу прийдется пройтись по всей таблице чтобы сделать выборку. Пока данных мало, работает все быстро, как то и не задумываешься, а когда в таблице 30 000 000 записей можно просто не дождаться )
LIKE следует использовать так:
SELECT * FROM tbl WHERE field LIKE 'blabla%'
|
При условии что на field есть индекс. В противном случае (если это поиск по содержимому) либо FULLTEXT поиск (осторожно MyISAM!) либо что то посерьезнее. | |
|
|
|
|
|
|
|
для: Евгений Петров
(22.09.2009 в 20:24)
| | И при условии, что нужно найти текст "blabla" идущий в начале field, если важно найти текст в том числе и в середине поля, придется обрамлять % с обеих сторон. | |
|
|
|
|
|
|
|
для: cheops
(22.09.2009 в 20:28)
| | Не все что нужно можно так просто сделать. Конечно если в таблице не 1000 записей, которыми пользуется 10 пользователей. Или если это не частный запрос который выполняется очень редко.
Полнотекстовый поиск тоже кстати неспроста разрешает искать только по началу слова. | |
|
|
|
|
|
|
|
для: Евгений Петров
(22.09.2009 в 21:00)
| | LIKE - это быстрое и стандартное решение. Разумеется при больших объемах необходимо предпринимать дополнительные условия для организации качественного и скоростного поиска. Чем больше база данных и чем она сложнее - тем больше усилий требуется приложить. | |
|
|
|