Avatar billede celfa Nybegynder
07. december 2011 - 17:04 Der er 18 kommentarer og
1 løsning

Hjælp til loop der skal indsætte i db(sql)

Hej.

Jeg har følgende:

if($copy){
echo "$file_name | filen er uploadet :-)<br>";
}else{
echo "$file_name | kunne ikke uploades<br>";
}
}

Hvis jeg eksempelvis har uploadet 3 billeder får jeg følgende via echo:

filnavn1 | filen er uploadet
filnavn2 | filen er uploadet
filnavn3 | filen er uploadet

Jeg ville gerne have at $file_name skal indsættes i min database så ledes udfor id x:

billede1 = filnavn1
billede2 = filnavn2
billede3 = filnavn3

Kan ikke lige gennemskue hvordan jeg gør det, man kan vel bare sige den skal indsætte i billedeX hvor X så skal have en stigende værdi pergang at det køres igennem.

Håber i forstår mig.
Avatar billede celfa Nybegynder
07. december 2011 - 17:19 #1
Jeg tænker om man kan bruge et for loop?
for ($i=1; $i<=9; $i++)
  {

Da jeg ved der max. kan komme op på billede9. Kan bare ikke gennemskue hvordan jeg gør det.
Avatar billede claes57 Ekspert
07. december 2011 - 17:56 #2
start med en tæller, der er 0
i linjen
echo "$file_name | filen er uploadet :-)<br>";
har du jo filnavn - lige herefter indsætter du
læg en til tæller
sql-kald med $file_name og billede(tæller)

hvis den enkelte id har billede1 - billede9 i en record (dårligt design), så skal du i stedet opbygge en sql-sætning, og til sidst (hvis der er data i) så udføre den.
Avatar billede celfa Nybegynder
07. december 2011 - 18:01 #3
Tak for dit svar :)

Det skal nok skæres lidt mere ud i pap for mig :)

Jeg har en tabel der indeholder følgende:
id  billede1  billede2  billede3

Når jeg så eksempelvis uploader 3 billeder under id = 2, ville jeg gerne at den indsætter filnavn1 ind i billede1 og filnavn2 ind i billede2.

Håber du forstår mig.
Avatar billede celfa Nybegynder
07. december 2011 - 18:20 #4
For jeg tænker sådan her:
if($copy){
echo "$file_name | filen er uploadet :-)!<br>";
$sql="UPDATE menu SET (billede1='$file_name') WHERE id=2";
}else{
echo "$file_name | kunne ikke uploades!<br>";
}
}

den opdatere dog ikke rigtig noget i databasen...

udover det så skulle det gerne laves sådan at billede1 hedder billede2 og billede3 osv. per gang den bliver kørt igennem.
Avatar billede celfa Nybegynder
07. december 2011 - 18:34 #5
Det her er faktisk det jeg ville, det opdatere databsen:
if($copy){
echo "$file_name | filen er uploadet :-)!<br>";
$r = mysql_query("UPDATE menu SET billede1='$file_name' WHERE id='2'");
}else{
echo "$file_name | kunne ikke uploades!<br>";
}
}

Nu mangler jeg bare at få lavet en "tæller"? Således at SET billede automatisk stiger med en hvergang. Nogen der kan hjælpe mig med det? :)
Avatar billede claes57 Ekspert
07. december 2011 - 18:55 #6
jeg kan kun lave det i asp - kan du oversætte til php?
Avatar billede celfa Nybegynder
07. december 2011 - 19:01 #7
if($copy){
    for ($i=1; $i<=9; $i++)
  {
echo "$file_name | filen er uploadet :-)!<br>";

$r = mysql_query("UPDATE menu SET billede$i='$file_name' WHERE id='4'");

}}else{
echo "$file_name | kunne ikke uploades!<br>";
}
}

