Как исправить ошибку с бд?

Здравствуйте! Я пишу админку и задача там - загрузить много фото, фотки сами отправляются в корень сайта, а пути от них должны отправляться в бд, сейчас в строчку бд прилетает Array

$uploaddir = "../uploads-gallery";

foreach ($_FILES["images"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["images"]["tmp_name"][$key];

        // Функция basename() помогает защититься от атак на файловую систему;
        // иногда требуется дополнительная проверка или очистка имени файла
        $name = basename($_FILES["images"]["name"][$key]);
        move_uploaded_file($tmp_name, "$uploaddir/$name");
    }
};

$images = $_FILES["images"]["name"];
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 3
Смотрите, в переменной $images = $_FILES["images"]["name"]; находится массив.
А поле в таблице у вас имеет формат text.
PHP - не волшебник, он не понимает, в каком именно формате вам нужно запихнуть данные в это поле, и он пытается, как может, и пишет в дефолтном формате.

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

Это можно сделать при помощи стандартной функции php serialize.

$images = $_FILES["images"]["name"];
$nameSerialized = serialize($name); 


А когда вытащите содержимое из базы, то нужно будет использовать функцию unserialize 

Правда само содержимое в поле будет в специальном формате, и его будет трудно понимать, если будете своими глазами смотреть базу. Чтобы сделать это поле в базе более читаемым, ежели это вам надо, можно пойти двумя путями:

1. Вместо serialize - unserialize использовать json_encode и json_decode. Тогда в базе текст будет в джесончике, и его проще будет смотреть в базе.

2. Можно сделать еще лучше, и сделать само поле в базе в формате JSON (В MySQL и Postgres это точно есть.). И тогда можно будет использовать json_encode и json_decode.
Чем это отличается от п.1? Тем, что можно будет использовать поля из такого объекта в запросах. Искать, менять и т.д.
Ответ написан
cyber-jet
@cyber-jet
Очевидно, что поле формы с множественной загрузкой файлов выдает массив, чтобы записать значения в базу надо всё-же :
$uploaddir = "../uploads-gallery";

foreach ($_FILES["images"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["images"]["tmp_name"][$key];

        // Функция basename() помогает защититься от атак на файловую систему;
        // иногда требуется дополнительная проверка или очистка имени файла
        $name = basename($_FILES["images"]["name"][$key]);
        move_uploaded_file($tmp_name, "$uploaddir/$name");
        ... функция записи в таблицу имени файла ($_FILES["images"]["name"][$key]);
    }
};
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
Представим, что проблему сохранения вы как-то решили... А что вы намерены делать с сохранённым значением?

Вариант 1 - всегда только извлекать весь массив целиком, в том виде, в каком он сохранялся. Никаких извлечений части массива, никаких по нему поисков, сортировок и прочего. Тогда преобразуйте массив во вменяемый сериализованный формат и сохраняйте в поле БД. Виктор Кожухарь в своём ответе разобрал этот вариант.

Вариант 2 - возможна какая-то обработка. Извлечение части массива по какому-то критерию (порядковый номер, соответствие шаблону и пр.), поиск в массиве по заданному критерию, сортировка самого массива либо массивов по какому-то критерию.. Тогда однозначно делите массив на отдельные элементы и сохраняйте их по одному (конечно, соответствующим образом должна измениться структура БД). Делить можно и на стороне PHP (как показывает Евгений в своём ответе), и в запросе на запись на стороне MySQL. Первое, как я понимаю, вам проще сделать, но правильно - второй вариант.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы