Всем привет. В БД прописываются ключи файла, через запятую. Далее я их разбиваю: Код (Text): $key=$row->metakey; list($a, $b, $c, $d, $e) = explode(', ', $key); После я вывожу с помощью LIKE одинаковые ключи. Но есть проблема при выводе ключей, к примеру, если ключей только три он выводит три одинаковых ключа и далее выводит все ключи. Происходит это потому что ключи $d, $e пустые, запрос не понимает, что они пустые и в итоге выводит все ключи из БД. Как же можно задать условие к примеру такое: Код (Text): if ($d пустой) {echo 'УРА';} elseif ($e пустой) {echo 'опять УРА';} и так далее. Пробовал задать как empty не получается, пробовал задать как '0' таже не получается. Пробовал так: Код (Text): if ($key=list($a, $b, $c, $d)); {echo 'УРА';} Тоже не получается. Подскажите, пожалуйста, каким образом можно задать функцию, что ключ пустой?
Я пока так и делаю, но тогда выборка уменьшается до трех, а мне хотелось бы чтобы выборка ключей была до пяти.
в чем проблема? не используй list, не будет пустых ключей. работай с массивом в цикле или в функции-итераторе. не надо 25 отдельных запросов и отдельных if() -- это говнокод. Есть похожая задача где надо было найти записи со всеми указанными словами. если тебе надо с одним из указанных слов -- замени AND на OR. Код (PHP): $words = array_filter(array_map('trim', explode(',', $term)), 'strlen'); explode() ты уже знаешь что делает array_map('trim', ...) каждый элемент массива пропустит через функцию trim - удалит конечные пробелы array_filter(..., 'strlen') выбросит из массива пустые елементы
А посчитать как? Код (Text): $words = array_filter(array_map('trim', explode(',', $key)), 'strlen'); if ($words == 4) {echo 'УРА';} elseif ($words == 5) {echo 'Опять УРА';} Таким образом
что посчитать? Добавлено спустя 3 минуты 2 секунды: давай с самого начала: объясни задачу как можно проще, без своих примеров реализации, прости господи.
Количество ключей. Чтобы пустые ключи не попадались. У меня так написано, если ключей три, то выполняется определенный запрос к БД с проверкой трех ключей, если четыре то уже другой запрос, если пять то опять таки другой запрос. Теперь надо как-то условие составить. В одну ячейку БД прописываются ключи через запятую (Примеры: красивые автомобили, машина, супер кар, тачка, прелесть), далее я разделяю их с помощью list($a,$b,$c,$d,$e) и explode, далее идет запрос к БД, где с помощью LIKE '%$a%', LIKE '%$b%', LIKE '%$c%', LIKE '%$d%', LIKE '%$e%' выводятся одинаковые ключи со всей БД. Если ключей меньше трех, то LIKE '%$d%', LIKE '%$e%' выводят все ключи из БД, независимо от того одинаковые они или нет. Вот и хочу как-то определить эти пустые ключи, если ключ $d пустой (то есть в ячейке только три ключа), то запрос к БД будет уже таким LIKE '%$a%', LIKE '%$b%', LIKE '%$c%', а если ключ $e пустой (то есть в ячейке уже четыре ключа) запрос будет таким LIKE '%$a%', LIKE '%$b%', LIKE '%$c%', LIKE '%$d%' и тд.
runcore, это формально верно. только это сраное говно, а не решение ))) автор, "тебе шашечки или ехать?" ты вбил себе в голову кривое решение и теперь пытаешся узнать как в говно ложечку сахара добавить. начать с того, что хранить поисковые слова в таблице через запятую -- это плохая практика. это годится только чтобы вывести список, а искать очень неудобно. ну да ладно... когда число элементов непредсказуемое, list() только мешает. считай-не-считай, куча if-ов с одинаковыми телами это ужас!!! надо обрабатывать сам массив, а не перекладывать его в несколько переменных. не бывает таких запросов. бывает объединение через OR или AND, -- определись что нужно тебе. вот есть у тебя после implode() массив слов (а точнее фраз). для каждого из элементов надо построить условие LIKE. можно так: Код (PHP): $term = 'xksj, yaks, zas, , aas, cdj , , baaa , '; // есть пустые элементы, для проверки $words = array_filter(array_map('trim', explode(',', $term)), 'strlen'); var_export($words); // отладка! пустых фраз здесь нет foreach ($words as &$word) { $word = "`field` LIKE '%{$word}%'"; // по хорошему надо mysqli_real_escape_string() } unset($word); var_export($words); // отладка! для каждой фразы сделали условие $sql = "SELECT * FROM `table` WHERE (" . implode(") OR\n(", $words) . ")"; echo $sql; // отладка! готовый запрос. ОН ОДИН, ищет любое из слов
Естественно у меня операторы LIKE разделены OR. Я в примере указал не полный код. Полного кода под рукой нет. Это уже не исправить.
Ну хочется, конечно же, проще все это сделать. Ваш пример я попробую воплотить у себя, ближе к вечеру только, после о результатах отпишусь в этой теме.
да это понятно. просто ТС писал что: примеры запросов не привел, чтоб можно было понять насколько они разные. вот я и ждал продолжения диалога с ТС этого он хочет или нет )
Этот код мне более понятен, но надо попробовать еще и пример от artoodetoo, вечером оба примера попробую и отпишусь, на данный момент нет возможности испробовать ваши примеры.
делайте как artoodetoo сказал. я просто пытался подтолкнуть ваши рассуждения в правильном направлении. но вы упорно за list() цепляетесь
Да не цепляюсь я за list, я же пишу , что у меня на данный момент так разбиты ключевики, можно и по другому разбить, для меня не столь важно как разбить или как искать, для меня важен результат
самое главное в профессии программиста - умение сформулировать цель. в этой теме напряги именно с этим.
if ($d) то же самое что if ((bool)$d). php делает неявное преобразование типа когда требуется. здесь оно зачем вообще, что должно показать? предлагаю каждому пройти тест, что будет выведено здесь? Код (PHP): if ('0') echo "'0'"; if ('1') echo "'1'"; if ('') echo "''"; if ('true') echo "'true'"; if ('false') echo "'false'"; if (null) echo "null"; if (!null) echo "!null";