За последние 24 часа нас посетили 54379 программистов и 1768 роботов. Сейчас ищут 1250 программистов ...

Как узнать что ключ пустой

Тема в разделе "PHP для новичков", создана пользователем AkudJEE, 9 окт 2013.

  1. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Всем привет. В БД прописываются ключи файла, через запятую.
    Далее я их разбиваю:
    Код (Text):
    1. $key=$row->metakey;
    2. list($a, $b, $c, $d, $e) = explode(', ', $key);
    После я вывожу с помощью LIKE одинаковые ключи.
    Но есть проблема при выводе ключей, к примеру, если ключей только три он выводит три одинаковых ключа и далее выводит все ключи. Происходит это потому что ключи $d, $e пустые, запрос не понимает, что они пустые и в итоге выводит все ключи из БД.
    Как же можно задать условие к примеру такое:
    Код (Text):
    1. if ($d пустой)
    2. {echo 'УРА';}
    3. elseif ($e пустой)
    4. {echo 'опять УРА';}
    и так далее. Пробовал задать как empty не получается, пробовал задать как '0' таже не получается.
    Пробовал так:
    Код (Text):
    1. if ($key=list($a, $b, $c, $d));
    2. {echo 'УРА';}
    Тоже не получается. Подскажите, пожалуйста, каким образом можно задать функцию, что ключ пустой?
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    не добавлять пустые ключи в запрос да и всё

    Добавлено спустя 29 секунд:
    empty()
     
  3. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Я пока так и делаю, но тогда выборка уменьшается до трех, а мне хотелось бы чтобы выборка ключей была до пяти.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    в чем проблема? не используй list, не будет пустых ключей. работай с массивом в цикле или в функции-итераторе. не надо 25 отдельных запросов и отдельных if() -- это говнокод.

    Есть похожая задача где надо было найти записи со всеми указанными словами. если тебе надо с одним из указанных слов -- замени AND на OR.

    Код (PHP):
    1. $words = array_filter(array_map('trim', explode(',', $term)), 'strlen'); 
    explode() ты уже знаешь что делает :)
    array_map('trim', ...) каждый элемент массива пропустит через функцию trim - удалит конечные пробелы
    array_filter(..., 'strlen') выбросит из массива пустые елементы
     
  5. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    А посчитать как?
    Код (Text):
    1.  
    2. $words = array_filter(array_map('trim', explode(',', $key)), 'strlen');
    3. if ($words == 4)
    4. {echo 'УРА';}
    5. elseif ($words == 5)
    6. {echo 'Опять УРА';}
    Таким образом
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    что посчитать?

    Добавлено спустя 3 минуты 2 секунды:
    давай с самого начала: объясни задачу как можно проще, без своих примеров реализации, прости господи.
     
  7. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Количество ключей. Чтобы пустые ключи не попадались. У меня так написано, если ключей три, то выполняется определенный запрос к БД с проверкой трех ключей, если четыре то уже другой запрос, если пять то опять таки другой запрос. Теперь надо как-то условие составить.
    В одну ячейку БД прописываются ключи через запятую (Примеры: красивые автомобили, машина, супер кар, тачка, прелесть), далее я разделяю их с помощью 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%' и тд.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. $size = sizeof($key);
    2. if ($size==3) {}
    3. else if ($size==4){}
    4. else if ($size==5){}
    5. else {}
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    runcore, это формально верно. только это сраное говно, а не решение )))

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

    начать с того, что хранить поисковые слова в таблице через запятую -- это плохая практика. это годится только чтобы вывести список, а искать очень неудобно. ну да ладно...

    когда число элементов непредсказуемое, list() только мешает. считай-не-считай, куча if-ов с одинаковыми телами это ужас!!!
    надо обрабатывать сам массив, а не перекладывать его в несколько переменных.
    не бывает таких запросов. бывает объединение через OR или AND, -- определись что нужно тебе.
    вот есть у тебя после implode() массив слов (а точнее фраз). для каждого из элементов надо построить условие LIKE. можно так:

    Код (PHP):
    1. $term = 'xksj, yaks, zas, , aas, cdj , , baaa , '; // есть пустые элементы, для проверки
    2. $words = array_filter(array_map('trim', explode(',', $term)), 'strlen');
    3. var_export($words); // отладка! пустых фраз здесь нет
    4.  
    5. foreach ($words as &$word) {
    6.     $word = "`field` LIKE '%{$word}%'"; // по хорошему надо mysqli_real_escape_string()
    7. }
    8. unset($word);
    9. var_export($words); // отладка! для каждой фразы сделали условие
    10.  
    11. $sql = "SELECT * 
    12. FROM `table` 
    13. WHERE 
    14. (" . implode(") OR\n(", $words) . ")";
    15. echo $sql; // отладка! готовый запрос. ОН ОДИН, ищет любое из слов
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    разве скобки ненадо ставить [] или я не догоняю чего ты тут мудришь?
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ты не догоняешь
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    крепись!
     
  14. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Естественно у меня операторы LIKE разделены OR. Я в примере указал не полный код. Полного кода под рукой нет.
    Это уже не исправить.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    и?

    тебе по прежнему хочется искать пустые элементы, считать чего-то и писать несколько if() ?
     
  16. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Ну хочется, конечно же, проще все это сделать. Ваш пример я попробую воплотить у себя, ближе к вечеру только, после о результатах отпишусь в этой теме.
     
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    да это понятно. просто ТС писал что:
    примеры запросов не привел, чтоб можно было понять насколько они разные. вот я и ждал продолжения диалога с ТС этого он хочет или нет )
     
  18. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Этот код мне более понятен, но надо попробовать еще и пример от artoodetoo, вечером оба примера попробую и отпишусь, на данный момент нет возможности испробовать ваши примеры.
     
  19. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    делайте как artoodetoo сказал. я просто пытался подтолкнуть ваши рассуждения в правильном направлении. но вы упорно за list() цепляетесь
     
  20. AkudJEE

    AkudJEE Активный пользователь

    С нами с:
    29 июл 2012
    Сообщения:
    29
    Симпатии:
    0
    Да не цепляюсь я за list, я же пишу , что у меня на данный момент так разбиты ключевики, можно и по другому разбить, для меня не столь важно как разбить или как искать, для меня важен результат
     
  21. alba2001

    alba2001 Активный пользователь

    С нами с:
    7 фев 2012
    Сообщения:
    56
    Симпатии:
    0
    А
    не подходит?
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    самое главное в профессии программиста - умение сформулировать цель. в этой теме напряги именно с этим.
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    кстати (bool) очень удобен если нужно всеголишь флаг показать true and false :)
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    if ($d) то же самое что if ((bool)$d). php делает неявное преобразование типа когда требуется.
    здесь оно зачем вообще, что должно показать?

    предлагаю каждому пройти тест, что будет выведено здесь?
    Код (PHP):
    1. if ('0') echo "'0'";
    2. if ('1') echo "'1'";
    3. if ('') echo "''";
    4. if ('true') echo "'true'";
    5. if ('false') echo "'false'";
    6. if (null) echo "null";
    7. if (!null) echo "!null";
     
  25. alba2001

    alba2001 Активный пользователь

    С нами с:
    7 фев 2012
    Сообщения:
    56
    Симпатии:
    0