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

Ответ 1

Проблема

$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)

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

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

Ответ 2

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

Try:

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

Ответ 3

попробуйте следующее:

$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);

Ответ 4

Как уже упоминалось, вы просто сохраняете строку "file_get_contents($tmp_image)" в db но вам нужно запустить функцию file_get_contents вместо этого

не забывайте хэш-изображение с помощью алгоритма хэширования, такого как base64_encode, прежде чем сохранять его в db.