Использование plphp - как записать шестнадцатеричный вывод с дополнением в столбец bytea в PostgreSQL - PullRequest
0 голосов
/ 09 ноября 2011

ПЫТАЕТСЯ ЗАПИСАТЬ 12-байтовую строку в PostgreSQL

Наш код рассчитывает число $. Затем мы не хотим преобразовывать его в шестнадцатеричное, дополнять его нулями и записывать в байтовое поле PostgreSQL. Легко, правда?

(Как пример) Хотелось бы, чтобы он возвращал: \ x000000002257 ('\ x' + 12 байт) то есть левое шестнадцатеричное представление числа 8791:

$number = 8791;

$hexnumber = str_pad(dechex($number), 12, '0', STR_PAD_LEFT);
$packed_hex = pack('h*', $hexnumber);

// BOTH of below produce:  000000002257
pg_raise('notice', "hexnumber:         ".$hexnumber);

Невозможно получить ни одного этих запросов для обновления байты, как мне хотелось бы. Помогите!

//$query = ("UPDATE blobtest SET destfile = '".$hexnumber."' WHERE pkey = ".$args[0]);

// $query = ("UPDATE blobtest SET destfile = '000000002257' WHERE pkey = ".$args[0]);
// Above produces:  \x303030303030303032323537
// (makes sense; it's quoted as a string)

// $query = ("UPDATE blobtest SET destfile = 000000002257 WHERE pkey = ".$args[0]);
// Above produces: ERROR:  column "destfile" is of type bytea but expression is of type integer

// $query = ("UPDATE blobtest SET destfile = '8791' WHERE pkey = ".$args[0]);
// Above produces:  \x38373931  as expected...

/ $query = ("UPDATE blobtest SET destfile = 8791 WHERE pkey = ".$args[0]);
// Above produces: ERROR:  column "destfile" is of type bytea but expression is of type integer

// $query = ("UPDATE blobtest SET destfile = '"."'".$packed_hex."'"."' WHERE pkey = ".$args[0]);
// Above produces:  \x only...

$query = ("UPDATE blobtest SET destfile = "."'".$packed_hex."'"." WHERE pkey = ".$args[0]);
// unterminated quoted string at or near "'"

1 Ответ

1 голос
/ 17 сентября 2012

Похоже, вы только что забыли ведущий \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]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...