Похоже, вы только что забыли ведущий \x
для литерала байта.Если $packed_hex
содержит 000000002257
, вы можете написать:
$query = ("UPDATE blobtest SET destfile = '\x".$packed_hex."' WHERE pkey = ".$args[0]);
Вам потребуется SET bytea_output = 'hex'
в PostgreSQL 9.0 и ниже (IIRC), чтобы вернуть байту в шестнадцатеричной форме, а не в старом старом.восьмеричный формат побега.В новых версиях по умолчанию используется hex
.
SQL-инъекция
<soapbox>
Ваш код демонстрирует дурную привычку.Используйте параметризованные запросы, чтобы избежать внедрения SQL.packed_hex
может быть сгенерировано в вашем приложении на данный момент, но кто знает, как этот код может быть повторно использован позже.Всегда используйте параметризованные запросы, чтобы избежать SQL-инъекций .См. руководство PHP по SQL-инъекции . </soapbox>
Как написано, ваш код ужасно, ужасно небезопасен.Представьте, что в $args[0]
содержится NULL);DROP SCHEMA public;--
от злонамеренного пользователя.Вы только что отправили:
UPDATE blobtest SET destfile = '\000000002257' WHERE pkey = 0);DROP SCHEMA public;--);
в вашу базу данных, которая сделала UPDATE, которая ничего не сделала, затем DROP SCHEMA public;
, который, скорее всего, уничтожил вашу базу данных, а затем комментарий, который игнорирует остальные.Ой, сплат, там твоя база данных, Бобби таблицы снова удары.
Это было бы лучше записать как:
$stm = pg_prepare($connection, "", "UPDATE blobtest SET destfile = $1 WHERE pkey = $2");
$result = pg_execute($connection, "", array($packed_hex, $args[0]));