Вставить Blobs в базы данных MySql с помощью php

Я пытаюсь сохранить изображение в DataBase, по какой-то причине он не работает. Вот структура моей таблицы.

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внутри двойных кавычек, и переменная все еще волшебным образом расширяется.

Эта функция, известная как «переменная интерполяция», не возникает для вызовов функций. Итак, все, что вы здесь делаете, записывает в базу данных строку "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)

Теперь у вас действительно большая строка, и ваша база данных становится громоздкой.

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

Чтобы расширить комментарий 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)" в db, но вам нужно запустить функцию file_get_contents вместо
не забывайте хэш-изображение с помощью алгоритма хеширования, такого как base64_encode перед base64_encode как сохранить его в db.