web-dev-qa-db-ja.com

PHPを使用してMySqlデータベースにBLOBを挿入する

画像をデータベースに保存しようとしていますが、何らかの理由で機能していないようです。これが私のテーブルの構造です。

mysql> describe ImageStore;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| ImageId | int(11)  | NO   | PRI | NULL    |       |
| Image   | longblob | NO   |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

そして、ここに画像を挿入するか、少なくともそれがすべきことを示すクエリがあります:

//Store the binary image into the database
                $tmp_img = $this->image['tmp_name'];
                $sql = "INSERT INTO ImageStore(ImageId,Image)               
                VALUES('$this->image_id','file_get_contents($tmp_image)')";
                mysql_query($sql); 

File_get_contents($ tmp_image)の値を出力すると、画面には大量のデータがあります。しかし、この値はデータベースに保存されないため、私が直面している問題です。

15
nikhil

問題

$sql = "INSERT INTO ImageStore(ImageId,Image)
        VALUES('$this->image_id','file_get_contents($tmp_image)')";

これにより、PHP $sqlという名前の文字列が作成されます。まだクエリを実行していないため、MySQLについては忘れてください。文字列を作成しているだけです。

PHP)の魔法は、変数名を書くことができることを意味します—たとえば、$this->image_idinside二重引用符と変数は依然として魔法のように拡張されます。

「変数補間」として知られるこの機能は、関数呼び出しでは発生しません。したがって、ここで行っているのは、文字列"file_get_contents($tmp_image)"をデータベースに書き込むことだけです。


解決策(1)

したがって、file_get_contents($tmp_image)を呼び出した結果を連結するには、文字列から飛び出し、明示的に処理する必要があります。

$sql = "INSERT INTO ImageStore(ImageId,Image)
        VALUES('$this->image_id','" . file_get_contents($tmp_image) . "')";

(これがどのように機能したかを強調する構文からでも見ることができます。)


解決策(2)

ここでの問題は、バイナリデータに'が含まれている場合、クエリが無効になることです。したがって、mysql_escape_stringを介して実行し、クエリ操作のためにサニタイズする必要があります。

$sql = "INSERT INTO ImageStore(ImageId,Image)
        VALUES('$this->image_id','" . mysql_escape_string(file_get_contents($tmp_image)) . "')";

解決策(3)

これで、really大きな文字列ができ、データベースが大きくなりました。

データベースに画像を保存しないことをお勧めします 、あなたがそれを助けることができます。

Tomalakのコメントを拡張するには、引用符内で関数を実行することはできません。

試してください:

$sql = "INSERT INTO ImageStore(ImageId,Image)               
        VALUES('{$this->image_id}','".file_get_contents($tmp_image)."')";
4
Ben

これを試して:

$tmp_img = $this->image['tmp_name'];
$sql = "INSERT INTO ImageStore(ImageId,Image)               
  VALUES('$this->image_id','" . addslashes(file_get_contents($tmp_image)) . "')";
mysql_query($sql);
2
classic

前述のように、文字列"file_get_contents($tmp_image)"をデータベースに保存するだけですが、代わりに関数file_get_contentsを実行する必要があります
_に保存する前に、base64_encodeなどのハッシュアルゴリズムを使用して画像をハッシュすることを忘れないでください。

2
RezaSh