我在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”不存在语境:/home/sites/blah.com/中第2行附近的PL / pgSQL函数“user_login”的编译第69行的index.php
该函数的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 回答
如果您的查询涵盖多行,那么PHP很可能不会将它们作为同一事务的一部分发送 . 如果是这种情况,您有两种选择 .
第一个选项是在同一个调用中发送所有查询
第二种选择(我认为最好)是使用交易 . 这将允许您通过几行来进行调用,尽管begin语句很可能需要与初始查询一起发送 .
如果发生错误,则使用回滚替换提交,并且不会对数据库进行任何更改 .
在与Postgres合作时,无论如何这都是一个很好的经验法则 .
只需简化代码:
现在你可以安全地从SQL注入 .
但是,您的函数仍然是错误的,没有数据类型“session_ids” . 我想你想在DECLARE部分使用TEXT .