Upload af billeder til database!?

Her kan du få hjælp og stille spørgsmål til PHP!
Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Upload af billeder til database!?

Indlæg af Kallesen » 19. apr 2018, 11:30

Hej Genier!

- Jeg vil lige forhører mig om der er en god måde hvorpå man kan uploade billeder til MYSQL med php?

Jeg ville gerne have det sådan at hver gang jeg laver et upload af 1-10 filer så skal de have UNIK ID, så lige præcis de billeder kan forbindes med en profil.
Altså jeg har et produkt

jeg vil have alt i en oprettelse.

Adresse, Boligtype, etage, osv. Dette er jeg slet ikke i tvivl om hvordan man smider ind i en DB, og smider det ud på www.hjemmesiden.dk/lejlighed.php?id=202 som eksempel.

Men nu vil jeg gerne have at man kan smide billeder op af lejligheden, så den kan fremvises online.

Det er her mit problem kommer ind, hvordan sætter jeg det op, så det kan lade sig gøre?

Nogen der kan hjælpe mig lidt videre her?

Venlig Hilsen
Kenneth

cristian
Moderator
Moderator
Indlæg: 882
Tilmeldt: 26. sep 2011, 21:31
Kontakt:

Re: Upload af billeder til database!?

Indlæg af cristian » 19. apr 2018, 17:39

Du skal lige have nogle ting med i baghoved.

1. Du skal tænke over om nogle af de informationer du gemmer er personfølsomme. Dvs du skal overholde nuværende og fremtidig lovgivning for at undgå bøder / andet.

2. Du skal verificere at det du forventer der ligges op i din DB også er det der rent faktisk bliver lagt op.

Det rimelig ligetil angående din database, da du kan f.eks. Lave en bruger med id 001 og med en primary / foreign key og linke denne bruger til billeder 1-10.
Eller du kan linke den til en lejlighed baseret på ID, eller hvordan din DB nu er hæklet sammen.

For selve billederne kan disse være en blob type i MySQL.

Har du allerede lavet din database, eller skal du til det?
Hvad helt præcist vil du gerne have hjælp til?
  • Hjælp til PHP image upload, kode eksempel.
  • Hjælp til database struktur og tabeller samt typer
  • Andet
Det vil være rart at vide hvad du har lavet i forvejen og helt præcist hvad du mangler hjælp til.
Jeg kan ikke give et godt eksempel på hvordan du sikkert kan upload billeder til en database med PHP, da jeg ikke bruger PHP selv.

Også bruger du nogle PHP frameworks, eller laver du din upload funktion helt fra bunden selv?

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 19. apr 2018, 22:14

Hej.

Jeg er helt med hvad angår de nye dataregler, jeg arbejder selv med kommunikation for et stort dansk teleselskab. ;)

- Men jeg har behov for et kode eksempel på hvordan jeg kommer til at uploade billeder sammen med noget tekst.
Altså vi kan også sige at det er en bilforhandler som skal have 10 billeder af 1 bil op, og dette skal så kodes sammen.

DB struktur skulle jeg gerne have styr på, men hvordan jeg forbinder 2 DB'er er jeg vist ikke helt med på.
Så det skal jeg nok også have lidt hjælp til.

så følgende:

1. PHP koden som gør at jeg kan uploade billeder sammen med tekst, jeg har følgende lige nu:


DB struktur: (DB Strukturen er kortet GEVALDIGT ned, og her ændret det til en bilforhandler, så vi har noget at forholde os til. :)

Kode: Vælg alt

