2010-06-05 4 views
2

Скажите, есть ли у меня массив, и я хочу проверить, является ли элемент частью этого массива, я могу пойти и использовать in_array (игла, стог сена), чтобы определить результаты , Я пытаюсь увидеть эквивалент PHP этого для моей цели. Теперь у вас может быть мгновенный ответ для меня, и у вас может возникнуть соблазн сказать «Использовать IN». Да, я могу использовать IN, но это не дает желаемых результатов. Позвольте мне объяснить на примере:PHP, MySQL: mysql замените функцию php in_array

У меня есть столбец «домашние животные» в таблице DB. Для записи это значение: Кошка, собака, верблюд (Да, данные столбца представляют собой значение, разделенное запятой). Учтите, что эта строка имеет идентификатор 1.

Теперь у меня есть форма, где я могу ввести значение в форме ввода и использовать это значение для проверки на значение в БД. Поэтому скажем, что я вводил следующее значение, разделенное запятой, в форме ввода: CAT, camel (да, CAT в верхнем регистре & намеренно, поскольку некоторые пользователи имеют тенденцию вводить его таким образом).

Теперь, когда я вхожу выше данные в формы ввода и представить, что я могу собирать информацию POST'ed и использовать следующий запрос:

$search = $_POST['pets']; 
$sql = "SELECT id FROM table WHERE pets IN ('$search') "; 
  1. Этот запрос не забирающий меня в строка, которая уже существует в БД (помните запись, которая имеет Кошка, собака, верблюд в качестве значения для столбца домашних животных?). Я пытаюсь заставить записи действовать как супермножество и значения из ввода формы как подмножества. Поэтому в этом случае я ожидаю, что значение id будет отображаться, поскольку значения существуют в столбце, но это не происходит.

  2. Теперь скажите, если я введу только CAT в качестве формы ввода и выполнить поиск, он должен показать мне номер ID 1.

  3. Теперь скажите, если я ввожу только верблюд, cAT в качестве формы ввода и выполнить поиск, он должен показать мне номер ID 1.

Как я могу достичь вышеуказанного?

спасибо.

ответ

4

Функция вы ищете является find_in_set:

select * from ... where find_in_set($word, pets) 

для запросов нескольких слов вы должны проверить каждое слово и AND (или ИЛИ) испытания:

where find_in_set($word1, pets) AND find_in_set($word2, pets) etc 
+0

Благодарим вас за ответ. Я опробовал ваше решение и заметил, что он сработал, но, к сожалению, только частично. Результаты поиска получают мне идентификатор, только если значение $ word является первым значением в столбце.Поэтому, если у меня есть Cat, Dog, Camel и мой запрос, это выглядит так: find_in_set («Cat», домашние животные), только тогда отображается ID. Если я использую find_in_set («Собака», домашние животные), идентификатор не отображается, а mysql неверно возвращает 0 записей. Я рад узнать, что функция find_in_set существует, но не может заставить ее полностью решить проблему. Не могли бы вы помочь? Благодарю. – Devner

+0

-1, это не отвечает на вопрос :-P –

+0

Благодарим вас за ответ. У меня есть пробелы в моих текущих значениях, разделенных запятой, в моей таблице, поэтому, я думаю, мне придется обрезать пространство перед вставкой в ​​БД. Это будет работать для меня. Признайте, что вы нашли время, чтобы ответить на это. Благодарю. – Devner

-2

Да, данные столбца запятая значения, разделенные

Вот ваша вина.
Нет, это не должно быть разделено запятой
И ваша структура базы данных должна быть нормализована.

+0

Да, это верно. Единственный шанс поиска в списке, разделенном запятыми, заключается в использовании 'LIKE' и подстановочных знаков, которые медленны и подвержены ошибкам (например, вы не можете запятнать в своих значениях, например). Каждый атрибут должен быть нормализован как запись в отдельной таблице. –

+0

@Pekka Спасибо вам за ваши ответы. Я согласен с тем, что нормализованный способ действительно будет лучше. Разделенный по запятой дизайн стоимости занимался одним из самых важных функций веб-сайта простым и легким способом. Важность, предоставляемая инструменту поиска, о котором я упоминаю, является вторичной и только рядом с основной функциональностью (которая уже успешно). Так что нет способа вообще сделать то, что я пытаюсь сделать выше? – Devner

+2

Благодарим вас за конструктивную критику. – Devner

2

У меня есть несколько вещей для вас с точки зрения обратной связи & в качестве прямого ответа на вопросы:

Во-первых, я предлагаю вам санировать вход. Все расскажут вам об этом. Для этого см. What’s the best method for sanitizing user input with PHP?.

Во-вторых, нормализуйте ввод с помощью UPPER() или LOWER(), если вы хотите использовать MySQL и должны хранить входные данные в формате, или использовать strtoupper() и strtolower(), если вы хотите обработать входные данные перед сохранением Это.

Вы по-прежнему оставляете заказ в пользовательском запросе. Например. «Кот, собака» должен, чтобы получить тот же результат, что и «собака, кошка». Если вы должны были закодировать это с помощью предложения LIKE, проблемы с производительностью собираются съесть вас в живых. Вам не только придется динамически создавать запрос, но и вы получите огромные и ненужные сложные запросы. Короче говоря, забудьте об этом. У вас есть, чтобы изменить способ хранения ваших данных.

Одним из способов достижения этой цели является создание таблицы отношений, которая ссылается на таблицу уникального пользовательского ввода и вашу запись. Эта таблица будет похожа на

user_id | pet_id 

У каждого пользователя может быть более одного связанного с ним pet_id. Я создал базу данных давно так же, как и вы, и столкнулся с теми же проблемами. По производительности он никогда не окупался, и это ничего, кроме хорошего стиля. Я в конечном итоге изменил свою структуру из-за этого на вышеупомянутый метод.

+0

Благодарим вас за ответ и за рекомендации лучших практик. Код, который я опубликовал выше, предназначен только для тестирования. Я фактически дезинфицирую все входные данные в своем реальном живом коде. Также оцените возможность отображения проблем с реальной жизненной ситуацией с текущей структурой БД, которые у меня есть. Думаю, мне придется это исправить! – Devner

4

IN() Проверить, является ли значение находится в пределах набора значений

mysql> SELECT 2 IN (0,3,5,7); 
     -> 0 
mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); 
     -> 1 

SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a'); 

View: IN MySql

Смежные вопросы