You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP PDO预准备语句更新PostgreSQL hstore类型字段报错求助

PHP PDO预准备语句更新PostgreSQL hstore类型字段报错求助

嘿,我看你遇到的问题是用PDO预准备语句更新PostgreSQL的hstore字段时,因为占位符的写法不对导致报错对吧?

首先得说你原来的写法问题出在哪:你把:iso2和:name这两个占位符包在了单引号里,PDO根本识别不出这是要替换的参数,它会把':iso2'当成一个普通的字符串字面量,自然就找不到对应的参数了,所以才会报SQLSTATE[HY093]: Invalid parameter number这个错。而且手动拼接hstore字符串的方式在预准备语句里本来就不适合,很容易踩引号的坑。

给你两个靠谱的解决办法,都是避开引号问题的:

  • 方法一:直接用PostgreSQL的hstore()构造函数(推荐)
    这个函数可以直接接收键和值作为参数,完美适配PDO的占位符,写法也更清晰:

    $stmt = $dbh2->prepare("UPDATE country SET name_local = name_local || hstore(:iso2, :name) WHERE id = 996;");
    $stmt->execute(['iso2'=>'en', 'name' => 'Afghanistan']);
    

    这个写法和你手动执行的name_local || '''fr'' => ''Allemagne'''::hstore效果完全一样,而且不用纠结引号转义的问题。

  • 方法二:用数组形式构造hstore(适合批量添加键值对)
    如果之后需要一次性更新多个hstore键值对,可以用这种方式:

    $stmt = $dbh2->prepare("UPDATE country SET name_local = name_local || hstore(array[:key1, :key2], array[:val1, :val2]) WHERE id = 996;");
    $stmt->execute([
        'key1' => 'en',
        'val1' => 'Afghanistan',
        'key2' => 'fr',
        'val2' => 'Allemagne'
    ]);
    

你可以试试第一种方法,应该就能解决你的语法错误问题了~

备注:内容来源于stack exchange,提问作者Mugges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 15:19:08