Проблема с передачей timestamp в db_query()

Главные вкладки

Аватар пользователя raziel_2 raziel_2 28 октября 2011 в 23:59

Приветствую.
Есть проблема с обработкой запроса через db_query в модуле.

Думаю, я просто слабо знаю матчасть, т.е. опыта разработки модулей почти никакого, поэтому подскажите, пожалуйста.

Дано:
- Сайт на 6.22, БД под MySQL; В базе есть таблица с полями int(2){id}, int(3){data}, , int(11){timestamp}. В таблицу накапливаются некие статистические данные по контрольным точкам, соответственно - id точки, значение, и timestamp. Запись последнего происходит через преобразование вида strtotime($date), где $date = "23-01-2011"(в таком формате вводится при добавлении).

- Одна из функций модуля обрабатывает форму, в которую вводится дата в таком же формате, напр. "30-07-2011", результат сохраняется в некой переменной $from = strtotime(введенная_в_форму_дата);

Должен выполниться запрос, который выдаст последовательность значений от введенной даты до последней из имеющихся.

Проблема:
Ни один из этих трех вариантов запросов не работает(переменные содержат значения - проверено):
$result = db_query("SELECT * FROM {stat_data} WHERE {timestamp}>'%s' AND {id} = %d ORDER BY {timestamp} ASC", $from, $id)
или
$result = db_query("SELECT * FROM {stat_data} WHERE {timestamp}>%d AND {id} = %d ORDER BY {timestamp} ASC", $from, $id)
и даже запрос в нарушение правил:
$result = db_query("SELECT * FROM {stat_data} WHERE {timestamp}>'$from' AND {id} = $id ORDER BY {timestamp} ASC")
тоже не работает - отдаются либо все значения с начала, либо выдается ошибка, в которой видно, что запрос идет как ...WHERE {timestamp}> AND...

Если я пишу явно {timestamp}>'1302037200', то отрабатывается как надо.
Помогите понять, что я делаю не так? Есть возможность менять все что угодно, включая начинку базы.

Комментарии

Аватар пользователя raziel_2 raziel_2 29 октября 2011 в 0:38

"xxandeadxx" wrote:
скобками обрамляются только названия таблиц, а не полей

Заработался:) Убрал, но все равно эффект тот же самый.

Аватар пользователя raziel_2 raziel_2 29 октября 2011 в 0:48

Сообразно описанным выше вариантам:
$result = db_query("SELECT * FROM {stat_data} WHERE timestamp>'%s' AND id = %d ORDER BY timestamp ASC", $from, $id)

...

$result = db_query("SELECT * FROM {stat_data} WHERE timestamp>%d AND id = %d ORDER BY timestamp ASC", $from, $id)

...

$result = db_query("SELECT * FROM {stat_data} WHERE timestamp>'$from' AND id = $id ORDER BY timestamp ASC")

Аватар пользователя raziel_2 raziel_2 29 октября 2011 в 3:19

Сделал:

SELECT *
FROM `stat_data`
WHERE `id` = 2
AND `timestamp` > 1306875600
ORDER BY `timestamp` ASC
LIMIT 0 , 30

Вывело записи где timestamp > 1306875600 и `id` = 2. Все как надо. О чем я и писал в самом начале - если указать значение даты в запросе, например:
$result = db_query("SELECT * FROM {stat_data} WHERE timestamp>'1306875600' AND id = %d ORDER BY timestamp ASC", $id)
то все работает. Не понимаю, что же не так..

Аватар пользователя raziel_2 raziel_2 29 октября 2011 в 20:42

penexe,
вот что имеем:

user warning: 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 '1SELECT * FROM stat_data WHERE timestamp > 1306875600 AND id = 2 ORDER BY timestamp ASC' at line 1 query: 1SELECT * FROM stat_data WHERE timestamp > 1306875600 AND id = 2 ORDER BY cpday ASC in (...)

Если убрать 1 перед SELECT, выдает все значения таблицы.