Это беспокоит меня последние два (почти три) часа - и проявляется только на одной платформе.
Вот схема для таблицы SQL:
CREATE TABLE cache ( url TINYTEXT,
data MEDIUMTEXT,
retrieval_timestamp INT,
ttl INT )
Теперь мой PHP-код использует драйвер SQLite PDO для создания файла базы данных на диске. Вышеприведенный оператор SQL выполняется, и таблица создается. Пока все хорошо - все мои тестовые машины успешно выполняют этот оператор.
Далее я вставляю данные в таблицу - и снова все машины вставляют данные без ошибок. Поскольку SQLite хранит базу данных в файле, я могу просто открыть его в SQLite Database Browser и убедиться, что данные вставлены.
Вот здесь-то и возникает проблема: Я не могу получить данные на машине CentOS под управлением PHP 5.2.
Вот код PHP, который я использую (имейте в виду, что он работает на PHP 5.3 под Windows):
$statement = $this->database->prepare('SELECT data FROM cache WHERE url = ? AND retrieval_timestamp + ttl >= ?');
$statement->bindValue(1, $url);
$statement->bindValue(2, time(), PDO::PARAM_INT);
$statement->execute();
На машине CentOS вышеприведенный код выполняется без ошибок. Но вместо ожидаемых строк (которые другие машины возвращают при точно таком же запросе) я не получаю ничего - никаких строк. Если я изменю SELECT data
на SELECT data, retrieval_timestamp + ttl
, я могу просмотреть результаты выражения и сравнить их с текущей временной меткой вручную - и данные действительно удовлетворяют условию, поэтому они должны быть возвращены в результатах.
Если я удалю вторую часть WHERE
, ожидаемые данные будут возвращены, но, конечно, это противоречит цели таблицы :)
Что я делаю не так?
Обновление: все более странно - когда я использую query
вместо prepare
и указываю параметры вручную, все работает (на машине CentOS). Таким образом, похоже, что это проблема с подготовленными операторами.
Вот файл SQLite: http://dl.dropbox.com/u/31080052/test.sqlite
Вот запрос, который я выполняю на нем:
SELECT data FROM cache WHERE url = 'c' AND retrieval_timestamp + ttl >= 1326780275