CREATE TABLE `bil` (
  `bil_image_id` INT(11) NOT NULL,
  `Maerke` varchar(200) NOT NULL,
  `Model` varchar(200) NOT NULL,
  `KmL` varchar(200) NOT NULL,
  `KM_Stand` varchar(200) NOT NULL,
  `fuel` varchar(200) NOT NULL,
  `image` longtext NOT NULL,
  `image_location` VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
HTML:

Kode: Vælg alt

<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
 
<h3 id="myModalLabel">Add</h3>
</div>
<div class="modal-body">
<form method="post" action="upload.php"  enctype="multipart/form-data">
<table class="table1">
	<tr>
		<td><label style="color:#3a87ad; font-size:18px;">Mærke</label></td>
		<td width="30"></td>
		<td><input type="text" name="Maerke" placeholder="Maerke" required /></td>
	</tr>
	<tr>
		<td><label style="color:#3a87ad; font-size:18px;">Model</label></td>
		<td width="30"></td>
		<td><input type="text" name="Model" placeholder="Model" required /></td>
	</tr>
		<tr>
		<td><label style="color:#3a87ad; font-size:18px;">KM/L</label></td>
		<td width="30"></td>
		<td><input type="text" name="KmL" placeholder="KmL" required /></td>
	</tr>
		<tr>
		<td><label style="color:#3a87ad; font-size:18px;">KM_Stand</label></td>
		<td width="30"></td>
		<td><input type="text" name="KM_Stand" placeholder="KM_Stand" required /></td>
	</tr>
		<tr>
		<td><label style="color:#3a87ad; font-size:18px;">Brændstof</label></td>
		<td width="30"></td>
		<td><input type="text" name="fuel" placeholder="fuel" required /></td>
	</tr>
	<tr>
		<td><label style="color:#3a87ad; font-size:18px;">Select your Image</label></td>
		<td width="30"></td>
		<td><input type="file" name="image"></td>
	</tr>
</table>
    </div>
    <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<button type="submit" name="Submit" class="btn btn-primary">Upload</button>
    </div>
</form>
</div>
PHP:

Kode: Vælg alt

<?php
 
require_once ('db.php');
 
if (isset($_POST['Submit'])) {
 
move_uploaded_file($_FILES["image"]["tmp_name"],"upload/" . $_FILES["image"]["name"]);			
$location=$_FILES["image"]["name"];
$fname=$_POST['first_name'];
$lname=$_POST['last_name'];
 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO bil (Maerke, Model, , image_location)
VALUES ('$fname', '$lname', '$location')";
 
$conn->exec($sql);
echo "<script>alert('Bilen er nu sat til salg!'); window.location='index.php'</script>";
}
?>


Så langt så godt, men så er jeg også gået i stå flere gange. Hvor skyder jeg mig selv i foden?

jepperask
Geni
Geni
Indlæg: 378
Tilmeldt: 4. nov 2012, 17:57

Re: Upload af billeder til database!?

Indlæg af jepperask » 21. apr 2018, 16:09

Jeg har opdateret koden lidt så den giver lidt bedre fejl-meddelser.
Jeg vil anbefale dig at gemme resultaterne fra forskellige metode kald, som f.eks move_uploaded_file.

Jeg mistænker at problemet er skriverettigheder til directoriet. Programmet bør skrive hvad problemet er, hvis du bruger nedenstående.

Kode: Vælg alt

<?php
require_once ('db.php');

$uploads_dir = './uploads';

if (isset($_POST['Submit'])) {
    if ($error == UPLOAD_ERR_OK) {
        if (is_dir($uploads_dir)) {
            if (is_writable($uploads_dir)) {
                $tmp_name = $_FILES["image"]["tmp_name"];
                $name = basename($_FILES["image"]["name"]);
                $location = "$uploads_dir/$name";
                $succesfully_uploaded = move_uploaded_file($tmp_name, $location);
                if ($succesfully_uploaded) {
                    $maerke = $_POST['Maerke'];
                    $model = $_POST['Model'];

                    $sql = "INSERT INTO bil (Maerke, Model, image_location) VALUES ('$maerke', '$model', '$location')";

                    if (!$conn->query($sql)) {
                        printf("Errormessage: %s\n", $conn->error);
                    } else {
                        echo "<script>alert('Bilen er nu sat til salg!'); window.location='index.php'</script>";
                    }
                } else {
                    echo "Unknown error calling function move_uploaded_file()";
                }
            } else {
                echo 'Upload directory is not writable.';
            }
        } else {
            echo "Directory doesn't exist.";
        }
    }
}
?>
Jeg opdaterede derudover SQL-tabellen til følgende:

Kode: Vælg alt

CREATE TABLE `bil` (
  `bil_image_id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `Maerke` varchar(200) NOT NULL,
  `Model` varchar(200) NOT NULL,
  `KmL` varchar(200),
  `KM_Stand` varchar(200),
  `fuel` varchar(200),
  `image_location` VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
EDIT: Du skrev oprindeligt noget med upload af flere billeder, og det burde også være muligt hvis du kigger her: http://php.net/manual/en/features.file- ... ltiple.php. For at muliggøre det i databasen, vil jeg anbefale dig at lave en ekstra tabel til billederne, hvor hvert billede har en foreign-key til et element i "bil"-tabellen. Når du så skal hente de 1-N billeder ud for bil med id == 4, kan du lave et select alá det her:

Kode: Vælg alt

SELECT * FROM Images WHERE Bil_Id = 4
Du skriver egentlig også at du vil have billederne i databasen, men ud fra dit kode ligner det at du vil lægge dem i filsystemet og gemme stien til billedet. Hvis de skal ind i databasen skal det lige modificeres lidt.

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 22. apr 2018, 09:55

Hej Jeppe.

Dette script virker også rigtig godt, lige efter planen, men den gemmer "kun" det ene billedes location.
- For lige at svare på dette, så synes jeg det var nemmere at gemme location i stedet for at smide ALLE billeder i en DB.

Men hvordan gør jeg det så nemmest med at få billeder over i en DB som evt. kan se sådan her ud:

Kode: Vælg alt


CREATE TABLE `bil_billeder` (
  `bil_billeder_id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `bil_images_id` varchar(200) NOT NULL,
  `image_location` VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Jeg ved stadig ikke hvordan jeg så kommer til at uploade flere billeder til denne DB med samme unik ID så de kan sættes sammen med id fra bil databasen?
- Jeg synes at være lidt på bar bund lige nu :)

jepperask
Geni
Geni
Indlæg: 378
Tilmeldt: 4. nov 2012, 17:57

Re: Upload af billeder til database!?

Indlæg af jepperask » 22. apr 2018, 11:17

Du kan gøre 2 ting.
1. Opret en mappe til hver bil, hvor billederne ligger i. Så er det dog svært at udvide med f.eks billedtekst, likes eller hvad du ellers finder på i fremtiden.
2. Opret hvert billede som sin egen række i en ny tabel, og pej hvert billede på den bil de er tilkoblet.

Jeg har lige prøvet sidstnævnte, da jeg tror det giver mest værdi for dig:

SQL:

Kode: Vælg alt

CREATE TABLE `Car` (
  `Id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `Maerke` varchar(200) NOT NULL,
  `Model` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `Images` (
  `Id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `Car_Id` INT(200) NOT NULL,
  `Image_location` VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Upload.php:

Kode: Vælg alt

<?php
require_once ('connection.php');

$uploads_dir = './uploads';

// http://php.net/manual/en/features.file-upload.multiple.php
function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}

if (isset($_POST['Submit'])) {
    if ($error == UPLOAD_ERR_OK) {
        if (is_dir($uploads_dir)) {
            if (is_writable($uploads_dir)) {
                $images_array = reArrayFiles($_FILES['images']);

                $maerke = $_POST['Maerke'];
                $model = $_POST['Model'];

                $sql = "INSERT INTO Car (Maerke, Model) VALUES ('$maerke', '$model')";

                if (!$conn->query($sql)) {
                    printf("Errormessage: %s\n", $conn->error);
                } else {
                    $car_id = $conn->insert_id;
                }


                foreach ($images_array as $image) {
                    $tmp_name = $image['tmp_name'];
                    $name = basename($image['name']);
                    $location = "$uploads_dir/$name";

                    $succesfully_uploaded = move_uploaded_file($tmp_name, $location);

                    if ($succesfully_uploaded) {
                        $sql = "INSERT INTO Images (Car_Id, Image_location) VALUES ('$car_id', '$location')";
                        if (!$conn->query($sql)) {
                            printf("Errormessage: %s\n", $conn->error);
                        }
                    } else {
                        echo "Error moving file: " . $name;
                    }
                }
            } else {
                echo 'Upload directory is not writable.';
            }
        } else {
            echo "Directory doesn't exist.";
        }
    }
}
?>
index.php - læg mærke til at jeg har ændret html-knappen hvor der uploades, så du nu kan vælge flere billeder ad gangen:

Kode: Vælg alt

<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
 
<h3 id="myModalLabel">Add</h3>
</div>
<div class="modal-body">
<form method="post" action="upload.php"  enctype="multipart/form-data">
<table class="table1">
   <tr>
      <td><label style="color:#3a87ad; font-size:18px;">Mærke</label></td>
      <td width="30"></td>
      <td><input type="text" name="Maerke" placeholder="Maerke" required /></td>
   </tr>
   <tr>
      <td><label style="color:#3a87ad; font-size:18px;">Model</label></td>
      <td width="30"></td>
      <td><input type="text" name="Model" placeholder="Model" required /></td>
   </tr>
    <tr>
      <td><label style="color:#3a87ad; font-size:18px;">KM/L</label></td>
      <td width="30"></td>
      <td><input type="text" name="KmL" placeholder="KmL" required /></td>
   </tr>
  <tr>
      <td><label style="color:#3a87ad; font-size:18px;">KM_Stand</label></td>
      <td width="30"></td>
      <td><input type="text" name="KM_Stand" placeholder="KM_Stand" required /></td>
   </tr>
  <tr>
      <td><label style="color:#3a87ad; font-size:18px;">Brændstof</label></td>
      <td width="30"></td>
      <td><input type="text" name="fuel" placeholder="fuel" required /></td>
   </tr>
   <tr>
      <td><label style="color:#3a87ad; font-size:18px;">Select your Images</label></td>
      <td width="30"></td>
      <td><input type="file" name="images[]" multiple></td>
   </tr>
</table>
    </div>
    <div class="modal-footer">
    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<button type="submit" name="Submit" class="btn btn-primary">Upload</button>
    </div>
</form>
</div>
Som bonus, har jeg lavet en side hvor du kan se billederne til en bil med et givent ID. Så du kan skrive www.mydomain.com/show_car.php?id=2.
Du kunne lave en index side, hvor du trækker hver bil ud, så du har en oversigt - og så for hver element, har en knap der sender brugeren over på show_car, hvor id er sat til id'et for dén bil.

Kode: Vælg alt

<?php
require_once ('connection.php');

if (isset($_GET['id'])) {
    $car_id = $_GET['id'];
    $sql = "SELECT * FROM Images WHERE Car_Id = '$car_id'";

    $result = $conn->query($sql);
    while ($image = $result->fetch_assoc()) {
        echo "<img src='" . preg_replace('/./', '', $image["Image_location"], 1) . "'/>";
    }
} else {
    echo '<p>Please specify an Id like so: www.mydomain.com/show_car.php?id=2</p>';
}
?>
Håber det kan bruges.. :)

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 22. apr 2018, 14:04

