【问题标题】:How to check if postgres prepared statement exists already in PHP如何检查 PHP 中是否已经存在 postgres 准备好的语句
【发布时间】:2015-12-02 02:10:47
【问题描述】:

我有一个 PHP 脚本,有时会在一个脚本运行中多次调用一个函数。

函数如下所示:

function insert_values($values) {
$sql = "insert into...";
pg_prepare($connection,"statement_name",$sql);
pg_execute($connection,"statement_name",array($values));
}

到目前为止一切都很好 - 当它执行一次时

但是,如果我的脚本在同一连接上多次调用此函数,PHP 会给出警告:

[Tue Dec 01 20:58:31 2015] [error] [client 10.64.241.13] PHP Warning:  pg_prepare(): Query failed: ERROR:  prepared statement "insert_values" already exists in /var/www/include/classes/classes.php on line 955

现在,如果这只是一个简单的 PHP 警告,我可能不会注意它。

但是在 Postgres 端,它声明 Query failed: ERROR - 所以查询当然不会运行。

显然我理解为什么 Postgres 会杀死在同一连接上创建具有相同名称的新预准备语句的人。

所以....有人知道是否有一种简单的方法来检查if 准备好的语句是否已经存在,如果它已经存在,那么只需获取已经创建的准备好的语句?

谢谢。

【问题讨论】:

    标签: php postgresql prepared-statement


    【解决方案1】:

    一种解决方案是使用静态变量来指示您是否已经创建了语句。函数第一次执行时,$once 为 false,它会准备语句并将 $once 更改为 true。之后,它不会重新创建语句。

    function insert_values($values) {
        static $once = false;
        if ($once === false) {
            $sql = "insert into...";
            pg_prepare($connection,"statement_name",$sql);
            $once = true;
        }
        pg_execute($connection,"statement_name",array($values));
    }
    

    静态变量只存在于局部函数范围内,但它确实存在 当程序执行离开这个范围时不会失去它的价值。

    发件人:http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static

    【讨论】:

    • 静态 local 变量是在函数调用之间持续存在的变量。一旦初始化,它就可以像普通的自动局部变量一样使用,除了 next 进入作用域(即代码块的下一次调用)它将保留它具有的任何值当它超出范围时(即最后一次退出代码块。)
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2011-11-28
    • 2014-05-09
    • 1970-01-01
    • 2023-02-20
    • 2018-03-12
    相关资源
    最近更新 更多