За последние 24 часа нас посетили 65534 программиста и 2927 роботов. Сейчас ищут 1486 программистов ...

SQL запрос не работает

Тема в разделе "PHP для новичков", создана пользователем JonyFront, 5 авг 2017.

  1. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Здравствуйте! Прошу помощи решить проблему с выборкой на sql
    Код (Text):
    1. $category = $_REQUEST["cat"];
    2.     if(isset($category)){
    3.         $sqlcat = ' AND (t4.term_taxonomy_id = ' .$category. ')'; // с этим запросом не работает выборка
    4.     }
    5.         $query = '
    6.         SELECT t1.post_id FROM wp_postmeta t1
    7.         LEFT JOIN wp_postmeta t2 ON (t1.post_id=t2.post_id)
    8.         LEFT JOIN wp_postmeta t3 ON (t1.post_id=t3.post_id)
    9.         LEFT JOIN wp_term_relationships t4 ON (t1.post_id=t4.object_id)
    10.         WHERE
    11.           (t1.meta_key = "price_door$" AND t1.meta_value*1 >= ' . $pricefrom .'  AND t1.meta_value*1 <= ' . $priceto .') AND
    12.           (t2.meta_key LIKE "%door_size%" AND t2.meta_value LIKE "%' . $doorsize .'%") AND
    13.           (t3.meta_key LIKE "%color%" AND t3.meta_value IN (' . $color .')) '.$sqlcat.'
    14.         GROUP BY t1.meta_id
    15.     ';
    Суть - _REQUEST["cat"] отправляет с формы id категории, к примеру 4, и дополнительный запрос $sqlcat подключается в выборку, но почему-то не работает, если убрать из запроса '.$sqlcat.' то все работает, но без категории естественно. Прошу вашей помощи. P.S. В таблице wp_term_relationships есть только 2 поля - object_id и term_taxonomy_id, в object_id хранится тот же post_id, а в term_taxonomy_id номер категории
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    PHP:
    1. $category = $_REQUEST["cat"];
    2.     if(isset($category)){...
    это неправильное условие. пустая строка в переменной $category, например, пройдёт через твой isset() но запрос при этом будет испорчен.
    PHP:
    1. ... AND (t4.term_taxonomy_id = ) ...
    используй отладку, не ленись. надо увидеть что на самом деле приходит в $_REQUEST["cat"] и что в итоге будет в $query после всех подстановок.
    die($query); например сделай

    http://phpfaq.ru/debug
     
  3. Михаил Запаленов

    С нами с:
    2 авг 2017
    Сообщения:
    120
    Симпатии:
    1
    Где подключение к БД?
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Небольшой оффтопик:
    Советую использовать одинарные кавычки для оформления строковых литералов в тексте SQL, а в двойные кавычки окружать сам запрос. Типа:
    PHP:
    1. $query = "SELECT x, y
    2. FROM zzz
    3. WHERE x = 'the string'";
    дело в том, что по стандарту SQL строковые литералы оформляются только в одинарные кавычки. MySQL в расслабленном режиме позволяет и то и другое, но может оказаться так, что на хостинге включен строгий режим и всё пипец приехали! двойные кавычки там будут считаться признаком идентификатора, то есть именем поля или таблицы. внезапно™

    пруф: https://dev.mysql.com/doc/refman/5.7/en/string-literals.html
     
    _ne_scaju_ и JonyFront нравится это.
  5. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Код (Text):
    1. $category = $_REQUEST["cat"];
    2.     if(isset($category)){
    3.         $sqlcat = ' AND (t4.term_taxonomy_id = ' .$_REQUEST["cat"]. ')';
    4.     }
    5.         $query = '
    6.         SELECT t1.post_id FROM wp_postmeta t1
    7.         LEFT JOIN wp_postmeta t2 ON (t1.post_id=t2.post_id)
    8.         LEFT JOIN wp_postmeta t3 ON (t1.post_id=t3.post_id)
    9.         LEFT JOIN wp_term_relationships t4 ON (t1.post_id=t4.object_id)
    10.         WHERE
    11.          (t1.meta_key = "price_door$" AND t1.meta_value*1 >= ' . $pricefrom .'  AND t1.meta_value*1 <= ' . $priceto .') AND
    12.          (t2.meta_key LIKE "%door_size%" AND t2.meta_value LIKE "%' . $doorsize .'%") AND
    13.          (t3.meta_key LIKE "%color%" AND t3.meta_value IN (' . $color .')) '.$sqlcat.'
    14.         GROUP BY t1.meta_id
    15.     ';
    Вот так заработал запрос, и вроде бы правильно отдает результат
     
    #5 JonyFront, 5 авг 2017
    Последнее редактирование: 5 авг 2017
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    ты безнадёжен
    --- Добавлено ---
    "вроде бы правильно". пипец, не стоило тратить на тебя буквы.
     
  7. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Запрос работает правильно. Я не пойму о чем ты, isset тут не нужен? а что тогда? я учусь, и писец тут не причем :D
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    http://php.net/isset

    прежде чем вносить изменения наугад, попробуй узнать что именно хранится в переменных. а когда тебе дают совет, прочитай его с начала и до конца. используешь функцию — прочитай что именно она делает. не надо интуиции, надо точно знать.
    --- Добавлено ---
    твои изменения ничего реально не изменили в логике, ёмана. если ошибка сейчас не произошла, значит ты просто не воспроизвёл условия, когда она возникала.
    еще раз перечитай.
     
    JonyFront нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Взял себе в вооружения, спасибо)
     
  10. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Раз уж здесь заговорили о кавычках, задам встречный вопрос. Я встречал в запросах кроме одинарных и двойных кавычек еще апостроф (на клавиатуре находится на букве Ё). Насколько и в каких случаях он применим? У меня он где-то прокатывал, где-то нет... Так и не понял...
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Сереганек
    (`user`) - вот эти кавычки очень полезны в тех случаях когда у вас поле называется так как зарезервировано слово в mysql.
    То-есть в MYSQL есть такие слова которые нельзя использовать ссылка http://www.php.su/mysql/manual/?page=Reserved_words
    получается так если по какой то причине вы назвали поле в таблице зарезервированным словом то обязательно в запросе указывать эти кавычки, чтобы не было ошибок, и запрос выполнился правильно. Как то так, может кто поправит меня)
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ` - гравис, всегда выделяем им названия баз, таблиц, полей.
    ' - апостроф, всегда используем его для текстовых и бинарных данных не упакованных в HEX.