编辑:我感谢丹尼尔和丹尼斯。问题现在已经解决了,正如他们巧妙地指出的那样,这种情况下的问题是程序员(特别是没有彻底思考)我希望我能接受这两个答案。
注意:说我是 postgresql 新手是在侮辱新手!
我正在编写一个 Web 应用程序,它将利用 PostgreSQL 数据库进行数据存储。到目前为止,我已经很好地掌握了创建查询并从中检索结果的语法,无论是查找、删除、插入还是更新。然而,我遇到了一个困境。
为了避免 SQL 注入问题,使用pg_prepare()/pg_execute()
or pg_query_params
被推荐。我正在使用更多的pg_prepare()/pg_execute()
比我是另一个。但每个查询都是一个 4 步过程,
- 准备查询字符串本身,
- 在数据库上准备查询(使用 pg_prepare)
- 执行查询(pg_execute)
- 处理/操纵返回的数据。
因为这是一个 PHP 脚本,所以准备好的查询不会在脚本终止时自动释放,因此需要通过以下调用手动完成:
pg_query($dbconn, "DEALLOCATE 'query_name';")
但是,那DEALLOCATE
SQL 命令不会返回有关成功或失败的有用信息,因此在尝试确定结果时DEALLOCATE
指令,试图确定是否:
- 查询成功,释放也成功
- 查询成功,释放失败
- 查询失败,释放也失败
- 查询失败并且释放成功(我不相信这种情况会发生)
我的问题有两个”
- 我如何(禁止向服务器重复查询有关已解除分配的查询)确定解除分配是否成功,以及
- 有没有一种简单的方法来确定查询的哪一部分失败(如果失败)释放或查询本身的发送?
这个问题提供了部分解决方案,但对查找错误根源没有帮助。PHP/PostgreSQL:检查准备好的语句是否已存在 https://stackoverflow.com/q/1193020/1658512
当释放语句时,返回值pg_query
指示成功与否,就像任何“实用程序声明”一样。失败时应该返回 false。例如:
if (!pg_query($cnx, "deallocate foobar")) {
echo "Error deallocate: " . pg_last_error($cnx);
}
else {
echo "deallocate successful";
}
这显示:
错误解除分配:错误:准备好的语句“foobar”不存在
请注意,要释放的语句名称不能用单引号括起来,因为它是标识符,而不是字符串文字。如果由于有问题的字符而需要将其括起来,可以使用pg_escape_identifier http://www.php.net/manual/en/function.pg-escape-identifier.php(php>=5.4.4)
要清理会话,甚至不需要迭代准备好的语句并逐一释放它们,您可以调用DEALLOCATE ALL http://www.postgresql.org/docs/current/static/sql-deallocate.html相反,仍然与pg_query
.
还有另一条语句在一个查询中进行更多清理:DISCARD ALL http://www.postgresql.org/docs/current/static/sql-discard.html
另外,如果脚本确实与 postgres 断开连接,则这些都不是必需的,因为准备好的语句对于其父会话而言是本地的,并会随之消失。
当在脚本之间使用连接重用时,显式清理是必要的,无论是通过 PHP 进行持久连接(pg_pconnect
),或者像这样的连接池保镖 http://wiki.postgresql.org/wiki/PgBouncer(尽管池化器本身可能会调用DISCARD ALL
取决于其配置)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)