我在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(
答案 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时,无论如何这都是一个很好的经验法则。