【问题标题】:PHP calling PostgreSQL function - type issue?PHP 调用 PostgreSQL 函数 - 类型问题?
【发布时间】:2011-02-09 18:23:59
【问题描述】:

我在 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”不存在 CONTEXT:PL/pgSQL 函数的编译 “user_login”在 /home/sites/blah.com/index.php 第 69 行的第 2 行附近

函数的 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(

【问题讨论】:

  • 我猜 pg_query 不能解析任意返回类型——它可以处理 TEXT、INT 等,但可能不知道如何处理视图。您是否尝试过“返回记录集”? :|
  • 谢谢,我没有,但同样的原则适用于数据库中的所有其他函数。总共有 4 个都返回 SETOF _whatever_view。真的很奇怪。另一个区别是这个函数是由不同的用户运行的(它有权运行所涉及的视图)。我搞不定:o(

标签: php sql database postgresql plpgsql


【解决方案1】:

让你的代码简单一点:

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

现在您可以避免 SQL 注入了。

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

【讨论】:

  • 感谢您的提示 - 我一定会这样做的。虽然有一个 session_ids 域 - 它;在其他功能中使用:o(
  • 您是否 100% 确定您的脚本和 pgAdmin 使用相同的数据库?
  • 公平的问题...是的,所有其他位都工作得很好(在相同的请求/响应上) - 只有这个功能导致了问题。
  • “session_ids”域是否在可访问架构中?如果它的架构不在您的“search_path”中,也许您需要对其进行限定?
  • 谢谢米伦。 PostgreSQL 对我来说是新的(非常 - 几天),所以很可能就是这样。我不习惯限定模式,也不是 100% 确定它会在给定会话/连接的范围内停留多长时间。我可以说的是,同一脚本中的较早查询是: $result = pg_query($db, "SET search_path TO $dbschema;");用户呢?用户是否需要对域和视图的权限?我找不到任何暗示这是这种情况...
【解决方案2】:

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

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

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

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

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

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

在使用 Postgres 时,这实际上是一个很好的经验法则。

【讨论】:

  • 谢谢。我解决了我已经遇到的问题,但这仍然是一些有趣的建议。
猜你喜欢
  • 1970-01-01
  • 2021-11-26
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多