Вставить 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.