В общем я такое вижу в первый раз и не могу понять в чем косяк хоть тресни.
Есть 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
Кто нибудь когда нибудь такое видел?
Да скорее всего что-то напутал со скобками или кавычками. Но если судить по тексту ошибки, неправильная запись лексемы. Опять-таки может быть из-за скобок
Так если сделать echo $query и засунуть запрос в phpmyadmin – ошибок нет, и результат верный. Из этого я делаю вывод что запрос правильный.
тогда точно с кавычками дело, попробуй убрать кавычки в переменных
все переменные числовые.
вот конечный вид запроса
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
скобки все на месте
даже не знаю что сказать
PHP при запросе где-то кавычку подставляет. Все-таки дело в кавычках.
а можно не готовый запрос, а как он формируется?
И еще заметил тут:
AND (
`day`>20 AND `day`<='28' AND `month`='4' AND `year`='2009')
GROUP BY `kid`,`se`
первый `day` не берется в апострофы, а второй – берется.
ну с числами без разницы с апострофами или без.
формируется он так.
до FROM все константой
потом
WHERE `url`='".$k['url']."'
AND (`day`>".$day." AND `day`<=".$day_." AND `month`=".$month."'' AND `year`='".$year."')
а потом опять константой
..AND `month`=".$month." ' ' AND `year`..
О.О это что ?
кстати при формировании кавычек вокруг чисел не наблюдаю, а в итоге они есть.. мистика?))) или мажик квотес?) или ты не рабочий код сюда копировал, а "так" написал?
да, я перенабрал.
ну да, у month лишнуюю кавычку поставил)
magic_quotes черт это идея. правда оно же на get post cookies только а там ни то ни то ни то не используется. щас проверю.
Хотя непонятно как тогда все остальное рабоатет)
Потрясающе, 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());
попробуйте сначала упростить это, избавившись от лишних кавычек… может так получится найти, где что нехорошее вылезает…
как минимум такими вот:
AND `year`=".$year
=>
AND `year`=$year"
ну тут реально надо методом усложнения запроса отыскивать ошибку.
а еще, как одно из предположений, это что в IF надо условие взять в скобки также (хотя вероятность, что ошибка в этом – 10% всего).
SUM (IF((`pos`>'0' AND `pos`<'4'),1,0)) as `top3`,
Алексей, нед, ну вы понимаете – если запрос распечатать и отправить в phpmyadmin как есть, все работает. echo же вывел бы лишние кавычки если они бы они там были.
Александр, пробовал.
Мистика, не иначе.
Господа, блджад. Вы не поверите
Это нечто не работало из за пробела между SUM и последующей открывающей скобкой.
ZOMG.
Всем спасибо
о как. век живи, век учись