首页 文章

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

提问于
浏览
4

我在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 回答

  • 1

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

    第一个选项是在同一个调用中发送所有查询

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

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

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

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

    在与Postgres合作时,无论如何这都是一个很好的经验法则 .

  • 1

    只需简化代码:

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

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

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

相关问题