Здравствуйте! Прошу помощи решить проблему с выборкой на sql Код (Text): $category = $_REQUEST["cat"]; if(isset($category)){ $sqlcat = ' AND (t4.term_taxonomy_id = ' .$category. ')'; // с этим запросом не работает выборка } $query = ' SELECT t1.post_id FROM wp_postmeta t1 LEFT JOIN wp_postmeta t2 ON (t1.post_id=t2.post_id) LEFT JOIN wp_postmeta t3 ON (t1.post_id=t3.post_id) LEFT JOIN wp_term_relationships t4 ON (t1.post_id=t4.object_id) WHERE (t1.meta_key = "price_door$" AND t1.meta_value*1 >= ' . $pricefrom .' AND t1.meta_value*1 <= ' . $priceto .') AND (t2.meta_key LIKE "%door_size%" AND t2.meta_value LIKE "%' . $doorsize .'%") AND (t3.meta_key LIKE "%color%" AND t3.meta_value IN (' . $color .')) '.$sqlcat.' GROUP BY t1.meta_id '; Суть - _REQUEST["cat"] отправляет с формы id категории, к примеру 4, и дополнительный запрос $sqlcat подключается в выборку, но почему-то не работает, если убрать из запроса '.$sqlcat.' то все работает, но без категории естественно. Прошу вашей помощи. P.S. В таблице wp_term_relationships есть только 2 поля - object_id и term_taxonomy_id, в object_id хранится тот же post_id, а в term_taxonomy_id номер категории
PHP: $category = $_REQUEST["cat"]; if(isset($category)){... это неправильное условие. пустая строка в переменной $category, например, пройдёт через твой isset() но запрос при этом будет испорчен. PHP: ... AND (t4.term_taxonomy_id = ) ... используй отладку, не ленись. надо увидеть что на самом деле приходит в $_REQUEST["cat"] и что в итоге будет в $query после всех подстановок. die($query); например сделай http://phpfaq.ru/debug
Небольшой оффтопик: Советую использовать одинарные кавычки для оформления строковых литералов в тексте SQL, а в двойные кавычки окружать сам запрос. Типа: PHP: $query = "SELECT x, y FROM zzz WHERE x = 'the string'"; дело в том, что по стандарту SQL строковые литералы оформляются только в одинарные кавычки. MySQL в расслабленном режиме позволяет и то и другое, но может оказаться так, что на хостинге включен строгий режим и всё пипец приехали! двойные кавычки там будут считаться признаком идентификатора, то есть именем поля или таблицы. внезапно™ пруф: https://dev.mysql.com/doc/refman/5.7/en/string-literals.html
Код (Text): $category = $_REQUEST["cat"]; if(isset($category)){ $sqlcat = ' AND (t4.term_taxonomy_id = ' .$_REQUEST["cat"]. ')'; } $query = ' SELECT t1.post_id FROM wp_postmeta t1 LEFT JOIN wp_postmeta t2 ON (t1.post_id=t2.post_id) LEFT JOIN wp_postmeta t3 ON (t1.post_id=t3.post_id) LEFT JOIN wp_term_relationships t4 ON (t1.post_id=t4.object_id) WHERE (t1.meta_key = "price_door$" AND t1.meta_value*1 >= ' . $pricefrom .' AND t1.meta_value*1 <= ' . $priceto .') AND (t2.meta_key LIKE "%door_size%" AND t2.meta_value LIKE "%' . $doorsize .'%") AND (t3.meta_key LIKE "%color%" AND t3.meta_value IN (' . $color .')) '.$sqlcat.' GROUP BY t1.meta_id '; Вот так заработал запрос, и вроде бы правильно отдает результат
Запрос работает правильно. Я не пойму о чем ты, isset тут не нужен? а что тогда? я учусь, и писец тут не причем
http://php.net/isset прежде чем вносить изменения наугад, попробуй узнать что именно хранится в переменных. а когда тебе дают совет, прочитай его с начала и до конца. используешь функцию — прочитай что именно она делает. не надо интуиции, надо точно знать. --- Добавлено --- твои изменения ничего реально не изменили в логике, ёмана. если ошибка сейчас не произошла, значит ты просто не воспроизвёл условия, когда она возникала. еще раз перечитай.
Раз уж здесь заговорили о кавычках, задам встречный вопрос. Я встречал в запросах кроме одинарных и двойных кавычек еще апостроф (на клавиатуре находится на букве Ё). Насколько и в каких случаях он применим? У меня он где-то прокатывал, где-то нет... Так и не понял...
@Сереганек (`user`) - вот эти кавычки очень полезны в тех случаях когда у вас поле называется так как зарезервировано слово в mysql. То-есть в MYSQL есть такие слова которые нельзя использовать ссылка http://www.php.su/mysql/manual/?page=Reserved_words получается так если по какой то причине вы назвали поле в таблице зарезервированным словом то обязательно в запросе указывать эти кавычки, чтобы не было ошибок, и запрос выполнился правильно. Как то так, может кто поправит меня)
` - гравис, всегда выделяем им названия баз, таблиц, полей. ' - апостроф, всегда используем его для текстовых и бинарных данных не упакованных в HEX.