Ovenstående indsætter i databasen fra billede1-billede9 med filnavn. Problemet er at den ikke gør det per billede længere, men kun gør det for den første fil der er uploadet. Er der nogen der hjælpe mig med det? Dvs. der står i alle felter filnavn1 hele vejen hen, og den uploader kun 1 fil i stedet for 2.

Kan desværre ikke asp :(
07. december 2011 - 20:04 #8
Prøv at fortælle lidt mere om hvad du skal bruge dit system til, og giv os den kode der går forud for den kode du viser.  Vis den kode du bruger til at oploade for eksemfile_namepel tre billeder, og hvordan du fylder værdier i variablerne $copy og $file_name.  Og hvad vedrører mysql tabellen menu, hvorfor har du tre 'parallele' felter billed1, billed2, og billed3 med, sandsynligvis, samme slags data, nemlig navnet på et billed?
Avatar billede claes57 Ekspert
07. december 2011 - 20:05 #9
du er på gale veje
if($copy){
echo "$file_name | filen er uploadet :-)<br>";
}else{
echo "$file_name | kunne ikke uploades<br>";
}
}
det skriver jo allerede alle linjer - så du skal ikke bruge et loop mere - bare få dette til at generere en sql-sætning ved siden af.
Jeg kan stadig intet php - men prøv at se på noget i stil med:

