Avatar billede bqnke Nybegynder
20. december 2015 - 15:58 Der er 12 kommentarer

Billed upload inkluderet i nuværede form.

Hej ekspert, jeg vil meget gerne have gjort det muligt at uploade 5 billedere i min nuværede form, der kun uploader 3 tekstværdier til mysql.

I min sql database har jeg oprettet 5 fælter der hedder billedurl1 og så op til billedurl 5.

Der tænkte jeg at jeg ville have uploadet billedernes sti.

Billederne skal så op i en mappe jeg har kaldt produktbilleder og omdøbes med et tal jeg tænker skal være id + .1 hvis det så er det 3 billed man uploader vil det være id + .1 +.1 +.1, så billed med id nummer 1 vil billedeurl3 i mysql hedde fx 1.1.1.png og det samme navnet og placering være i ftp'en.

På den måde kan jeg hente billederne ud senere der høre til det valgte produkt.
Der skal samtidig stadig være mulighed for at hvis man kun uploader 3 billeder til produktet vil de sidste 2 fælter blive NULL i mysql.

php koden nu:

if(isset($_POST['opret']))
{
$p_navn= $_POST['p_navn'];
$p_undertekst = $_POST['p_undertekst'];
$p_beskrivelse = $_POST['p_beskrivelse'];

mysqli_query($conn, "INSERT INTO `hold_ind_dk_db`.`Batinka_produkter` (`id`, `p_navn`, `p_undertekst`, `p_beskrivelse`, `p_pris`, `p_startdato`, `p_slutdato`, `p_billedlink`, `billed_url1`, `billed_url2`, `billed_url3`, `billed_url4`, `billed_url15`) VALUES ('NULL', 'NULL', '$p_navn', '$p_undertekst', '$p_beskrivelse', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL')");

?>
Opret et produkt:<br><br>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
   
Produktnavn: <input type="text" name="p_navn"><br>
Produkt undertekst: <input type="text" name="p_undertekst"><br>
Produkt beskrivelse: <input type="text" name="p_beskrivelse"><br>
Billed 1: <input type="file" name="billedurl1"><br>
Billed 2:<input type="file" name="billedurl2"><br>
Billed 3:<input type="file" name="billedurl3"><br>
Billed 4:<input type="file" name="billedurl4"><br>
Billed 5:<input type="file" name="billedurl5"><br>
<input type="submit" name="opret" value="Opret Produkt">
</form>


Vil du gøre opgaven færdig ?
Mvh
Avatar billede olsensweb.dk Ekspert
20. december 2015 - 16:15 #1
>I min sql database har jeg oprettet 5 fælter der hedder billedurl1 og så op til billedurl 5.
>Der skal samtidig stadig være mulighed for at hvis man kun uploader 3 billeder til produktet vil de sidste 2 fælter blive NULL i mysql.

helt klart et forkert database design, da du derved altid skal have 5 billeder pr record, hvis du har færre får du spildplads, og har de flere skal du oprette en record mere, og du får dermed redundant data, hvilke man ikke bør have i en database

jeg ville anbefale dette design

tbl_user
id
firstname
lastname

tbl_img
id
name

tbl_map_user_img
id
user_id
img_id


nu kan en bruger have 0 billeder, og x billeder uden du får redundant data
Avatar billede olsensweb.dk Ekspert
20. december 2015 - 16:47 #2
alternativ design, med en en til mange relation som også kunne overvejes

 
tbl_user
id
firstname
lastname

tbl_img
id
name
user_id



hvor #1 er en mange til mange relation
Avatar billede claes57 Ekspert
20. december 2015 - 17:04 #3
se lige på
mysqli_query($conn, "INSERT INTO `hold_ind_dk_db`.`Batinka_produkter` (`id`, `p_navn`, `p_undertekst`, `p_beskrivelse`, `p_pris`, `p_startdato`, `p_slutdato`, `p_billedlink`, `billed_url1`, `billed_url2`, `billed_url3`, `billed_url4`, `billed_url15`)

`billed_url15` - er det rigtigt? jeg ville have gættet på, at databasen havde `billed_url5`

og se på
VALUES ('NULL', 'NULL', '$p_navn', '$p_undertekst', '$p_beskrivelse', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL')
hvis den skal passe med felter, så ville jeg gætte på, at et 'NULL' fra starten skal ligge bagerst, som i
VALUES ('NULL', '$p_navn', '$p_undertekst', '$p_beskrivelse', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL')
Avatar billede bqnke Nybegynder
20. december 2015 - 17:39 #4
Her er databasen:

CREATE TABLE IF NOT EXISTS `katinka_produkter` (
  `id` int(99) NOT NULL,
  `p_navn` varchar(99) DEFAULT NULL,
  `p_undertekst` varchar(99) DEFAULT NULL,
  `p_beskrivelse` varchar(500) DEFAULT NULL,
  `p_pris` int(99) DEFAULT NULL,
  `p_startdato` date DEFAULT NULL,
  `p_slutdato` date DEFAULT NULL,
  `p_billedlink` varchar(500) DEFAULT NULL,
  `billed_url1` int(11) DEFAULT NULL,
  `billed_url2` int(11) DEFAULT NULL,
  `billed_url3` int(11) DEFAULT NULL,
  `billed_url4` int(11) DEFAULT NULL,
  `billed_url5` int(11) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;

Det skal siges det skal bruges som produktbilleder på en shop.
Hvis i mener det skal laves på en anden måde, er i velkommen til at komme med et eksempel.

muligheden jeg beskrev der var bare som jeg havde forestillet mig den skulle være.
Avatar billede claes57 Ekspert
20. december 2015 - 18:14 #5
Så holder jeg stadig på, at du skal læse korrektur på dine sætninger. Der er jo ingen billed_url15, og felt antal og rækkefølge skal passe i insert into og value.
Avatar billede olsensweb.dk Ekspert
20. december 2015 - 18:15 #6
database design
1 normal form: fjern repeterende grupper (billed_url er en repeterende gruppe)

hvad er meningen med billed linket ??

er det et billed der har mange url's ??

din db skal minimum se sådan ud
CREATE TABLE `katinka_produkter` (
  `id` int(99) NOT NULL,
  `p_navn` varchar(99) COLLATE utf8_danish_ci DEFAULT NULL,
  `p_undertekst` varchar(99) COLLATE utf8_danish_ci DEFAULT NULL,
  `p_beskrivelse` text COLLATE utf8_danish_ci,
  `p_pris` int(99) DEFAULT NULL,
  `p_startdato` date DEFAULT NULL,
  `p_slutdato` date DEFAULT NULL,
  `p_billedlink` varchar(255) COLLATE utf8_danish_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

CREATE TABLE `katinka_produkter_url` (
  `id` int(11) NOT NULL,
  `url` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `produkt_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

ALTER TABLE `katinka_produkter`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `katinka_produkter_url`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `katinka_produkter`
  MODIFY `id` int(99) NOT NULL AUTO_INCREMENT;

ALTER TABLE `katinka_produkter_url`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Avatar billede bqnke Nybegynder
20. december 2015 - 18:24 #7
Billedlinket er jo meningen, for at jeg kan finde stien til netop de 5 eller 3 billeder der er uploadet til ftp'en og som passer til det valget produkt.

Altså hele modulet går ud på jeg skal kunne uploade op til 5 billeder, alle sammen bliver gemt i en mappe på min ftp, og ir med jeg har url'sne i min database så kan jeg finde stien til dem.

Forstår du/i opgaven bedere nu ?
mvh og god aften
Avatar billede olsensweb.dk Ekspert
20. december 2015 - 19:13 #8
har du nogle test produkter i db allerede nu ??, hvis ja kan du så ikke lave et sql dump af 1-2 produkter, det der har min specielle interesse er billedlink og url


hvis ikke så lav nogle test data, bare skriv dem direkte i sql.

grundlaget for enhver app der anvender en db er at db er i orden
Avatar billede bqnke Nybegynder
20. december 2015 - 20:27 #9
Er dette brugbart ?

INSERT INTO `katinka_produkter` (`id`, `p_navn`, `p_undertekst`, `p_beskrivelse`, `p_pris`, `p_startdato`, `p_slutdato`, `p_billedlink`, `billed_url1`, `billed_url2`, `billed_url3`, `billed_url4`, `billed_url5`) VALUES
(3, 'BRAUN SE830 RENSEBØRSTE', 'Verdens 1. ansigtsepilator og rensebørste', 'Det smalle epilatorhoved er designet til absolut præcision ved ansigtsepilering. Mikro-åbningerne på de 10 pincetter fanger de fineste hår ned til 0,02 mm brede og kun 0,05 mm lange, så du behøver ikke at vente, til håret vokser synligt ud! Med 200 ', 500, '2015-12-17', '2016-02-05', '', 0, 0, 0, 0, 0),
(4, 'BEURER BG013 KROPSANALYSE VÆGT', 'En vægt med mange funktioner!', ' Nøjagtighed: 0,1 % for kropsfedt, vand i kroppen og muskelmasse. 100g for kropsvægt og knoglemasse\r\n- Idrætsudøver tilstand med 5 aktivitetsniveauer\r\n- Kapacitet: 150kg\r\n- Hukommelse til 10 brugere', 318, '2015-12-30', '2015-12-25', '', 0, 0, 0, 0, 0),
(5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0);
Avatar billede claes57 Ekspert
20. december 2015 - 21:01 #10
Når du har inputfelt til billedurl, dvs tekst, så kan du ikke smide 0 i dem. 0 er ikke et tomt felt (null). '' er bedre.
Avatar billede olsensweb.dk Ekspert
20. december 2015 - 21:45 #11
kig på dette eks
 
<?php
if (isset($_POST['opret'])) {
    $p_navn = $_POST['p_navn'];
    $p_undertekst = $_POST['p_undertekst'];
    $p_beskrivelse = $_POST['p_beskrivelse'];
    $sql = "INSERT INTO `Batinka_produkter` (`p_navn`, `p_undertekst`, `p_beskrivelse`) VALUES ('$p_navn', '$p_undertekst', '$p_beskrivelse')";

    // mysqli_query($conn, $sql);
    $conn->query($sql);

    //$product_id = mysqli_insert_id($conn);
    $product_id = $conn->insert_id;

    if ($product_id > 0) {
        // så er produktet indsat, så skal vi bare læse arrayet af billeder igennem
        $target_dir = "uploads/";
        $billedurl = $_FILES['billedurl'];
        $lng = count($billedurl['name']);
        $images_names_array = array();
        for ($i = 0; $i < $lng; $i++) {
            if ($billedurl['error'][$i] == 0) {
                $tmp_name = $billedurl['tmp_name'][$i];
                $image_name = $target_dir . "" . $billedurl['name'][$i];
                $sql = "INSERT INTO `katinka_produkter_url` (`url`, `produkt_id`) VALUES ('$image_name', $product_id)";
                $conn->query($sql);

                move_uploaded_file($tmp_name, $image_name);
            }
        }
    }
}
?>
Opret et produkt:<br><br>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
    Produktnavn: <input type="text" name="p_navn"><br>
    Produkt undertekst: <input type="text" name="p_undertekst"><br>
    Produkt beskrivelse: <input type="text" name="p_beskrivelse"><br>
    Billed 1:<input type="file" name="billedurl[]"><br>
    Billed 2:<input type="file" name="billedurl[]"><br>
    Billed 3:<input type="file" name="billedurl[]"><br>
    Billed 4:<input type="file" name="billedurl[]"><br>
    Billed 5:<input type="file" name="billedurl[]"><br>
    <input type="submit" name="opret" value="Opret Produkt">
</form>


db vist i #6
Avatar billede olsensweb.dk Ekspert
20. december 2015 - 22:01 #12
ovenstående løsning skal selvfgelig:
sikres mod sql injection, feks med Prepare Statement ( http://www.eksperten.dk/guide/1480 )
sikres mod ulovlige filtyper ( http://www.eksperten.dk/guide/1200  )

jeg har ikke taget højde for billedlink, da den sql du viste ikke bragte mig vidre, men jeg tror
billedlink hører til i katinka_produkter_url og bare skal indeholde filnavnet uden sti og evt uden extension
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester