Я пытаюсь сохранить файл в базе данных, используя функцию 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 (' '<- ЗДЕСЬ ФАЙЛ В ТЕКСТЕ BASE64 ->' ',' 'base64' '), dearmor (' '<- ЗДЕСЬ КЛЮЧ PGP -> '')) '
Но мне нужно выполнить это как функцию - как я могу это сделать?
РЕШЕНИЕ :
Мне удалось найти свой собственный ответ, я пошел на cakephp documentarion и внимательно прочитал «Использование функций 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')"=> 'буквальный']
Это исправлено му проблема = D