Используя pg_execute, я не могу использовать now () или нулевые значения - PullRequest
0 голосов
/ 14 января 2011

Я использую pg_prepare для подготовки операторов SQL на PHP.Когда я пытаюсь pg_execute со значением, которое должно быть NULL, функция завершается ошибкой.Аналогичным образом произойдет сбой при использовании ключевого слова SQL now().

Код:

pg_prepare($connection, "insert_autosave", 'INSERT INTO autosave (category, editor, session_id, content, timeout, as_hook) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id');
$result = pg_execute($connection, "insert_autosave", array($category, $editor, $sid, $content, ($sto == "timeout" ? 'TRUE' : 'FALSE'), (is_numeric($asid) ? $asid : 'NULL')));

Ошибка:

[pg_execute]: сбой запроса: ОШИБКА: неверный синтаксис ввода для целого числа: «NULL» в actions.php в строке 49

Выполнение обычного pg_query работаетЕсть идеи как обойти это?

Ответы [ 2 ]

2 голосов
/ 14 января 2011

netcoder уже объяснил, как позаботиться о NULL случае. Также можно передать now () через заполнитель, используя специальные значения даты / времени для ввода "сейчас", "сегодня" и т. Д. ( См. Документацию для получения дополнительной информации )

pg_prepare(
   $connection, 
   "insert_autosave", 
   'INSERT INTO autosave (some_date) VALUES ($1)'
);
pg_execute($connection, "insert_autosave", array('now'));
pg_execute($connection, "insert_autosave", array('2010-01-14 20:24:43'));

Вы можете использовать $1::timestamp в тех случаях, когда есть неопределенность относительно типа.

NB! Никогда не используйте эту функцию непосредственно в SQL-запросах, таких как 'now'::timestamp, потому что в этом случае значение будет проанализировано и запомнено во время подготовки, и каждое выполнение получит одинаковое время, даже если оно находится в другой транзакции. NOW() является предпочтительным в этом случае.

2 голосов
/ 14 января 2011

Я помню, вы можете использовать константу PHP null для этого:

$result = pg_execute($connection, "insert_autosave", array(
   $category, 
   $editor, 
   $sid, 
   $content, 
   ($sto == "timeout" ? 'TRUE' : 'FALSE'), 
   (is_numeric($asid) ? $asid : null)
));

Это определенно не будет работать с функциями SQL, хотя вам придется заранее встроить их в оператор:

pg_prepare(
   $connection, 
   "insert_autosave", 
   'INSERT INTO autosave (some_date) VALUES (NOW())'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...