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

CakePHP3.6使用PostgreSQL加密函数保存文件时,函数被解析为文本如何解决?

解决CakePHP中PostgreSQL加密函数被误当文本的问题

最近踩了个坑:我尝试用PostgreSQL的pgp_pub_encrypt_bytea函数加密文件并存储到数据库,结果生成的SQL里这个函数被包裹在单引号里当成纯文本了,完全没执行加密操作。

一开始的错误写法

我最初是直接把函数调用写进数据数组的file字段里:

$file_base64= base64_encode(file_get_contents($file['file']['tmp_name']));
$data = [
    'some_id' => $some_id,
    'name' => $file['file']['name'],
    'mime' => $file['file']['type'],
    'code'=>$code,
    'file' => "pgp_pub_encrypt_bytea(decode('$file_base64', 'base64'), dearmor('$pgp_public_key'))"
];

这时候CakePHP会把整个函数调用当成普通字符串,生成的SQL里file的值就是带单引号的这个字符串,PostgreSQL根本不会执行加密逻辑。

正确的解决方式:用CakePHP的SQL函数API

后来查了CakePHP文档里的「使用SQL函数」章节,发现需要用框架提供的func()方法来明确标记这是要执行的SQL函数,而不是普通文本。修改后的代码如下:

$data = [
    'some_id' => $some_id,
    'name' => $file['file']['name'],
    'mime' => $file['file']['type'],
    'code'=>$code,
    'file' => $table->query()->func()->pgp_pub_encrypt_bytea([
        "decode('$file_base64', 'base64'), dearmor('$pgp_public_key')" => 'literal'
    ])
];

通过$table->query()->func()->pgp_pub_encrypt_bytea()这种方式,CakePHP会正确识别这是一个SQL函数调用,生成的SQL会直接执行加密操作,完美解决了问题。

内容的提问来源于stack exchange,提问作者hug0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:19