Hej Jeppe.

Der er lidt fejl, som jeg ikke helt kan gennemskue.

1. Billederne kommer over i en anden database, men car_id står med 0 ved alle.
2. show_car.php?id=1 der får jeg en fejl.

Se evt. www.auto.notel.dk/show_car.php?id=1

jepperask
Geni
Geni
Indlæg: 378
Tilmeldt: 4. nov 2012, 17:57

Re: Upload af billeder til database!?

Indlæg af jepperask » 22. apr 2018, 14:24

Det er lidt svært at debugge herfra. Har du en IDE hvor du kan debugge applikationen? Så kan du sætte et breakpoint of se hvad der sker linje for linje, og hvad variablerne er sat til. Alternativt kan du indsætte nogle echo-statements for hver linje og se hvad de forskellige variable er sat til.

Hvilken version af PHP bruger du? Jeg skriver ikke i PHP til dagligt, så jeg har egentlig bare sammensat hvad jeg lige kunne google mig til. Der er sikkert et alternativ til fetch_assoc() hvis den ikke er defineret i din version af PHP.

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 22. apr 2018, 14:42

Nej jeg koder det i ATOM, der er ingen debugger, som jeg ved af.

Men jeg kan vel hente en der kan debugge der for mig :) - Jeg finder lige på noget :)

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 22. apr 2018, 15:24

