Jump to content
  • 0

Вопросец


stars
 Share

Question

Работаю сейчас надо поиском по магазин. Поиск реализован средствами PHP тубишь у нас есть 2 страницы, первая с формой, вторая ловит переменную (я ее назвал $qscrit_qsresults ) с формы и делает запрос на выборку с базы... Запрос на выборку выглядит так:

$query_qsresults = sprintf("SELECT * FROM goods WHERE  goods.Brand LIKE '%%%s%%' OR goods.model LIKE '%%%s%%' OR goods.shotdescription LIKE '%%%s%%' ", $qscrit_qsresults, $qscrit_qsresults, $qscrit_qsresults);

Все работает великолепно если вводить брэнд модель или описание(например "Генератор"), но люди которые заходят на сайт об этом то не сном не духом они пишут "SDMO генератор" и поиск уже не чего не находит так как он ищет строку целиком...

Есть идея запрос разбить на несколько, то есть из "SDMO генератор" сделать "SDMO" "генератор". Хочется услышать какие есть варианты?

Я вот навоял:

<?php 
$url=0;
$url=$_GET['url'];
if (strlen($url) > 0) {
if ($url == ' '){} else {
$substr_count = substr_count($url," ");
$substr_count = $substr_count*2+1;
for ($x=0; $x<$substr_count; $x++) {
$string = strpos($url, " ");
if ($string == 0) {
if ( substr_count($url," ") == 0 ) { $rest[$x] = substr($url, 0, (strlen($url)-$string)); } else {
$url = substr($url, 1, (strlen($url)-$string));
}
} else {
$rest[$x] = substr($url, 0, $string);
$url = substr($url, $string, (strlen($url)-$string));
}
}
}
}
?>

однако работает это не так как планировалось в переменную $rest попадают пробелы + если строка выглядит как " text" на выходе будет ($rest[0]= $rest[1]=text $rest[2]=text)

Edited by stars
Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

А почему не так?

$qscrit_qsresults = strip_tags($qscrit_qsresults);
$qscrit_qsresults = trim($qscrit_qsresults);
$qscrit_qsresults = htmlspecialchars($qscrit_qsresults);

$query_qsresults = mysql_query("SELECT * FROM goods WHERE goods.Brand LIKE '%".$qscrit_qsresults. "%' OR goods.model LIKE '%".$qscrit_qsresults."%' OR goods.shotdescription LIKE '%".$qscrit_qsresults."%'");

У меня так все ищет нормально, и да... поля по которым будет проводится поиск в мускуле вроде должны быть индексными.

Edited by rus
Link to comment
Share on other sites

  • 0

Ознакомился, подчеркнул для себя несколько интересных функций... Очистку запроса от спец символов и обрезание строки я не использовал в примере лишь потому что не этого хотел достичь ))) на самом сайте конечно же все переменные(полученные через post/get) фильтруются с тех самых времен как нашлись любители повставлять ерунды ))

Насчет индекса, чем чревато включение индекса? У меня вот несколько и-нэт магазинов на обеспечении в среднем база каждого содержит 20-30 таблиц которые связанны друг с другом (сайты заполняются товарами через аксес) . Индексация включена только на строках где записываются ID (товаров, коллекций, брэндов и т.д.) (то есть строки содержу целочисленные значения до 8 знаков примерно). Товаров в одном из магазинов 30к наименований, поиск должен будет пройтись по брэндам (строка varchar(50)) моделям (строка varchar(50)) описанию (text). максимум запрос сможет вывести примерно 3-5% всех товаров, тоесть обычно он будет выводить 5-30 товаров, но бываю извращенцы которым он выдаст 1к-2к товаров... Стоит ли вообще замарачиваться с включением индекса?

И будет ли с включенной индексацией работать выборка "SELECT * FROM table WHERE table.ID == 1"

Edited by stars
Link to comment
Share on other sites

  • 0
Ознакомился, подчеркнул для себя несколько интересных функций... Очистку запроса от спец символов и обрезание строки я не использовал в примере лишь потому что не этого хотел достичь ))) на самом сайте конечно же все переменные(полученные через post/get) фильтруются с тех самых времен как нашлись любители повставлять ерунды ))

Насчет индекса, чем чревато включение индекса? У меня вот несколько и-нэт магазинов на обеспечении в среднем база каждого содержит 20-30 таблиц которые связанны друг с другом (сайты заполняются товарами через аксес) . Индексация включена только на строках где записываются ID (товаров, коллекций, брэндов и т.д.) (то есть строки содержу целочисленные значения до 8 знаков примерно). Товаров в одном из магазинов 30к наименований, поиск должен будет пройтись по брэндам (строка varchar(50)) моделям (строка varchar(50)) описанию (text). максимум запрос сможет вывести примерно 3-5% всех товаров, тоесть обычно он будет выводить 5-30 товаров, но бываю извращенцы которым он выдаст 1к-2к товаров... Стоит ли вообще замарачиваться с включением индекса?