$tal=0;
$sql="select noget ..."
if($copy){
echo "$file_name | filen er uploadet :-)<br>";
$tal=$tal+1;
// der  skal lige placeres lidt kode mere, så komma og AND er på plads)
$sql=$sql."billede".$tal."=".$file_name
}else{
echo "$file_name | kunne ikke uploades<br>";
}
}
if $tal>0(mysql_query($sql." WHERE id='4'");
Avatar billede claes57 Ekspert
07. december 2011 - 20:06 #10
#8 - det var det, jeg også tænkte i #2 - dårligt design.
Avatar billede claes57 Ekspert
07. december 2011 - 20:10 #11
btw - hvis #8 overtager, så er han ret skrap til php/sql - så bare kør den løsning der kommer fra ham...
Avatar billede celfa Nybegynder
07. december 2011 - 21:12 #12
Jeg har en tabel der således ud:
id  billede1    billede2    billede3 osv. op til billede9.

Jeg har prøvet at lege med et loop der skal uploade 1-9 billeder, og samtidig indsætte deres navn i min database. Så hvis jeg uploader 3 billeder:
a.jpg
b.jpg
c.jpg

Så skal de begge 3 uploades, og indsættes i min database således:
id  billede1  billede2  billede 3
2    a.jpg      b.jpg      c.jpg.

Jeg håber du forstår. Som det er nu kører den hver eneste upload igennem 9 gange, og indsætter navnet 9 gange.. Men da den gør det på den måde er det altid det sidst uploadede billeder der kommer til at stå i alle 9 felter.
så der kommer til at stå c.jpg i alle 9 billedefelter.

Der er rimelig mange sider inden. Det starter med en form hvor jeg indtaster nogle andre data'er som bliver skrevet til en database, her vælger jeg også hvor mange billeder jeg skal bruge. På næste side kommer der så fx. 3 upload form hvor jeg vælger min filer. Herefter kommer jeg til min næste side hvor den så gerne skulle uploade filerne til mappen uploads, og skrive filernes navn ind i databasen. Så ledes at jeg på senere tidspunkt kan kalde fx. id = 2 også får jeg alle de navne på de billeder jeg har liggende i uploads der hører til id = 2.
Avatar billede celfa Nybegynder
07. december 2011 - 21:14 #13
Selve siden der skal uploade billederne og skrive dens navne til databsen ser således ud:
<?
$host="localhost";
$username="x";
$password="x";
$db_name="x";
$tbl_name="x";

mysql_connect("$host", "$username", "$password")or die("Kan ikke forbinde til serveren ");
mysql_select_db("$db_name")or die("Kan ikke forbinde til databasen");
session_start();

?>

<?

$uploadsNeeded = $_POST['uploadsNeeded'];
for($i = 0; $i < $uploadsNeeded; $i++){
$file_name = $_FILES['uploadFile'. $i]['name'];

$file_name = stripslashes($file_name);
$file_name = str_replace("'","",$file_name);
$copy = copy($_FILES['uploadFile'. $i]['tmp_name'],"uploads/". $file_name);


    for ($counter=1; $counter<=9; $counter++){
    if($copy){
  {
echo "$file_name | filen er uploadet :-)!<br>";

$r = mysql_query("UPDATE menu SET billede$counter='$file_name' WHERE id='4'");

}}else{
echo "$file_name | kunne ikke uploades!<br>";
}
}
}
?>
08. december 2011 - 07:25 #14
Ok, i #13 viser du lidt mere af sammenhængen.  Jeg forstår, at du i en kode du ikke viser indfører du hvor mange billeder du vil uploade, for eksempel 7.  Det antal placerer du i variabelen $uploadsNeeded, og så starter du en loop:


for($i = 0; $i < $uploadsNeeded; $i++)
{
  $file_name = $_FILES['uploadFile'. $i]['name'];
  $file_name = stripslashes($file_name);
  $file_name = str_replace("'","",$file_name);
  $copy = copy($_FILES['uploadFile'. $i]['tmp_name'],"uploads/". $file_name);

Hvis jeg har forstået det rigtigt, så indeholder variabelen $copy kun oplysninger om et enkelt billed.  Hvis du derfor fortsætter som du gør:

    for ($counter=1; $counter<=9; $counter++){
    if($copy){...

Så får du, som du har konstateret, det samme billed behandlet ni gange.  For at det skal give mening (hvis jeg har forstået det rigtigt) må det blive noget i denne retning:

$uploadsNeeded = $_POST['uploadsNeeded'];
for($i = 0; $i < $uploadsNeeded; $i++)
{
  $file_name = $_FILES['uploadFile'. $i]['name'];
  $file_name = stripslashes($file_name);
  $file_name = str_replace("'","",$file_name);
  $copy = copy($_FILES['uploadFile'. $i]['tmp_name'],"uploads/". $file_name);

  if($copy)
  {
    echo "$file_name | filen er uploadet :-)!<br>";
    $r = mysql_query(....den vender jeg tilbage til..);
  }
  else
  {
    echo "$file_name | kunne ikke uploades!<br>";
  }
}

Så forstår jeg ikke hvad du skal bruge det til.  Noget kunne tyde på, at dine billeder hører sammen i sæt med fra et til ni billeder i hvert sæt.  Hvert sæt har en id.  Når du starter den kode du viser, så har du allerede dine billedsæt fyldt i en mysql tabel.  Er det så således, at du vælger et sæt, for eksempel det med id = 4, og så vil du erstatte billederne i det sæt med nye billeder?  I så fald, hvordan ved koden så hvilket sæt du vil erstatte?  I den kode du viser skriver du direkte WHERE id='4', men det kan da næppe være hensigtsmæssigt.  Så skal du til at forandre koden hver gang du vil erstatte et andet sæt.  Du må på et eller andet tidspunkt tidligere i koden have valgt hvilket sæt du vil erstatte, så det valg må du placere i en variabel.  Så kunne du starte således:

$uploadsNeeded = $_POST['uploadsNeeded'];
$sæt = $_POST['sæt'];

og så bruge det i din UPDATE således:

$r = mysql_query(.... WHERE id = $sæt);

Videre ville jeg foreslå en anden tabelstruktur, for eksempel således:

menu
id sæt nr navn
1  1  0  filnavn25
2  1  1  filnavn16
3  1  2  filnavn17
4  2  0  filnavn12
5  2  1  filnavn18

Her har du to sæt, sæt numme 1 med tre billeder og sæt nummer 2 med to billeder.  Med en sådan tabel struktur kunne du skrive din update således:

if($copy)
{
  echo "$file_name | filen er uploadet :-)!<br>";
  $r = mysql_query("UPDATE menu SET navn = '$file_name' WHERE sæt = $sæt AND nr = $i"); 
}

Jeg vil være spændt på dine kommentarer til dette.
Avatar billede celfa Nybegynder
08. december 2011 - 11:37 #15
Mange tak for dit svar :) Jeg er helt med på hvad du skriver, så det kunne ikke være bedre. Godt forklaret!

Jeg har lige siddet og roddet lidt med det du skriver, og det giver mening for mig. Jeg har grebet situationen helt forkert an. Jeg benytte mig nu af din foreslåede tabelstruktur og det giver mening.

Her er følgende kode, som uploader og indsætter navne i db som jeg ønsker:

$uploadsNeeded = $_POST['uploadsNeeded'];
$parent = "2";
for($i = 0; $i < $uploadsNeeded; $i++){
$file_name = $_FILES['uploadFile'. $i]['name'];

$file_name = stripslashes($file_name);
$file_name = str_replace("'","",$file_name);
$copy = copy($_FILES['uploadFile'. $i]['tmp_name'],"uploads/". $file_name);

if($copy)
{
  echo "$file_name | filen er uploadet :-)!<br>";
  $r = mysql_query("INSERT INTO $tbl_name (filnavn, parent, nr)
VALUES ('$file_name', '$parent', '$i')");
 
}else{
echo "$file_name | kunne ikke uploades!<br>";
}
}
?>

Mit problem er så at $parent = "2"; jo stadig er statisk, det er udmærket godt klar over, det tænkte jeg på at jeg ville løse senere.

Jeg har nu lavet en tabel der hedder menu som indeholder mine andre data og en tabel der hedder billede som har din foreslåede tabelstruktur.

$parent skulle gerne antage samme værdi som det højeste id fra menu tabellen, da den bare kører auto increment. Kan jeg på nogen måde hente det? Dvs. har jeg på siden før indsat noget tekst i tabellen menu og min auto increment er nået til fx. id = 4 så skal $parent have værdien 4. Håber du forstår det, ellers så må du lige bede mig om at uddybe.


Tusinde tak for din tid og svar - det er virkelig brugtbart og lærerigt.
Avatar billede celfa Nybegynder
08. december 2011 - 11:50 #16
Jeg tænkte på om man kunne bruge:
$parent=mysql_insert_id();

også bare overføre den til næste side.. Men problemet er bare at $parent altid er = 0 når den urde bære højere.
08. december 2011 - 12:32 #17
Så du omdefinerer problemstillingen således:

Du har to tabeller, menu og billeder.  Du vil fra tid til anden uploade et antal billeder til billeder, og hver gang skal parent være lig med det højeste id i menu.  Har jeg forstået det rigtigt?

Det har jeg følgende forslag til som jeg ikke har testet, men som jeg håber vil virke:

$uploadsNeeded = $_POST['uploadsNeeded'];
for($i = 0; $i < $uploadsneeded; $i++)
{
  ....
  $r = mysql_query("INSERT INTO billeder(filnavn, parent, nr) VALUES('$file_name', SELECT MAX(id) FROM menu, $id)");
}

Hvis ikke det virker, så prøv at sætte subqueryen i parantes, altså

$r = mysql_query("INSERT INTO billeder(filnavn, parent, nr) VALUES('$file_name', (SELECT MAX(id) FROM menu), $id)");

Hvis du har problemer, så fortæl.
Avatar billede celfa Nybegynder
08. december 2011 - 17:05 #18
Ja du har forstået det helt korrekt. Og det virker helt præcist som det skal nu! Subqueryen gjorde jobbet. Smid et svar, du har virkelig været til stor hjælp!

Tak for det.
08. december 2011 - 17:16 #19
Svar fra mig.
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