Hej Jeppe.

Det kan jeg sgu ikke få til at virke :-/

jepperask
Geni
Geni
Indlæg: 378
Tilmeldt: 4. nov 2012, 17:57

Re: Upload af billeder til database!?

Indlæg af jepperask » 22. apr 2018, 15:32

Prøv at indsætte echo-statements rundt omkring i koden, så du kan se hvad der sker ellers. :)

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 22. apr 2018, 21:32

Hej Jeppe.

Jeg fandt ud af at det var fetch som var en smule fejl og lavede den om til : while ($row = $result->fetch(PDO::FETCH_ASSOC)) {

Men nu er siden blank, og den viser intet :S

jepperask
Geni
Geni
Indlæg: 378
Tilmeldt: 4. nov 2012, 17:57

Re: Upload af billeder til database!?

Indlæg af jepperask » 23. apr 2018, 06:27

Hvis du regner med at skulle kode mere end bare det her, så vil jeg klart anbefale dig at få fat på en IDE med en debugger i. Netbeans og Eclipse er vist gratis.

Jeg skriver som sagt ikke rigtigt PHP til dagligt, så jeg ved ikke hvad standarden er, men jeg vil anbefale dig at kigge på et framework som Symfony eller Laravel: https://symfony.com.

Det kræver lidt tid at sætte sig ind i, men det er helt klart det værd. Typisk vil du så definere dine objekter i koden (som classes), og så bruge f.eks Doctrine til at mappe det til din database. Så behøver du ikke selv sidde og arbejde så manuelt med udtræk/indsættelser som SQL-queries. Udover det får du en masse andre komponenter som andre har bygget, f.eks routing, sikkerhed, templating, etc.

cristian
Moderator
Moderator
Indlæg: 882
Tilmeldt: 26. sep 2011, 21:31
Kontakt:

Re: Upload af billeder til database!?

Indlæg af cristian » 23. apr 2018, 20:34

Du skal lave din tabel som en Blob hvis du ville gemme billeder direkte i databasen

jepperask
Geni
Geni
Indlæg: 378
Tilmeldt: 4. nov 2012, 17:57

Re: Upload af billeder til database!?

Indlæg af jepperask » 24. apr 2018, 07:45

Det giver måske mere mening at upload.php ser ud som nedenstående. Fejlen er måske at Car-objektet ikke bliver oprettet korrekt? Her sker upload af de forskellige billeder kun hvis Car-objektet blev oprettet i databasen:

Kode: Vælg alt

<?php
require_once ('connection.php');

$uploads_dir = './uploads';

// http://php.net/manual/en/features.file-upload.multiple.php
function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}

