Вставка BLOB-объектов в базы данных MySql с помощью php - PullRequest
15 голосов
/ 13 августа 2011

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

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), то на экране масса данных.Но это значение не сохраняется в базе данных, и это проблема, с которой я сталкиваюсь.

Ответы [ 4 ]

43 голосов
/ 13 августа 2011

Задача

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

Это создает строку в PHP с именем $sql. Забудьте о MySQL на минуту, потому что вы еще не выполняете запрос Вы просто строите строку.

Волшебство PHP означает, что вы можете написать имя переменной & mdash; скажем, $this->image_id & mdash; внутри двойные кавычки и переменная по-прежнему магически расширяются.

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

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

Предпочитают не хранить изображения в базах данных , где вы можете помочь.

4 голосов
/ 13 августа 2011

Чтобы развернуть комментарий Томалака, вы не можете запустить функцию внутри кавычек.

Попробуйте:

$sql = "INSERT INTO ImageStore(ImageId,Image)               
        VALUES('{$this->image_id}','".file_get_contents($tmp_image)."')";
2 голосов
/ 13 августа 2011

Как уже упоминалось, вы просто сохраняете строку "file_get_contents($tmp_image)" в БД, но вместо этого вам нужно запустить функцию file_get_contentsНе забудьте хешировать изображение, используя алгоритм хеширования, такой как base64_encode, прежде чем сохранять его в БД.

2 голосов
/ 13 августа 2011

попробуйте это:

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...