Я пытаюсь сохранить изображение в 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)"
.
Итак, чтобы конкатенация результата вызова 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)) . "')";
Теперь у вас действительно большая строка, и ваша база данных становится громоздкой.
Не рекомендуется хранить изображения в базах данных , где вы можете помочь.
Чтобы расширить комментарий 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.