Делимся секретами создания сайтов

Запрос работает, но не работает.

В общем я такое вижу в первый раз и не могу понять в чем косяк хоть тресни.
Есть SQL-запрос. из PHPMyAdmin на том же сервере к той же базе работает как надо.
При вызове кода
$query=".... формирование запроса..."; mysql_query($query) or die(mysql_error());
выполняется собственно die.

Запрос слишком длинный чтобы здесь его приводить. начало такое:
SELECT
SUM ( IF (`pos`>0 AND `pos`<4,1,0)) AS `top3`,
SUM ( IF (`pos`>3 AND `pos`<8,1,0)) AS `top7`,
SUM ( IF (`pos`>7 AND `pos`<11,1,0)) AS `top10`,
IF(`se`='y',SUM(`topay`),0) as `pay`,
`key`,`se`,...

Ошибка вываливается такая:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '( IF (`pos`>0 AND `pos`<4,1,0)) AS `top3`, SUM ( IF (`pos`>3 AND `pos`<8,1,0)) A' at line 2

Кто нибудь когда нибудь такое видел?

Ответы: 16 → “Запрос работает, но не работает.”

  1. Сергей Терещенко Ответить

    Да скорее всего что-то напутал со скобками или кавычками. Но если судить по тексту ошибки, неправильная запись лексемы. Опять-таки может быть из-за скобок

  2. Александр Усков Ответить

    Так если сделать echo $query и засунуть запрос в phpmyadmin – ошибок нет, и результат верный. Из этого я делаю вывод что запрос правильный.

  3. Сергей Терещенко Ответить

    тогда точно с кавычками дело, попробуй убрать кавычки в переменных

  4. Александр Усков Ответить

    все переменные числовые.
    вот конечный вид запроса

    SELECT `key`,`se`,
    SUM (IF(`pos`>'0' AND `pos`<'4',1,0)) as `top3`,
    SUM ( IF (`pos`>'3' AND `pos`<'8',1,0)) as `top7`,
    SUM ( IF (`pos`>'7' AND `pos`<'11',1,0)) as `top10`,

    IF(`se`='y',SUM(`topay`),0) as `pay`,

    MIN(
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`))
    )
    as `from`,

    MAX(
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`))
    )
    as `to`,
    MAX(IF (`state`=1,
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`)),-1)
    )
    as `tostate`,

    MIN(IF (`state`=1,
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`)),-1)
    )
    as `fromstate`

    FROM `query` WHERE

    `url`='qwerty'
    AND (
    `day`>20 AND `day`<='28' AND `month`='4' AND `year`='2009')
    GROUP BY `kid`,`se`
    ORDER BY `kid` ASC,SUBSTRING(`se`,5) ASC

    скобки все на месте

  5. Сергей Терещенко Ответить

    даже не знаю что сказать

  6. Павел Хрулёв Ответить

    PHP при запросе где-то кавычку подставляет. Все-таки дело в кавычках.

  7. Александр Сердюк Ответить

    а можно не готовый запрос, а как он формируется?
    И еще заметил тут:
    AND (
    `day`>20 AND `day`<='28' AND `month`='4' AND `year`='2009')
    GROUP BY `kid`,`se`
    первый `day` не берется в апострофы, а второй – берется.

  8. Александр Усков Ответить

    ну с числами без разницы с апострофами или без.
    формируется он так.
    до FROM все константой
    потом
    WHERE `url`='".$k['url']."'
    AND (`day`>".$day." AND `day`<=".$day_." AND `month`=".$month."'' AND `year`='".$year."')
    а потом опять константой

  9. Александр Сердюк Ответить

    ..AND `month`=".$month." ' ' AND `year`..
    О.О это что ?
    кстати при формировании кавычек вокруг чисел не наблюдаю, а в итоге они есть.. мистика?))) или мажик квотес?) или ты не рабочий код сюда копировал, а "так" написал?

  10. Александр Усков Ответить

    да, я перенабрал.
    ну да, у month лишнуюю кавычку поставил)
    magic_quotes черт это идея. правда оно же на get post cookies только а там ни то ни то ни то не используется. щас проверю.
    Хотя непонятно как тогда все остальное рабоатет)

  11. Александр Усков Ответить

    Потрясающе, magic quotes были включены однако ничему это не мешало. С их выключением тоже ничего не поменялось.

    вот копипаста кода.
    $query="SELECT `key`,`se`, SUM (IF(`pos`>'0' AND `pos`<'4',1,0)) as `top3`,
    SUM ( IF (`pos`>'3' AND `pos`<'8',1,0)) as `top7`,
    SUM ( IF (`pos`>'7' AND `pos`<'11',1,0)) as `top10`,
    IF(`se`='yandex',SUM(`topay`),0) as `pay`,
    MIN(
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`))
    )
    as `from`,
    MAX(
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`))
    )
    as `to`,
    MAX(IF (`state`=1,
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`)),-1)
    )
    as `tostate`,
    MIN(IF (`state`=1,
    UNIX_TIMESTAMP(CONCAT_WS('-',`year`,`month`,`day`)),-1)
    )
    as `fromstate`

    FROM `query` WHERE

    `url`='".$value['url']."'
    AND (
    ".
    (
    (($month==$prevmonth)&&($year==$prevyear))?
    "`day`>'20' AND `day`<='".$day."' AND `month`='".$month."' AND `year`='".$year."'"
    :
    "`day` >'20'
    AND `month` =".$prevmonth." AND `year`=".$prevyear."
    OR `day` <='".$day."'
    AND `month` =".$month." AND `year`=".$year
    )
    .")
    GROUP BY `kid`,`se`
    ORDER BY `kid` ASC,SUBSTRING(`se`,5) ASC";

    $m=mysql_query($query) or die(mysql_error());

  12. Алексей Сонькин Ответить

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

    как минимум такими вот:
    AND `year`=".$year
    =>
    AND `year`=$year"

  13. Александр Сердюк Ответить

    ну тут реально надо методом усложнения запроса отыскивать ошибку.
    а еще, как одно из предположений, это что в IF надо условие взять в скобки также (хотя вероятность, что ошибка в этом – 10% всего).
    SUM (IF((`pos`>'0' AND `pos`<'4'),1,0)) as `top3`,

  14. Александр Усков Ответить

    Алексей, нед, ну вы понимаете – если запрос распечатать и отправить в phpmyadmin как есть, все работает. echo же вывел бы лишние кавычки если они бы они там были.

    Александр, пробовал.

    Мистика, не иначе.

  15. Александр Усков Ответить

    Господа, блджад. Вы не поверите

    Это нечто не работало из за пробела между SUM и последующей открывающей скобкой.

    ZOMG.

    Всем спасибо

  16. Александр Сердюк Ответить

    о как. век живи, век учись :)

Ответить