09. august 2011 - 20:20Der er
14 kommentarer og 1 løsning
Billedeupload
Hej,
Jeg er er ved at lave en redigeringsfil til et billede upload (multiple upload), hvor man så kan fjern eksisterende billeder eller tilføje nye (der kan tilføjes 10 billeder i alt). Mit problem er, at man SKAL tilføje billeder i rækkefølge, altså: først nr. 1, derefter nr. 2, nr. 3 osv.. Hvis man f.eks. har uploadet et billede i nr. 1, og så vælger at uploade nr. 3, så får den ikke uploadet det / gemt filnavnet i databasen, fordi den tester om der er noget til nr. 2, er der ikke det, så går den ikke videre. Jeg ved ikke rigtig hvordan jeg ellers skal lave det en således:
Jeg har desværre ikke mulighed for at ændre i indstillingerne på One.com, desuden er problemet ikke at den ikke vil uploade mange billeder på én gang, det kan den godt. Det fungere ganske udemærket hvis man tilføjer 10 billeder på en gang, og trykker overfør. Men går jeg så ind under den pågældende annonce (det er et annoncesystem), så kan jeg se de 10 billeder jeg har tilføjet i en lille udgave med en "fjern billede"-knap. Hvis jeg fjerner billede nr. 8 f.eks. og vælger et nyt billede bagefter, så registere den det ikke. Hvis jeg derimod fjerner billede 1-6 (en af disse eller flere) og erstatter det med et andet, så virker det. Billede 1-6 virker som det skal. 7-10 virker ikke (kun under oprettelsen af annoncen, hvis man tilføjer billeder der.).
Nu ved jeg ikke hvordan din formular ser ud, men hvis du laver den således at alle felterne samler deres data i et array (giv dem samme navn efterfulgt af []), kan du gennemgå dem i en lykke:
Normalt vil du kunne finde information om den uploadede fil i: $_FILES['filer']['name'] $_FILES['filer']['size']
Men når vi har flere filer i samme navn, vil disse blive til arrays: $_FILES['filer']['name'][0] $_FILES['filer']['size'][0]
Derfor kan du gennemgå dem i en lykke:
for($i = 0; $i < count($_FILES['filer']['name']); $i++) { // Din kode til behandling af hver // fil kommer skal herind f.eks: $sql_navn = mysql_real_escape_string($_FILES['filer']['name'][$i]); $sql_id = mysql_real_escape_string($_GET['id']);
mysql_query("UPDATE billeder SET billede" . $i . "='" . $sql_navn . "' WHERE Id='" . $sql_id . "'"); }
Dette er bare et eksempel. Det kan jo hurtigt kombineres, så du kun har én forespørgsel/query.
// Din kode til behandling af hver // fil kommer skal herind f.eks: $sql_navn = mysql_real_escape_string($_FILES['file']['name'][$i]); $sql_id = mysql_real_escape_string($_GET['id']);
mysql_query("UPDATE annoncer SET billede" . $i . "='" . $sql_navn . "' WHERE id='" . $sql_id . "'"); }
Hvordan får jeg opdateret det rigtigt, således at de nye filer bliver opdateret i databasen med deres navn, og de eksisterende filer, bare forbliver som de er med det navn i databasen?
Hvis jeg trykker på "Rediger annonce" og vælger en annonce kommer:
Navn på annonce og tekst og blabla.. Der er tilføjet 5 billeder til annonce, da den blev oprettet. Nu vil jeg gerne tilføje, f.eks. 2 mere:
Billede1: billede.jpg Billede2: billede.jpg Billede3: billede.jpg Billede4: billede.jpg Billede5: billede.jpg Billede6: - vælger en fil på computeren -> billede.jpg Billede7: - vælger en fil på computeren -> billede.jpg Billede8: - ingen fil valgt Billede9: - ingen fil valgt Billede10: - ingen fil valgt
Når jeg har valgt eksempelvis to billeder trykker jeg "Overfør", og dataene bliver sendt $_POST[]. De eksisterende billeder, dvs. de 5 første, skal blot hentes fra databasen og opdateres med det allerede eksisterende navn i databasen, for det skal ikke ændres - og kan det laves, så burde de første 5 jo slet ikke blive opdateret. De to nye billeder, dvs. Billede6 og Billede7 skal jo så uploades og gemmes i databasen, altså:
$billede8 = ""; // der skal jo ingenting gemmes $billede9 = ""; // der skal jo ingenting gemmes $billede10 = ""; // der skal jo ingenting gemmes
Ved de første 5 billeder, hvor der allerede er billeder, kan man ikke tilføje et nyt, så skal man først fjerne et billede, dvs. adressen på billedet, bliver fjernet fra databasen.
Min database struktur: CREATE TABLE `annoncer` ( `id` int(10) unsigned NOT NULL auto_increment, `model` varchar(255) NOT NULL, `aargang` varchar(255) NOT NULL, `km` varchar(255) NOT NULL, `pris` varchar(255) NOT NULL, `beskrivelse` longtext NOT NULL, `dato` varchar(100) NOT NULL, `billede1` varchar(255) NOT NULL, `billede2` varchar(255) NOT NULL, `billede3` varchar(255) NOT NULL, `billede4` varchar(255) NOT NULL, `billede5` varchar(255) NOT NULL, `billede6` varchar(255) NOT NULL, `billede7` varchar(255) NOT NULL, `billede8` varchar(255) NOT NULL, `billede9` varchar(255) NOT NULL, `billede10` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=69 ;
Jeg håber du er lidt mere med på hvad problemet er :-) Tak fordi du gider hjælpe!
Det mest optimale ville være hvis du lavede 2 tabeller i stedet for én. På den måde undgår du bl.a. spildplads i databasen i form af tomme felter:
CREATE TABLE `annoncer` ( `id` int(10) unsigned NOT NULL auto_increment, `model` varchar(255) NOT NULL, `aargang` varchar(255) NOT NULL, `km` varchar(255) NOT NULL, `pris` varchar(255) NOT NULL, `beskrivelse` longtext NOT NULL, `dato` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=69 ;
CREATE TABLE `billeder` ( `id` int(10) NOT NULL auto_increment, `annonce` int(10) NOT NULL, `billede` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Når du så skal have et billede til en annonce, indsætter du én ny række i tabellen 'billeder'. Id lader du være automatisk, mens annonce skal være annoncens id. På den måde kan du også have uendeligt mange billeder pr annonce. Ønsker du på et tidspunkt at slette billedet, kan du blot fjerne rækken.
Når du så laver din side til redigering, skal du blot lave en mulighed for at de eksisterende billeder kan slettes og nye tilføjes. Vi kan bruge koden fra før (se kommentar #6), til nye billeder:
// Vi gennemløber alle nye billeder og // indsætter en række for hver i databasen for($i = 0; $i < count($_FILES['filer']['name']); $i++) { // Husk altid at escape dine variabler, hvorved // du kan øge sikkerheden drastisk $sql_navn = mysql_real_escape_string($_FILES['filer']['name'][$i]); $sql_id = mysql_real_escape_string($_GET['id']);
// Indsæt række mysql_query("INSERT INTO billeder (annonce,billede) VALUES ('" . $sql_navn . "','" . $sql_id . "')"); }
Men.. skal der kun være én <input type="file" name="filer"> så? Eller? Jeg vil jo gerne have at man kan tilføje max 10 billeder under "Tilføj annoncer", og kunne tilføje ekstra / fjerne billeder under "Rediger annoncer".
Du kan sagtens have flere billeder på én gang. Du skal bare lave det om til et array ved brug af []-tegnene. Se eksemplet her og læg mærke til felternes navne:
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.