Mysql хранение данных php

Как правильно организовать хранение файлов в базе данных MySQL (загрузка и выгрузка через PHP)?

Добрый день.
Я в PHP новичок и при реализации простенького приложения возникла проблема — файлы, загруженные в базу данных MySQL через PHP повреждаются (при передаче файла из базы клиенту размер файла увеличивается на 4-5 байт.

Сервер реализован на базе IIS + MySQL + PHP.

В базе таблица tblfiles имеет такую структуру:

CREATE TABLE `tblfiles` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор', `name` VARCHAR(250) NOT NULL COMMENT 'Оригинальное имя файла', `premise_id` INT(11) NOT NULL COMMENT 'Идентификатор помещения', `mime_type` VARCHAR(250) NOT NULL COMMENT 'mime-тип загруженного файла', `file_content` LONGBLOB NOT NULL COMMENT 'контент файла', `size` INT(11) NOT NULL COMMENT 'размер в байтах', INDEX `id` (`id`) ) COMMENT='Файлы' COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=1

Код загрузки файлов такой:

if (isset($_FILES['files'])) < $premise_id = $_POST['input_item_id']; //пролистываем весь массив файлов по одному $_FILES['file']['name'] as $k=>$v foreach ($_FILES['files']['name'] as $k=>$v) < //директория загрузки $uploaddir = "uploads/"; $uploadfile = $_FILES['files']['name'][$k]; //черный список типов файлов $blacklist = array(".php", ".phtml", ".php3", ".php4"); foreach ($blacklist as $item) < if(preg_match("/$item\$/i", $_FILES['files']['name'][$k])) < echo "Нельзя загружать скрипты."; exit; >> //перемещаем файл из временного хранилища if (move_uploaded_file($_FILES['files']['tmp_name'][$k], $uploadfile)) < //подготавливаем переменные $mime_type = $_FILES['files']['type'][$k]; $filename = basename($uploadfile); $file = fopen($uploadfile,"rb"); //Открыли файл на чтение ($uploadfile - имя файла) $img_content = fread($file,filesize($uploadfile)); // Прочитали содержимое файла в переменную $file_size = filesize($uploadfile); fclose($file); unlink($uploadfile); try < //пишем данные в базу $stmt = $cnndb->prepare("INSERT INTO tblfiles ( name, premise_id, mime_type, file_content, size ) VALUES ( :name, :premise_id, :mime_type, :file_content, :size )"); $stmt->bindParam(':name', $filename, PDO::PARAM_STR); $stmt->bindParam(':premise_id', $premise_id, PDO::PARAM_INT); $stmt->bindParam(':size', $file_size, PDO::PARAM_INT); $stmt->bindParam(':mime_type', $mime_type, PDO::PARAM_STR); $stmt->bindParam(':file_content', $img_content, PDO::PARAM_LOB); $cnndb->errorInfo(); $stmt->execute(); > catch(PDOException $e) < 'Error : ' .$e->getMessage(); > > else echo "

Файл не загружен, вернитесь и попробуйте еще раз.
"; > >

Код выдачи файла из базы такой:

$id = strip_tags($_GET['id']); $cnndb = CreateCon(); $sql="SELECT name, file_content, mime_type FROM tblfiles WHERE $result = $cnndb->query($sql); if (!$result) < die('Could not connect: ' . mysql_error()); >if($row = $result->fetch(PDO::FETCH_ASSOC))

Код сформирован на основе примеров, коих в интернете много, адаптирован под себя (в виде скелета, который требует доработки), работает, но где-то ошибка, а где — по причине отсутствия опыта — найти не могу.
Прошу помочь советом по приведённому коду или отослать на пример правильной организации хранения файлов в базе данных SQL.
Спасибо.

Оценить 2 комментария

Источник

Как хранить массивы в базе данных

При работе с базой данных MySQL иногда нужно сохранить массив в одном поле. К сожалению, нет способа непосредственно передать массив как параметр. В результате, хранение таких структур данных становиться более сложным процессом, но, тем не менее, возможным.

Чтобы конвертировать любой массив (или объект) в строку в PHP, нужно вызвать функцию serialize :

$array = array( 1, 2, 3 ); $string = serialize( $array ); echo $string;

$string содержит строчную версию массива. Выше приведенный пример выведет следующее:

Читайте также:  Change css variable in js

Чтобы конвертировать такую строку обратно в массив, надо использовать unserialize :

// $array будет содержать( 1, 2, 3 ) $array = unserialize( $string );

Теперь проведём конвертацию массива из 200 случайно генерированных целых чисел в диапазоне от 1 до 1000:

Пример выведет подобную строку:

Данная строка может быть сохранена в базе данных и конвертирована в массив по мере надобности. Очень часто функция base64_encode используется в сочетании с функцией serialize для хранения массивов:

$string = base64_encode( serialize( $array ) );

Зашифрованная строка может быть восстановлена в массив с помощью функции base64_decode :

$array = unserialize( base64_decode( $string ) );

К сожалению, такие строки могут иметь очень большой размер. В таком случае можно использовать функцию gzcompress для сжатия строки (размер сжатой строки существенно меньше):

$smallString = gzcompress( $string );

Перед использованием, такую строку надо вернуть к обычному виду с помощью функции gzuncompress .

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.lateralcode.com/store-array-database/
Перевел: Сергей Фастунов
Урок создан: 3 Сентября 2010
Просмотров: 97405
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Источник

Как хранить изображения в MySQL с помощью BLOB

BLOB (или Binary Large Object, большой двоичный объект) – это тип данных MySQL, который позволяет хранить двоичные данные: изображения, мультимедиа и файлы PDF.

Хранить изображения (такие как фотографии и подписи) в базе данных MySQL вместе с другой информацией удобно в том случае, если вы разрабатываете приложения с сильной привязкой к БД (например, портал поиска работы, база данных студентов или финансовое приложение), и в этой БД изображения должны быть синхронизированы с другими данными.

Читайте также:  Classes and methods in javascript

И тогда на помощь приходит тип данных BLOB. Этот подход устраняет необходимость в создании отдельной файловой системы для хранения изображений, а также централизует базу данных, делая ее более портативной и надежной, поскольку данные изолированы от файловой системы. А еще это упрощает создание резервных копий, поскольку вы можете создать один дамп MySQL, содержащий все ваши данные.

Извлечение данных обрабатывается быстрее, а при создании новых записей вы можете быть уверены, что правила проверки данных и ссылочная целостность четко соблюдены (особенно при использовании транзакций MySQL).

В этом мануале мы расскажем о том, как использовать тип данных BLOB для хранения изображений с помощью PHP.

Требования

  • Сервер Ubuntu 18.04, предварительно настроенный согласно этим инструкциям.
  • Стек LAMP, установленный на вашем сервере. С установкой вам поможет этот мануал (раздел о виртуальных хостах можно пропустить, здесь мы не будем их использовать).

1: Создание базы данных

Давайте начнем с создания тестовой базы данных для этого проекта. Подключитесь к серверу по SSH, а затем выполните следующую команду, чтобы войти на сервер MySQL как пользователь root:

Введите root-пароль базы данных MySQL и нажмите Enter, чтобы продолжить.

После этого выполните следующую команду, чтобы создать базу данных. В этом руководстве мы назовем ее test_company:

CREATE DATABASE test_company;

После создания БД вы увидите следующее:

Query OK, 1 row affected (0.01 sec)

Теперь нам нужно создать на сервере MySQL учетную запись test_user; не забудьте заменить PASSWORD сложным паролем:

CREATE USER ‘test_user’@’localhost’ IDENTIFIED BY ‘PASSWORD’;

Вы получите следующий результат:

Query OK, 0 rows affected (0.01 sec)

Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company, запустите команду:

GRANT ALL PRIVILEGES ON test_company.* TO ‘test_user’@’localhost’;

Вы должны получить следующий результат:

Query OK, 0 rows affected (0.01 sec)

В завершение нужно сбросить таблицы привилегий, чтобы MySQL перезагрузил права:

На экране должно появиться:

Query OK, 0 rows affected (0.01 sec)

Теперь, когда база данных test_company и пользователь test_user готовы, мы можем перейти к созданию таблицы. Предположим, нам нужна таблица products для хранения списка товаров. Позже мы попробуем вставить и извлечь данные из этой таблицы, чтобы понять, как работает BLOB в MySQL.

Выйдите из оболочки MySQL:

Затем снова войдите в систему, на этот раз – как пользователь test_user:

При появлении запроса введите пароль test_user и нажмите Enter, чтобы продолжить. Затем откройте базу данных test_company, набрав команду:

Перейдя в базу данных test_company, MySQL отобразит такой результат:

Затем создайте таблицу products:

CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

Эта команда создаст таблицу по имени products. В таблице будет четыре столбца:

  • product_id: в этом столбце используется тип данных BIGINT, он позволяет вместить большой список продуктов, содержащий 2⁶³-1 элементов. Мы пометили столбец как PRIMARY KEY, чтобы присвоить товарам уникальные идентификаторы. Чтобы MySQL мог обрабатывать создание новых идентификаторов, мы использовали ключевое слово AUTO_INCREMENT.
  • product_name: этот столбец содержит названия товаров. Здесь мы использовали тип данных VARCHAR, так как это поле обычно обрабатывает буквенно-цифровые значения длиной до 50 символов; ограничение в 50 символов – это всего лишь гипотетическое значение, используемое для целей этого руководства.
  • price: этот столбец содержит розничные цены наших товаров. Поскольку цена на некоторые товары может выражаться числом с плавающей точкой (например, 23.69, 45.36, 102.99), мы указали здесь тип данных DOUBLE.
  • product_image: в этом столбце мы указали тип данных BLOB, поскольку он предназначен для хранения двоичных данных – изображений товаров.
Читайте также:  Python import path environment

Для поддержки широкого спектра функций, включая транзакции MySQL, мы использовали механизм InnoDB. Выполнив вышеприведенную команду для создания таблицы, вы увидите следующий результат:

Query OK, 0 rows affected (0.03 sec)

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

2: Создание PHP-скрипта для заполнения базы данных

На этом этапе мы создадим сценарий PHP, который будет подключаться к базе данных MySQL, созданной в первом разделе руководства. Сценарий подготовит три записи о товарах и вставит их в таблицу products.

Чтобы создать PHP-скрипт, откройте новый файл в текстовом редакторе:

sudo nano /var/www/html/config.php

Затем вставьте в него следующую информацию (замените PASSWORD паролем test_user, который вы создали в разделе 1):

$pdo = new PDO(«mysql:host=» . DB_HOST . «; dbname https://i.imgur.com/VEIKbp0.png»)

‘product_name’ => ‘MANAGED KUBERNETES’,

‘product_name’ => ‘MySQL DATABASES’,

$sql = «INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)»;

foreach ($products as $product)

echo «Records inserted successfully»;

Сохраните и закройте файл.

Этот файл нужен для определения переменных базы данных и подключения к ней. Файл также инициирует объект PDO и сохраняет его в переменной $pdo. Мы ссылаемся на файл config.php вверху.

Затем мы создали массив данных о товарах, которые нужно вставить в БД. Помимо product_name и price, которые заданы в виде строк и числовых значений соответственно, сценарий использует встроенную функцию PHP file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image.

После этого мы подготовили оператор SQL и использовали оператор PHP foreach для вставки каждого продукта в базу данных.

Запустите /var/www/html/insert_products.php в окне браузера, используя следующий URL-адрес (не забудьте заменить your-server-IP внешним IP-адресом сервера):

На экране вы увидите сообщение об успешном выполнении файла – следовательно, записи были вставлены в базу данных.

Records inserted successfully

Итак, мы успешно вставили три записи, содержащие изображения товаров, в таблицу. На следующем этапе мы напишем сценарий PHP для извлечения этих записей и отображения их в браузере.

3: Извлечение и визуализация данных из БД MySQL

Имея ​в базе данных информацию и изображения товаров, вы можете написать второй сценарий PHP, который будет запрашивать и отображать данные в таблице HTML в браузере.

Чтобы создать файл, введите:

sudo nano /var/www/html/display_products.php

Затем вставьте в файл следующее:

$sql = «SELECT * FROM products»;

Источник

Оцените статью