В этой статье я расскажу, как сохранять двоичные данные, такие как изображения в базе данных MySQL. Вы узнаете, как передать данные через HTML-форму в базу данных, извлекать и выводить их пользователю.
Прежде всего, Вы должны создать новую базу данных, для хранения бинарных данных. Для примера используется следующая таблица. Зайдите в phpMyAdmin, скопируйте и вставьте ниже приведённый код:
CREATE TABLE binary_data (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50),
bin_data LONGBLOB,
filename CHAR(50),
filesize CHAR(50),
filetype CHAR(50)
);
Пример php скрипта для сохранения данных в базе данных
Скрипт store.php сохраняет изображение в базу данных переданное через html форму.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Сохранение бинарных данных в базе данных MySQL</title>
</head>
<body>
<?php
// Код, который будет выполняться, если форма была оправлена:
if ($_POST['submit']) {
// подключение к базе данных
// (возможно, вам придется настроить имя хоста, имя пользователя и пароль)
$dbh = new mysqli("localhost", "root", "", "imagesstore");
if (mysqli_connect_errno()) {
exit("Ошибка подключения к базе данных MySQL: Сервер база данных не доступен!<br>
Проверте параметры подключения к базе данных.");
}
$data = addslashes(fread(fopen($_FILES['file']['tmp_name'], "r"),
filesize($_FILES['file']['tmp_name'])));
$_POST['form_description'] = trim($_POST['form_description']);
$size = filesize($_FILES['file']['tmp_name']);
$result = $dbh->prepare("INSERT INTO binary_data (description,bin_data,filename,filesize,filetype)
" . "VALUES ('" . $_POST['form_description'] . "',
'" . $data . "',
'" . $_FILES["file"]["name"] . "',
'" . $size . "',
'" . $_FILES["file"]["type"] . "')");
if (!$result) exit("Ошибка выполнения SQL запроса!");
$result->execute();
$id = $dbh->prepare();
echo "<p>Этот файл имеет следующий идентификатор (ID) в базе данных: <b>" . $id . "</b>";
} else {
// отображаем форму для оправки новых данных:
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
Описание файла: <input type="text" name="form_description" size="40">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
Файл для загрузки/хранения в базе данных: <input type="file" name="file" size="40">
<p><input type="submit" name="submit" value="Отправить">
</form>
<?php
}
?>
</body>
</html>
При выполнении скрипта Вы увидите простую html форму. Для выбора файла (например, изображение) используйте кнопку «Обзор». Затем нажмите кнопку «Отправить». После загрузки файла на веб-сервер скрипт сообщит вам его идентификатор базы данных (ID). ID необходим для получения доступа к информации (при помощи следующего скрипта). Пример php скрипта для вывода изображений в браузер Скрипт getdata.php – это пример скрипта, который извлекает двоичную информацию из базы данных и передает её непосредственно пользователю. getdata.php
Поскольку скрипту необходимо «знать», который файл извлекать, в качестве параметра необходимо указать его ID. Например: Файл сохранен в базе данных под ID 2. Для получения этого файла необходимо вызвать:
getdata.php?id=2
Если в базе данных сохранены изображения, на вашей веб-странице можно использовать скрипт getdata, как например : Например: В базе данных вы сохранили изображение как ID 3 и хотите, чтобы оно отобразилось на вашей веб-странице. Для этого воспользуйтесь следующим кодом:
<?php
if (!preg_match("|^[\d]*$|", $_GET['id'])) exit();
// подключение к базе данных
// (возможно, вам придется настроить имя хоста, имя пользователя и пароль)
$dbh = new mysqli("localhost", "root", "", "imagesstore");
if (mysqli_connect_errno()) {
exit("Ошибка подключения к базе данных MySQL: Сервер база данных не доступен!<br>
Проверте параметры подключения к базе данных.");
}
$query = "SELECT bin_data,filetype from binary_data WHERE id=" . $_GET['id'];
$result = $dbh->query($query);
if (!$result) exit("Ошибка выполнения SQL запроса!");
$row = $result->fetch_array();
Header("Content-type: " . $row['filetype'] . "");
echo $row['bin_data'];
Пару полезных советов.
Как сохранить файл, размер которого больше 2 Mб?
Для загрузки и сохранения файлов, чей размер превышает 2 Мб, необходимо внести несколько изменений в скрипт и php/sql настройки в связи с установленными по умолчанию ограничениями. Для хранения файлов размером 2 Мб следует сделать следующее:
Внесите изменения в скрипт store.php. Поменяйте значение MAX_FILE_SIZE на 24000000;
По умолчанию php позволяет передовать файлы размером не более 2 Мб. Необходимо изменить переменную максимального размера файла на 24M. Это можно сделать в php.ini в дириктиве setting upload_max_filesize или в .htaccess прописать строчку php_value upload_max_filesize 24M. В конфигурационных файле apache прописать LimitRequestBody 24000000.
По умолчанию в mysql можно импортировать файлы размером не более 2 Мб. Чтобы снять ограничения размера пакета в mysql, выполните слудующие действия. Откройте файл настройки my.ini, измените строчку innodb_additional_mem_pool_size = 24M
Чтобы изменения вступили в силу, перезагрузите веб сервер Apache и сервер базы данных MySQL.