PHP调用PostgreSQL函数 - 类型问题?

时间:2010-04-19 15:58:58

标签: php sql database postgresql plpgsql

我在PostgreSQL / plpgsql中有一个带有以下签名的函数:

CREATE OR REPLACE FUNCTION user_login(TEXT, TEXT) RETURNS SETOF _get_session AS $$ ... $$

_get_session是一个视图。从phpPgAdmin调用它时该函数工作正常,但是我从PHP调用它时出现以下错误:

  

警告:pg_query()[function.pg-query]:查询失败:错误:类型   “session_ids”不存在语境:编译PL / pgSQL函数   第69行/home/sites/blah.com/index.php第2行附近的“user_login”

该函数的DECLARE部分包含以下变量:

oldSessionId session_ids := $1;
newSessionId session_ids := $2;

域session_ids存在,并且当从同一脚本调用时,使用相同域的其他函数也可以工作。 PHP如下:

$query = "SELECT * FROM $dbschema.user_login('$session_old'::TEXT, '$session'::TEXT)";
$result = pg_query($login, $query);

我在调用函数时也使用::session_ids代替::TEXT尝试了此操作,但是我收到了同样的错误。

帮助:o(

2 个答案:

答案 0 :(得分:1)

只需简化您的代码:

$query = "SELECT * FROM $dbschema.user_login($1, $2)";
$result = pg_query_params($login, $query, array($session_old, $session));

现在你可以安全地从SQL注入。

但是,你的函数仍然是错误的,没有数据类型“session_ids”。我想你想在DECLARE部分使用TEXT。

答案 1 :(得分:1)

如果您的查询涵盖多行,那么PHP很可能不会将它们作为同一事务的一部分发送。如果是这种情况,您有两种选择。

第一个选项是在同一个呼叫中发送所有查询

pg_query("query1; query2; query3;");

第二种选择(我认为最好)是使用交易。这将允许您通过几行开始调用,尽管begin语句很可能需要与初始查询一起发送。

pg_query("begin; query1;");
pg_query("query2;");
pg_query("commit;");

如果发生错误,则使用回滚替换提交,并且不会对数据库进行任何更改。

在使用Postgres时,无论如何这都是一个很好的经验法则。