1

最近、MySQL から PostgreSQL に切り替えました。ただし、1 つ問題が残っています。

以前は、小さな画像を MySQL の BLOB 形式で保存していました。

PostgreSQL は BLOB などを認識しません。

代わりに BYTEA フィールド タイプを使用してみました。これは実際に大きな(16進数?)文字列を挿入すると思いますが、この文字列をPHPで実際の画像を表示するように戻そうとしています..

何か案は?前もって感謝します。

画像をデータベースに保存するために使用するコードは次のとおりです。

$data = bin2hex(file_get_contents('php://input'));

if (!empty($data)) {
  $sql = "UPDATE asset SET data = X'%s' WHERE uuid = '%s'";
  $args = array($data, $asset_uuid);
}

psql (9.1.3) と php 5.3.6 を使用

4

3 に答える 3

3

Byteaはバイト配列です。それはビットパターンではありません。PostgreSQLLexicalStructureのセクション4.2.1.5を参照してください。

byteaを入力する正しい方法は、16進値の「\x...」です。したがって、必要なのはSET data ='\ x%s'です。

pg_prepareを使用してプリペアドステートメントを調べることもできます。

編集:私はこれで(テキスト)ファイルをbyteaに挿入することができました:

$source = file_get_contents( 'hello.php' );
$insert = pg_prepare( $conn, '', 'insert into t (name, data) values($1,$2)' );
pg_execute( $conn, '', array( 'hello.php', $source ) );

3番目の編集:これは、ファイルをデータベースに挿入するために正常に機能します。ただし、PHPのpgsqlドライバーは非常に失礼です。実際のデータを取得する唯一の方法は、pg_unescape_byteaで詳しく説明されているように、古いbyteaエスケープメカニズムを使用することです。

pg_query('SET bytea_output = "escape";');

$result = pg_query( 'select data from t' );

while ( $row = pg_fetch_row( $result ) ) {
    echo pg_unescape_bytea( $row[0] );
}

これがどれほど迷惑なのかごめんなさい。PHPのPostgreSQLインターフェースは、バイナリ値の大幅な見直しを行うことができます。

于 2012-06-22T20:06:12.727 に答える
3

ここに投稿された両方の回答からいくつかの考えが浮かびましたが、100% の回答はありませんでした。

したがって、この回答では、それを機能させるために何をしたかを説明します。

画像を表示するときは、これを使用しました:

header('Content-Type: image/jpeg');

$data = pack("H*", pg_unescape_bytea($data));

echo $data;

PHP 5.3.8 を実行していますが、PHP 5.4.0 では pack の代わりに hex2bin を使用できることがわかりました。

データベースに画像を追加するとき、私はこれを使用しました:

$data = pg_escape_bytea($data); // Escape input for PostgreSQL
$sql  = "UPDATE asset SET data = '%s'WHERE uuid = '%s'";

私はそれが今働いていることをうれしく思います。ダニエルとヨハンの両方に感謝します!

于 2012-06-26T22:10:57.633 に答える