Как загрузить несколько изображений в папку и сохранить их путь в одном столбце базы данных - PullRequest
0 голосов
/ 12 октября 2019

Я хочу загрузить несколько изображений для определенного списка в столбце «СВОЙСТВА» в поле «СВОЙСТВА». У меня есть рабочий код, хотя он хранит изображения в соответствующей папке UPLOADS, но проблема в базе данных. В итоге в таблицу добавляются 3 списка, которые соответствуют ТРЕМ ИЗОБРАЖЕНИЯМ, выбранным для этого СПИСКА с.

Однако я хочу вставить только одну строку в базу данных, а затем для 'propertiesImages', я хочу все 3 изображенияпуть для хранения в одном столбце. Я не знаю, говорю ли я это точно, я просто хотел бы, чтобы кто-то понял.

Я скину коды и, возможно, снимки изображения

/// КОД PHP ДЛЯ ВСТАВКИ ЗАПИСЕЙ//

<?php
 session_start();
include "../incs/database/dbconfig.php";  //include the DB config file


if (isset($_POST['propertyTitle']) && isset($_SESSION['userid']) && $_SESSION['userid'] == true) {

    //Retrieve Form Data From AJAX Parsing
    $title = mysqli_real_escape_string($dbconn, $_POST['propertyTitle']);
    $desc = mysqli_real_escape_string($dbconn, $_POST['propertyDescription']);
    $pType = mysqli_real_escape_string($dbconn, $_POST['propertyType']);
    $pStatus = mysqli_real_escape_string($dbconn, $_POST['propertyStatus']);
    $pLocation = mysqli_real_escape_string($dbconn, $_POST['propertyLocation']);
    $pMainLocation = mysqli_real_escape_string($dbconn, $_POST['mainLocation']);
    $bedrooms = mysqli_real_escape_string($dbconn, $_POST['bedroomNumber']);
    $bathrooms = mysqli_real_escape_string($dbconn, $_POST['bathroomNumber']);
    $garage = mysqli_real_escape_string($dbconn, $_POST['garageNumber']);
    $pNumber = mysqli_real_escape_string($dbconn, $_POST['propertyNumber']);
    $pPrice = mysqli_real_escape_string($dbconn, $_POST['propertyPrice']);
    $pAreaSize = mysqli_real_escape_string($dbconn, $_POST['propertyAreaSize']);
    $pAreaPFT = mysqli_real_escape_string($dbconn, $_POST['areaPostfixText']);
    $pVideo = mysqli_escape_string($dbconn, $_POST['propertyVideoURL']);
    $features = "";
    foreach($_POST['propertyFeatures'] as $feature) {
    // Here $results holding all the check box values as a string
    $features .= $feature. ",";
    }

    $propertyAuthor = mysqli_real_escape_string($dbconn, $_SESSION['userid']);

    for($i = 0; $i < count($_FILES['propertyImages']['name']); $i++) {

        $imageTempDirectory = $_FILES["propertyImages"]["tmp_name"][$i];
        $imageName = $_FILES["propertyImages"]["name"][$i];
        $filetype = $_FILES["propertyImages"]["type"][$i];
        $pathForImageUpload = "uploads/".$imageName;

        move_uploaded_file($imageTempDirectory,$pathForImageUpload);

        //Submit Properties Data in Propertires Table
        $propertyKwary = mysqli_query($dbconn, "INSERT INTO properties (propertyTitle,propertyDescription,pTid,pSid,pLid,mainLocation,bedroomNumber,bathroomNumber,garageNumber,propertyNumber,propertyPrice,propertyAreaSize,propertyAreaSizePostfix,propertyVideoUrl,propertyFeatures,uid,propertyImages,submittedDate) VALUES ('$title','$desc','$pType','$pStatus','$pLocation','$pMainLocation','$bedrooms','$bathrooms','$garage','$pNumber','$pPrice','$pAreaSize','$pAreaPFT','$pVideo','$features','$propertyAuthor','$pathForImageUpload',NOW())");

        if ($propertyKwary) {
         // echo'<script>alert("Property Submission Failed-"'. mysqli_error($dbconn). ')</script>';
            echo 'Property Submitted Successfully';
            // header("Location: submit-listing.php");
        } else {
         echo 'Property Submission Failed'; 
        }
    }
}

// ВВОД ФОРМЫ HTML //

<input type="file" name="propertyImages[]" id="propertyImages" multiple accept=".jpg, .png, .jpeg" />
                    <br><br>
                    <div id="propertyImagesPreview"></div>

1 Ответ

2 голосов
/ 12 октября 2019

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


Текущая настройка

PROPERTIES table
    propertiesid       integer, not null, primary key, auto-increment
    propertyTitle      varchar, not null
    PROPERTYIMAGES     varchar
    [other fields...]

Похоже, вы планируете сделать:

1  |  "Title for image 1"  |  "image1-file1 image1-file2 image1-file3"
2  |  "Title for image 2"  |  "image2-file1 image2-file2 image2-file3"

Значения PROPERTYIMAGES должны быть разделены пробелами, ; или чем-то еще ...

Проблемы:

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

Что вам нужно сделать, это иметь 3 таблицы

PROPERTIES table
    propertiesid       integer, not null, primary key, auto-increment
    propertiesTitle    varchar, not null
    [other fields...]

IMAGES table
    imagesid    integer, not null, primary key, auto-increment
    filename    varchar, not null

PROPERTIES_has_IMAGES
    propertiesid       integer, foreign key to PROPERTIES.propertiesid
    imagesid           integer, foreing key to IMAGES.imagesid

Эта настройка позволяет вамдо:

  • удалить изображение легко. Просто удалите его из таблицы ИЗОБРАЖЕНИЙ. Если вы правильно настроили правило ON DELETE, все записи в PROPERTIES_has_IMAGES также будут автоматически удалены (ссылочная целостность).
  • легко запрашивает, какой файл является каким свойством.
  • , вы можете легко применить уникальноеизображения, поэтому не используются два идентичных изображения.
  • намного быстрее, поскольку ключи проиндексированы.
  • позволит избежать будущих проблем при попытке расширить простую структуру базы данных. Например, вы сможете связывать изображения с другими таблицами.

Другая справка: Хранение CSV в поле MySQL - плохая идея?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...