Я пытаюсь сохранить файл в базе данных с помощью функции PostgreSQL (pgp_pub_encrypt_bytea) для шифрования файла.
Проблема в том, что функция анализируется как текст в результирующем запросе. Это массив данных:
$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'))"
];
Теперь в debug_kit это результирующий запрос:
INSERT INTO file_table (
some_id, name, mime, code, file
)
VALUES
(
26, '1.png', 'image/png', '07e24948c82a2d7b758266d84e8464a23904cf90a78dfb',
'pgp_pub_encrypt_bytea(decode(''<-- HERE IS THE FILE IN BASE64 TEXT -->'', ''base64''), dearmor(''<-- HERE IS THE PGP KEY -->''))'
) RETURNING *
Итак, вы видите, что это строка, которая передается как текст:
'pgp_pub_encrypt_bytea(decode(''<-- HERE IS THE FILE IN BASE64 TEXT -->'', ''base64''), dearmor(''<-- HERE IS THE PGP KEY -->''))'
Но мне нужно выполнить это как функцию - как я могу это сделать?
РЕШЕНИЕ:
Мне удалось найти свой ответ, я зашел в документацию cakephp и внимательно прочитал «Использование функций SQL»:
https://book.cakephp.org/3.0/en/orm/query-builder.html#using-sql-functions
И изменил мой массив данных на это:
$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()
Означает, что я хочу добавить в запрос функцию pgp_pub_encrypt_bytea.
Затем содержимое функции, которую мы хотим выполнить буквально:
["decode('$file_base64', 'base64'), dearmor('$pgp_public_key')" => 'literal']
Это устранило мою проблему = D






пожалуйста, переместите свое решение к собственному ответу, спасибо :)