开发者

Using pg_execute, I can't use now() or null values

开发者 https://www.devze.com 2023-02-05 05:15 出处:网络
I\'m using pg_prepare to prepare my SQL statements in PHP. When I try to pg_execute with a value that needs to be NULL, the function fails. Simi开发者_JAVA技巧larly, it will fail when using the SQL ke

I'm using pg_prepare to prepare my SQL statements in PHP. When I try to pg_execute with a value that needs to be NULL, the function fails. Simi开发者_JAVA技巧larly, it will fail when using the SQL keyword now().

Code:

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')));

Error:

[pg_execute]: Query failed: ERROR: invalid input syntax for integer: "NULL" in actions.php on line 49

Doing a normal pg_query works. Any ideas on how to get around this?


I recall you can use PHP's null constant for that:

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

This will definitely not work with SQL functions though, you will have to embed these in the statement beforehand:

pg_prepare(
   $connection, 
   "insert_autosave", 
   'INSERT INTO autosave (some_date) VALUES (NOW())'
);


netcoder already explained how to take care of the NULL case. It's also possible to pass now() via a placeholder, using the special date/time input values "now", "today", etc. (See documentation for more info)

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'));

You can use $1::timestamp in cases where there's any ambiguity about the type.

NB! Never use this feature in directly SQL queries like 'now'::timestamp, because in this case the value will be parsed and remembered at prepare-time, and every execution will get the same time even if it's in a different transaction. NOW() is preferred in this case.

0

精彩评论

暂无评论...
验证码 换一张
取 消