И будет ли с включенной индексацией работать выборка "SELECT * FROM table WHERE table.ID == 1"

Тыц.

Link to comment
Share on other sites

  • 0

как лучше писать?

SELECT * FROM ( SELECT * FROM ( SELECT * FROM table WHERE  table.id LIKE '%%text1%%' OR table.name LIKE '%%text1%%') AS table1 WHERE  table1.id LIKE '%%text2%%' OR table1.name LIKE '%%text2%%') AS table2 WHERE  table2.id LIKE '%%text3%%' OR table2.name LIKE '%%text3%%'

или

SELECT * FROM table WHERE  (table.id LIKE '%%text1%%' OR  table.name LIKE '%%text1%%') AND (table.id LIKE '%%text2%%' OR  table.name LIKE '%%text2%%') AND (table.id LIKE '%%text3%%' OR  table.name LIKE '%%tex3%%')

вариант с индексами я так понимаю будет выглядеть как:

SELECT * FROM table WHERE   CONCAT(table.id, ' ',table.name )   LIKE '%%text1%%' AND  CONCAT(table.id, ' ',table.name )   LIKE '%%text2%%'

Edited by stars
Link to comment
Share on other sites

  • 0

Второй вариант, конечно, предпочтительнее - первый вообще убийственный. Что такое написано в третьем варианте я вообще не понимаю - похоже на бред. Такое ощущение, что вы не понимаете что такое индексы и для чего они. И, да, зачем такая запись:

LIKE '%%text1%%'

Вы понимаете значение символа "%"? Почему его в данном случае два?

P.S. Перенёс в СУБД - этому топику место там.

Link to comment
Share on other sites

  • 0
Вы понимаете значение символа "%"? Почему его в данном случае два?

Надеюсь, что да собственно мельком где то урвал что %%test1%% равносильно *test1* в офисе(однозначно могу сказать что видел именно два % ибо проверил данную конструкцию она работала больше и не экспериментировал)...

Щас к сожалению проверить не смогу у меня тут нету sql...

Что такое написано в третьем варианте я вообще не понимаю - похоже на бред. Такое ощущение, что вы не понимаете что такое индексы и для чего они.

dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

сам запрос работает...

Edited by stars
Link to comment
Share on other sites

  • 0

Гм... Похоже, у вас нет понимания того, что именно вы делаете и, судя по всему, вы просто повторяете увиденное где-то. Попробуйте разобраться для чего нужен каждый символ и почему именно его вы используете в запросе и будет вам счастье. Мне почему-то кажется, что в статье, на которую я вам дал ссылку есть всё, что вам нужно.

Link to comment
Share on other sites

  • 0
Гм... Похоже, у вас нет понимания того, что именно вы делаете и, судя по всему, вы просто повторяете увиденное где-то. Попробуйте разобраться для чего нужен каждый символ и почему именно его вы используете в запросе и будет вам счастье. Мне почему-то кажется, что в статье, на которую я вам дал ссылку есть всё, что вам нужно.

Я прекрасно понимаю что и для чего я пишу, написанные выше запросы я писал собственноручно а не вырывал кусками откуда то... В том что я писал %%$string%% нет моей ошибки(и криминала в этом тоже нету, запрос же работает), это всего лишь незнание, у меня вот на столе есть книжка в ней первое упоминание о "%" идет на 73 странице и то там не говорится что данный символ имеет значение (all\*)

Я предложил 3 модели, сам я планирую использовать одну из первых(если конкретней то 2), и мой вопрос был задан для того чтобы кто-то зашел в тему и сказал:

1) Выбирай первый запрос да, он более громоздкий но работать будет быстрей(или наоборот). Единственный косяк что под запросы только с 4+ mysql работают.

2) Зачем ты пишешь двойные проценты, правильней писать %$string%

и т.д.

3 модель запроса я написал для пробы чтобы узнать мнение правильно запрос сделан или его надо писать по другому, сам по себе он работает(для индексированных строк).

Вашу ссылку я прочитал сразу полностью, но собирать страницу подобно тому как на примере я не стал, однако для себя от туда я подчеркнул ряд решений и увидел как это делаю люди, то что я не разобрался до символьно почему там так или иначе написано это возможно моя ошибка но я смотрел на сами функции ход логики... И писал я на форуме именно для того чтобы дали совет, а не написали "Похоже, у вас нет понимания"

p.s. книжка "MySQL и mSQL. Базы данных для небольших предприятий и Интернета" авторы Рэнди Джей Яргер, Джордж Риз, Тим Кинг http://www.oz.by/data/img_big/MySQL-i-mSQL...neta_101578.jpg

Тем неимение спасибо за советы, и помощь, поиск я таки добил ))

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy