Вставить несколько путей изображения в несколько столбцов - PullRequest
0 голосов
/ 03 мая 2020

На сайте Intr anet я перемещаю довольно много изображений из файловой системы в MySQL и написал небольшую функцию для помощи. Нет ошибок, но не вставляются изображения.

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

Есть идеи по поводу этих двух вещей? Конечно, второй вопрос является спорным, пока не заработает первый.

function uploadFolder($path,$thumbpath) {
    // Use form to submit path (keeps process from running automatically when loaded)
    if (isset($_POST['create']) && isset($path)) :
        global $siteDB;

        // Fetch image names from existing albums
        $sqlAlbum = "SELECT ID, ImageName FROM albums ORDER BY ImageName";
        $sqlRow = DBConnect($sqlAlbum, "Multiple", $siteDB, "assoc");

        // Build queries to insert all images to table
        foreach ($sqlRow as $row) :
            $filename = basename($row['ImageName']);
            $albumID = $row['ID'];
            $pathname = $path.$filename; 
            $sqlUpload = "INSERT INTO images (`ImageName`,`AlbumID`,`ImageFull`) VALUES ('$filename', $albumID, LOAD_FILE('$pathname'))";
            // Run the query for each file
            DBConnect($sqlUpload,"Run", $siteDB);
        endforeach;

        // FOR TEST PURPOSES ONLY
        $_SESSION['testSQL'] = $sqlUpload;
    endif;
}

он вызывается с помощью:

if (isset($_POST)) :
    $path = (isset($_POST['path'])) ? $_POST['path'] : "";
    uploadFolder($path,"thumbnails");
endif;

Не так много для таблицы изображений, но вот она:

CREATE TABLE IF NOT EXISTS `images` (
  `ID` int unsigned NOT NULL AUTO_INCREMENT,
  `ImageName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `AlbumID` int unsigned DEFAULT NULL,
  `ImageFull` blob,
  `ImageThumb` blob,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=228 DEFAULT CHARSET=utf8;

1 Ответ

0 голосов
/ 03 мая 2020

Трудно сказать наверняка, потому что вы используете какую-то оболочку базы данных с некоторыми нечетными соглашениями о параметрах. Обычно вы не используете LOAD_FILE, а читаете файл с php в переменную и используете клиентский API mysql для сохранения каждой строки.

LOAD_FILE может работать, но это должен быть точный путь к файлу, и эффективный пользователь веб-сервера (пользователь, на котором работает веб-сервер) должен иметь права доступа к каталогам, из которых вы пытаетесь читать.

Предполагая, что это правда, что-то вроде этого должно работать:

    foreach ($sqlRow as $row) :
        $filename = basename($row['ImageName']);
        $albumID = $row['ID'];
        $pathname = $path.$filename;
        $thumbPathname = $path . $thumbpath . DIRECTORY_SEPARATOR . $filename
        $sqlUpload = "INSERT INTO images (`ImageName`,`AlbumID`,`ImageFull`,`ImageThumb`) VALUES ('$filename', $albumID, LOAD_FILE('$pathname'), LOAD_FILE('$thumbPathname'));\n";
        // Run the query for each file
        DBConnect($sqlUpload,"Run", $siteDB);
    endforeach;

Этот код предполагает, что каталог thumbNail является дочерним по отношению к каталогу пути. Путь к каталогу должен быть введен с завершающим sla sh.

Потенциальные проблемы:

  1. В операторе SQL есть точка с запятой и новая линия. Я никогда не видел, чтобы клиент базы данных обращался к ним. Клиентская библиотека MySQL не использует их, поэтому я не уверен, почему они будут частью оболочки БД.
  2. Здесь нет кода проверки ошибок. Если что-то пойдет не так в функции DBConnect(), как вы узнаете?
  3. Переменная пути должна быть завершена и должна иметь конечный разделитель.

ok

/somepath/to/directory/

не будет работать

/somepath/to/directory
...