Avatar billede BTEngineer Novice
09. august 2011 - 20:20 Der 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:


if($billede$i == "") {
    $gem_billede_a = $v[billede1];
} else {
    $gem_billede_a = $billede1;
}

if($billede2 == "") {
    $gem_billede_b = $v[billede2];
} else {
    $gem_billede_b = $billede2;
}

if($billede3 == "") {
    $gem_billede_c = $v[billede3];
} else {
    $gem_billede_c = $billede3;
}

if($billede4 == "") {
    $gem_billede_d = $v[billede4];
} else {
    $gem_billede_d = $billede4;
}

if($billede5 == "") {
    $gem_billede_e = $v[billede5];
} else {
    $gem_billede_e = $billede5;
}

if($billede6 == "") {
    $gem_billede_f = $v[billede6];
} else {
    $gem_billede_f = $billede6;
}

if($billede7 == "") {
    $gem_billede_g = $v[billede7];
} else {
    $gem_billede_g = $billede7;
}

if($billede8 == "") {
    $gem_billede_h = $v[billede8];
} else {
    $gem_billede_h = $billede8;
}

if($billede9 == "") {
    $gem_billede_i = $v[billede9];
} else {
    $gem_billede_i = $billede9;
}

if($billede10 == "") {
    $gem_billede_j = $v[billede10];
} else {
    $gem_billede_j = $billede10;
}

mysql_query("UPDATE billeder SET billede1='$gem_billede_a', billede2='$gem_billede_b', billede3='$gem_billede_c', billede4='$gem_billede_d', billede5='$gem_billede_e', billede6='$gem_billede_f', billede7='$gem_billede_g', billede8='$gem_billede_h', billede9='$gem_billede_i', billede10='$gem_billede_j' WHERE id='$_GET[id]'") or die(mysql_error());

Nogle idéer?
Avatar billede BTEngineer Novice
09. august 2011 - 20:46 #1
if($billede1 == "") {

skulle der stå øverst! :-)
Avatar billede BTEngineer Novice
09. august 2011 - 21:06 #2
Et andet problem er, at man ikke kan tilføje mere end 6 billeder - det forstår jeg virkelig ikke!
Avatar billede moddi100 Seniormester
09. august 2011 - 23:48 #3
Nu ville det smarteste nok være at sætte det hele ind i en løkke, men bortset for det støder du formodentlig på den indbyggede spærregrænse i php:

max-file-uploads som angiver det maksimale antal samtidige uploads (dit problem):
http://www.php.net/manual/en/ini.core.php#ini.max-file-uploads

Desuden bør du også huske maksimal filstørrelse:
http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize
Avatar billede BTEngineer Novice
10. august 2011 - 08:07 #4
En løkke hvordan? :-)

Jeg tager lige et kig på dine henvisninger :-)
Avatar billede BTEngineer Novice
10. august 2011 - 08:27 #5
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.).
Avatar billede moddi100 Seniormester
10. august 2011 - 09:14 #6
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:

<form action='upload.php' method='post' enctype='multipart/form-data'>

Fil 1: <input type='file' name='filer[]' /><br />
Fil 2: <input type='file' name='filer[]' /><br />
Fil 3: <input type='file' name='filer[]' /><br />
Fil 4: <input type='file' name='filer[]' /><br />
Fil 5: <input type='file' name='filer[]' /><br />
Fil 6: <input type='file' name='filer[]' /><br />
Fil 7: <input type='file' name='filer[]' /><br />
Fil 8: <input type='file' name='filer[]' /><br />
Fil 9: <input type='file' name='filer[]' /><br />
Fil 10: <input type='file' name='filer[]' /><br />

</form>


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.
Avatar billede BTEngineer Novice
10. august 2011 - 13:08 #7
Tak for eksemplet, jeg er dog lidt i tvivl.
Hvis jeg gør følgende:


$g = mysql_query("SELECT * FROM annoncer WHERE id='$_GET[id]'") or die(mysql_error());
$v = mysql_fetch_array($g);

for($i = 0; $i < count($_FILES['filer']['name']); $i++)
{
if($_FILES['file']['name'][$i] == "") {
    $gem_billede_a = $v[billede1]; // ??
} else {
    $gem_billede_a = $billede1; // ??
}

    // 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?
Avatar billede moddi100 Seniormester
10. august 2011 - 16:12 #8
Okay min fejl. Jeg troede data kom fra en form og ikke fra databasen.

Må jeg se hvordan din database struktur er? Altså hele tabellen annoncer?
Avatar billede BTEngineer Novice
10. august 2011 - 16:51 #9
Det er rigtig nok. Dataene kommer BÅDE fra databasen og en form.

Forestil dig:
Tilføj annonce - Rediger annonce - Slet annonce

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å:

$billede1 = $v['billede1'];
$billede2 = $v['billede2'];
$billede3 = $v['billede3'];
$billede4 = $v['billede4'];
$billede5 = $v['billede5'];

$billede6 = $_FILES['file']['name'][$i];
$billede7 = $_FILES['file']['name'][$i];

$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!
Avatar billede moddi100 Seniormester
10. august 2011 - 19:47 #10
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 . "')");
}
Avatar billede BTEngineer Novice
10. august 2011 - 20:08 #11
Okay, jeg tror at jeg har fanget pointen. :-)

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".
Avatar billede BTEngineer Novice
10. august 2011 - 20:42 #12
Jeg prøver lige at lege med det først og fremmest - og så vender jeg tilbage til dig, hvis det er i orden! :-)
Avatar billede moddi100 Seniormester
11. august 2011 - 09:56 #13
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:

<form action='upload.php' method='post' enctype='multipart/form-data'>
Fil 1: <input type='file' name='filer[]' /><br />
Fil 2: <input type='file' name='filer[]' /><br />
Fil 3: <input type='file' name='filer[]' /><br />
Fil 4: <input type='file' name='filer[]' /><br />
Fil 5: <input type='file' name='filer[]' /><br />
Fil 6: <input type='file' name='filer[]' /><br />
Fil 7: <input type='file' name='filer[]' /><br />
Fil 8: <input type='file' name='filer[]' /><br />
Fil 9: <input type='file' name='filer[]' /><br />
Fil 10: <input type='file' name='filer[]' /><br />
<input type="submit" value="Gem billeder" />
</form>
Avatar billede BTEngineer Novice
11. august 2011 - 13:25 #14
Det virker som det skal nu! Mange tak for din hjælp. Smid et svar! :-)
Avatar billede moddi100 Seniormester
11. august 2011 - 20:05 #15
Glad for at kunne hjælpe :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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