0

PHP (StreamWrapper) で単純な VFS (仮想ファイル システム) を作成し、そのデータを MySQL データベースに格納しました。データを格納するフィールドは中程度の BLOB です。

たとえば、PHPでできること:

copy( 'mytext.txt', 'dbfs://mytext.txt' );
copy( 'mytext.pdf', 'dbfs://mytext.pdf' ); or visa versa/etc.

問題は、SQL ステートメントを介して渡される pdf などのバイナリ データです。エスケープ、引用符の解除、base64 などは、データを破壊するか、大量のメモリ (オーバーヘッド) を消費します。たとえば、base64 は 3 倍のスペースを占有します。

最善の方法は、データベースにバイナリとして格納される 16 進文字列 (スペースの 2 倍のみ) にすることです (オーバーヘッドなし)。MySQL の HEX コマンドを見てきましたが、思い通りに動作させることができません。

たとえば、次のステートメントは、それをバイナリ データとして BLOB に格納しません。

UPDATE dbfs SET data=0xFF883838<very long string>FFA9999...... WHERE (fid=<number>)

私が作った機能:

private function writeFile( $fid, &$uData = null, $iFileSize = null )
{ 
 $sSql = 'UPDATE '.self::$dbTableNameFat.
         ' SET data="'.(($uData !== null)?('0x'.bin2hex($uData)):null).'"'.
     ',size="'.((int)$iFileSize).'" WHERE ( fid="'.$fid.'" );';
 return $this->writeQuery( $sSql ); 
}

BLOB にはデータが含まれていますが、バイナリではなく HEX 形式です。希望する動作を実現するにはどうすればよいですか?

4

1 に答える 1

0

準備されたクエリを使用します。PDO スタイルの構文を使用します。

private function writeFile($fid, &$uData = null, $iFileSize = null) {
    $stmt = $this->prepare(
        "UPDATE " . self::$dbTableNameFat .
        " SET data = :data, size = :size WHERE fid = :fid");
    $stmt->execute(array( 'data' => $uData,
                          'size' => $iFileSize,
                          'fid' => $fid
                        );
};

PDO ドキュメントはこちら

于 2013-07-30T14:16:03.473 に答える