gpt4 book ai didi

php - 取消分配准备好的查询

转载 作者:可可西里 更新时间:2023-11-01 13:45:17 26 4
gpt4 key购买 nike

编辑:感谢 Daniel 和 Dennis。现在问题已经解决了,正如他们巧妙地指出的那样,这种情况下的问题是程序员(特别是没有一直思考)我希望我能接受这两个作为答案。

注意:说我是 postgresql 新手是对新手的侮辱!

我正在编写一个网络应用程序,它将使用 PostgreSQL 数据库作为其数据存储。到目前为止,我已经很好地掌握了创建查询和从中检索结果的语法,无论是查找、删除、插入还是更新。然而,我遇到了一个难题。

为避免 SQL 注入(inject)问题,建议使用 pg_prepare()/pg_execute()pg_query_params。我使用的 pg_prepare()/pg_execute() 比其他的要多。但是每个查询都是一个 4 步过程,

  1. 自己准备查询字符串,
  2. 在数据库上准备查询(使用 pg_prepare)
  3. 执行查询(pg_execute)
  4. 处理/操纵返回的数据。

因为这是一个 PHP 脚本,准备好的查询不会在脚本终止时自动释放,因此需要通过如下调用手动完成:

pg_query($dbconn, "DEALLOCATE 'query_name';")

但是,DEALLOCATE SQL 命令不返回任何关于成功或失败的有用信息,因此当试图确定 DEALLOCATE 指令的结果时,它变得一团糟确定是否:

  1. 查询成功,释放成功
  2. 查询成功,释放失败
  3. 查询失败,释放失败
  4. 查询失败,释放成功(我不相信这会发生)

那么我的问题有两个方面"

  1. 我如何(除非向服务器重复查询有关解除分配的查询)确定解除分配是否成功,以及
  2. 是否有一种简单的方法来确定查询的哪一部分失败(在失败的情况下)解除分配,或者查询本身的发送?

这个问题给出了部分解决方案,但对找到错误的来源没有帮助。 PHP/PostgreSQL: check if a prepared statement already exists

最佳答案

当取消分配语句时,pg_query 的返回值指示成功与否,就像任何“实用程序语句”一样。失败时它应该返回 false。例如:

 if (!pg_query($cnx, "deallocate foobar")) {
echo "Error deallocate: " . pg_last_error($cnx);
}
else {
echo "deallocate successful";
}

这显示:

Error deallocate: ERROR: prepared statement "foobar" does not exist

请注意,要释放的语句名称不能用单引号括起来,因为它是标识符,而不是字符串文字。如果因为有问题的字符需要将其括起来,可以使用 pg_escape_identifier 来完成。 (php >=5.4.4)

要清理 session ,甚至不需要遍历准备好的语句并逐条释放它们,您可以调用 DEALLOCATE ALL相反,仍然使用 pg_query

还有另一个语句在一个查询中做更多的清理工作: DISCARD ALL

此外,如果脚本真的与 postgres 断开连接,那么这些甚至都不是必需的,因为准备好的语句对于它们的父 session 来说是本地的,并且会随之消亡。

在脚本之间使用连接重用时,显式清理是必要的,无论是通过 PHP (pg_pconnect) 的持久连接,还是像 pgBouncer 这样的连接池(尽管 pooler 本身可能会根据其配置调用 DISCARD ALL)。

关于php - 取消分配准备好的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19802833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com