if (isset($_POST['Submit'])) {
    if ($error == UPLOAD_ERR_OK) {
        if (is_dir($uploads_dir)) {
            if (is_writable($uploads_dir)) {
                $images_array = reArrayFiles($_FILES['images']);

                $maerke = $_POST['Maerke'];
                $model = $_POST['Model'];

                $sql = "INSERT INTO Car (Maerke, Model) VALUES ('$maerke', '$model')";

                if (!$conn->query($sql)) {
                    printf("Errormessage: %s\n", $conn->error);
                } else {
                    $car_id = $conn->insert_id;
                    foreach ($images_array as $image) {
                        $tmp_name = $image['tmp_name'];
                        $name = basename($image['name']);
                        $location = "$uploads_dir/$name";
    
                        $succesfully_uploaded = move_uploaded_file($tmp_name, $location);
    
                        if ($succesfully_uploaded) {
                            $sql = "INSERT INTO Images (Car_Id, Image_location) VALUES ('$car_id', '$location')";
                            if (!$conn->query($sql)) {
                                printf("Errormessage: %s\n", $conn->error);
                            }
                        } else {
                            echo "Error moving file: " . $name;
                        }
                    }
                }
            } else {
                echo 'Upload directory is not writable.';
            }
        } else {
            echo "Directory doesn't exist.";
        }
    }
}
?>

cristian
Moderator
Moderator
Indlæg: 882
Tilmeldt: 26. sep 2011, 21:31
Kontakt:

Re: Upload af billeder til database!?

Indlæg af cristian » 3. maj 2018, 18:51

Kallesen jeg er bare nysgerrig fordi jeg selv sidder og tænker over dette i øjeblikket.
Hvordan undgår du SQL-Injection og de andre sikkerhedsproblemer i PHP som det giver at kunne uploade data til din SQL?

Kallesen
Begynder
Indlæg: 19
Tilmeldt: 1. mar 2018, 10:55

Re: Upload af billeder til database!?

Indlæg af Kallesen » 4. maj 2018, 08:48

Hej.

Jeg er gået lidt i stå, der har været en masse på mit arbejde jeg lige har skulle forholde mig til.
Men jeg er ude i noget med at lave et foto galleri med albums, og så kreere noget på den måde i stedet for.

Jeg havde bare en god idé til hvordan jeg kunne få det til at fungere, men den gik ikke, der var en masse fejl i mit script som slet ikke kunne svare sig at rette til, så kunne jeg ligeså godt skrive et script forfra :)

Men hvis du har andre ideer, så er du velkommen til at skyde til med ideer :D

Hilsen
Kenneth

Besvar