画像をデータベースに保存しようとしていますが、何らかの理由で機能していないようです。これが私のテーブルの構造です。
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)の値を出力すると、画面には大量のデータがあります。しかし、この値はデータベースに保存されないため、私が直面している問題です。
$sql = "INSERT INTO ImageStore(ImageId,Image)
VALUES('$this->image_id','file_get_contents($tmp_image)')";
これにより、PHP $sql
という名前の文字列が作成されます。まだクエリを実行していないため、MySQLについては忘れてください。文字列を作成しているだけです。
PHP)の魔法は、変数名を書くことができることを意味します—たとえば、$this->image_id
—inside二重引用符と変数は依然として魔法のように拡張されます。
「変数補間」として知られるこの機能は、関数呼び出しでは発生しません。したがって、ここで行っているのは、文字列"file_get_contents($tmp_image)"
をデータベースに書き込むことだけです。
したがって、file_get_contents($tmp_image)
を呼び出した結果を連結するには、文字列から飛び出し、明示的に処理する必要があります。
$sql = "INSERT INTO ImageStore(ImageId,Image)
VALUES('$this->image_id','" . file_get_contents($tmp_image) . "')";
(これがどのように機能したかを強調する構文からでも見ることができます。)
ここでの問題は、バイナリデータに'
が含まれている場合、クエリが無効になることです。したがって、mysql_escape_string
を介して実行し、クエリ操作のためにサニタイズする必要があります。
$sql = "INSERT INTO ImageStore(ImageId,Image)
VALUES('$this->image_id','" . mysql_escape_string(file_get_contents($tmp_image)) . "')";
これで、really大きな文字列ができ、データベースが大きくなりました。
データベースに画像を保存しないことをお勧めします 、あなたがそれを助けることができます。
Tomalakのコメントを拡張するには、引用符内で関数を実行することはできません。
試してください:
$sql = "INSERT INTO ImageStore(ImageId,Image)
VALUES('{$this->image_id}','".file_get_contents($tmp_image)."')";
これを試して:
$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);
前述のように、文字列"file_get_contents($tmp_image)"
をデータベースに保存するだけですが、代わりに関数file_get_contents
を実行する必要があります
_に保存する前に、base64_encode
などのハッシュアルゴリズムを使用して画像をハッシュすることを忘れないでください。