Jas*_*ase 5 php postgresql prepared-statement
编辑:我感谢丹尼尔和丹尼斯.这个问题现在已经解决了,正如他们巧妙地指出的那样,这个案例中的问题是程序员(特别是没有考虑到这一点)我希望我能接受这两个作为答案.
注意:说我是postgresql的新手是侮辱新手!
我正在编写一个Web应用程序,它将利用PostgreSQL数据库进行数据存储.在我到目前为止所做的工作中,我已经很好地掌握了创建查询和从中检索结果的语法,无论是查找,删除,插入还是更新.然而,我遇到了一个窘境.
为避免SQL注入问题,建议使用pg_prepare()/pg_execute()或pg_query_params推荐.我使用的pg_prepare()/pg_execute()比我更多.但每个查询都是一个4步过程,
因为这是一个PHP脚本,所以在脚本终止时不会自动释放准备好的查询,因此需要通过以下调用手动完成:
pg_query($dbconn, "DEALLOCATE 'query_name';")
但是,DEALLOCATESQL命令不返回有关成功或失败的有用信息,因此在尝试确定DEALLOCATE指令的结果时,尝试确定是否:
我的问题是双重的"
这个问题提供了部分解决方案,但在找到错误的来源方面没有帮助.PHP/PostgreSQL:检查准备好的语句是否已经存在
取消分配语句时,返回值pg_query表示成功与否,就像任何"实用程序语句"一样.失败时它应该返回false.例如:
if (!pg_query($cnx, "deallocate foobar")) {
echo "Error deallocate: " . pg_last_error($cnx);
}
else {
echo "deallocate successful";
}
Run Code Online (Sandbox Code Playgroud)
这显示:
错误解除分配:错误:准备好的语句"foobar"不存在
请注意,deallocate的语句名称不能用单引号括起来,因为它是标识符,而不是字符串文字.如果因为有问题的字符需要封闭它,可以用pg_escape_identifier(php> = 5.4.4)来完成
要清理一个会话,甚至不需要迭代准备好的语句并逐个取消分配它们,你可以调用它DEALLOCATE ALL,仍然可以pg_query.
还有另一个语句在一个查询中执行更多清理:
DISCARD ALL
此外,如果脚本确实与postgres断开连接,则甚至不需要这些,因为预准备语句是其父会话的本地语句并且随之死亡.
在脚本之间使用连接重用时,显式清理是必要的,要么使用PHP(pg_pconnect)的持久连接,要么使用像pgBouncer这样的连接池(尽管pooler本身可以调用,DISCARD ALL具体取决于其配置).