22. september 2006 - 23:29
Der er
41 kommentarer og 1 løsning
UPDATE flere rækker i mysql
Så er jeg sgu på den igen. Jeg vil gerne opdatere flere rækker til mysql på éen gang, men kan ikke få det til at fungere. Har prøvet at bruge forskellige eksempler, men det fungerer ikke. Ved submit tømmer den istedet felterne i de respektive rækker. Hvad gør jeg forkert i dette script? <?php if(!isset($_POST['edituger'])) { $query = $db->query("SELECT * FROM nikksite_billedeuger WHERE bsted='".rawurldecode($ugested)."'"); while ($uge = mysql_fetch_array($query)){ extract($uge); // Val d'Isere 06/07 ugeliste if($uge['bsted'] == "valdisere0607") { eval("\$ugerne .= \"".template("nikk_admin_galleri_edituger_ugerne")."\";"); // Alpe d'Huez 04/05 ugeliste }elseif($uge['bsted'] == "alpedhuez0405") { eval("\$ugerne .= \"".template("nikk_admin_galleri_edituger_ugerne")."\";"); } eval("\$site_body = \"".template("nikk_admin_galleri_edituger")."\";"); } }else{ $query = $db->query("SELECT * FROM nikksite_billedeuger WHERE bsted='$ugested'"); while ($uge = mysql_fetch_array($query)){ extract($uge); $buge=$_POST['buge'][$id]; $bsorter=$_POST['bsorter'][$id]; $bsted=$_POST['bsted'][$id]; $buge = isset($newbuge[$id]) ? checkInput($newbuge[$id], 'no', 'no', 'javascript', false) : ''; $bsorter = isset($newbsorter[$id]) ? checkInput($newbsorter[$id], 'no', 'yes', 'javascript', false) : ''; $bsted = isset($newbsted[$id]) ? checkInput($newbsted[$id], 'no', 'no', 'javascript', false) : ''; $db->query("UPDATE nikksite_billedeuger SET buge='$buge', bsorter='$bsorter', bsted='$bsted' WHERE bsted='$ugested'"); $site_body = "<font class=txt><p align=center>Ugerne er opdateret!</p></font>"; } redirect('index.php?action=admin&sub=galleri', 2, X_REDIRECT_JS); } Her den vigtige del af html-formularen: <tr> <td bgcolor="$altbg2" class="tablerow" align="center"><input type="text" name="newbsorter[$id]" value="$uge[bsorter]" size="3" /></td> <td bgcolor="$altbg2" class="tablerow" align="center"><input type="text" name="newbuge[$id]" value="$uge[buge]" size="2" /></td> <td bgcolor="$altbg2" class="tablerow" align="center"><select size="1" name="newbsted[$id]"> <option value="$uge[bsted]">$uge[bsted]</option> <option value=""></option> <option value="valdisere0607">Val d'Isere 06/07</option> <option value="alpedhuez0405">Alpe d'Huez 04/05</option> </select></td> </tr>
Annonceindlæg fra Computerworld it-jobbank
23. september 2006 - 00:08
#1
Har du prøvet at debugge ved at udskrive, om dine $buge og andre variabler indeholder det, du tror de gør? Og så bør du putte `...` omkring feltnavnene (kan aldrig huske hvad de hedder) - bemærk at det ikke er apostroffer, altså: UPDATE nikksite_billedeuger SET `buge` = '$buge' ...
23. september 2006 - 00:17
#2
nej har ikke prøvet at debugge - det aner jeg ikke hvordan man gør. har ikke før haft problemer med feltnavnene, men det kan da godt være at jeg skulle begynde på og indkapsle dem. :)
23. september 2006 - 00:26
#3
hvad gør din function checkInput?
23. september 2006 - 00:30
#4
det er en funktion fra xmb forum, så er ikke 100% sikker på hvad den gør, men den checker i hvert fald om der f.eks. er html ect. i feltet.
23. september 2006 - 00:39
#5
måske er det noget her.... $buge = isset($_POST['newbuge'][$id]) ? checkInput($_POST['newbuge'][$id], 'no', 'no', 'javascript', false) : ''; $bsorter = isset($_POST['newbsorter'][$id]) ? checkInput($_POST['newbsorter'][$id], 'no', 'yes', 'javascript', false) : ''; $bsted = isset($_POST['newbsted'][$id]) ? checkInput($_POST['newbsted'][$id], 'no', 'no', 'javascript', false) : ''; prøv lige med disse linier i stedet...
23. september 2006 - 00:40
#6
nope.. samme resultat..
23. september 2006 - 00:41
#7
Har du prøvet at smide `...` omkring? Og en debug, er en ganske simpel udskrivning, så du ser hvad der er i felterne: echo "Buge: ".$bruge."<br />"; echo "bsorter: ".$bsorter."<br />"; etc. etc. Så kan du se, hvad de forskellige variabler indeholder, hvis de indeholder noget...
23. september 2006 - 00:46
#8
prøv at skrive denne linie: $db->query("UPDATE nikksite_billedeuger SET buge='$buge', bsorter='$bsorter', bsted='$bsted' WHERE bsted='$ugested'"); om til: $query = "UPDATE nikksite_billedeuger SET buge='$buge', bsorter='$bsorter', bsted='$bsted' WHERE bsted='$ugested'"; echo $query; $db->query($query);
23. september 2006 - 00:50
#9
ja, det har jeg prøvet.. virkede heller ikke og debugging viste bare at felterne ikke indeholdt noget som helst - akkurat ligesom resultatet er i db.
23. september 2006 - 00:54
#10
De variable du bruger bliver jo sat i denne del: $buge = isset($newbuge[$id]) ? checkInput($newbuge[$id], 'no', 'no', 'javascript', false) : ''; $bsorter = isset($newbsorter[$id]) ? checkInput($newbsorter[$id], 'no', 'yes', 'javascript', false) : ''; $bsted = isset($newbsted[$id]) ? checkInput($newbsted[$id], 'no', 'no', 'javascript', false) : ''; ...er $newbuge, $newbsorter og $newbsted i det hele taget defineret nogle steder? :)
23. september 2006 - 00:54
#11
virkede ikke ellebaek... mit script er ikke helt væk eller hvad? jeg er meget usikker på om det er den rigtige metode jeg i det hele taget bruger for at opdatere flere rækker på éen gang.
23. september 2006 - 00:55
#12
'new' der bliver sat foran er en standard i xmbforum ved update af felter i db. jeg bruger xmbforum som "motor" for min hjemmeside.
23. september 2006 - 00:58
#13
Hvis dine $buge etc. ikke indeholder noget, så er det klart, at dine rækker bliver blanke i din database. Sikker på at disse 3 (underlige? :) linier: $buge = isset($newbuge[$id]) ? checkInput($newbuge[$id], 'no', 'no', 'javascript', false) : ''; $bsorter = isset($newbsorter[$id]) ? checkInput($newbsorter[$id], 'no', 'yes', 'javascript', false) : ''; $bsted = isset($newbsted[$id]) ? checkInput($newbsted[$id], 'no', 'no', 'javascript', false) : ''; ...ikke bare sletter indeholdet af variablerne? Prøv at fjerne de 3 linier...
23. september 2006 - 00:59
#14
fik du ikk skrevet noget ud når du kørte den kode jeg skrev...?
23. september 2006 - 01:00
#15
det gjorde ingen forskel at fjerne de 3 linjer, hehe.. ellebaek, jo jeg fik skrevet noget ud, men variablerne indeholdt ingenting. jeg fatter det ikke..
23. september 2006 - 01:04
#16
godt så... nu laver vi en masse debug :-) Og så kopiere du hele skidtet herind... $sql = "SELECT * FROM nikksite_billedeuger WHERE bsted='$ugested'"; echo $sql . "<br>"; $query = $db->query($sql); echo "rækker" . mysql_num_rows($query); while ($uge = mysql_fetch_array($query)){ extract($uge); $buge=$_POST['buge'][$id]; echo $buge . "<br>"; $bsorter=$_POST['bsorter'][$id]; echo $bsorter . "<br>"; $bsted=$_POST['bsted'][$id]; echo $bsted . "<br>"; echo "id: " . $id . "<br>"; $buge = isset($newbuge[$id]) ? checkInput($newbuge[$id], 'no', 'no', 'javascript', false) : ''; echo $newbuge[$id] . "<br>"; $bsorter = isset($newbsorter[$id]) ? checkInput($newbsorter[$id], 'no', 'yes', 'javascript', false) : ''; echo $newbsorter[$id] . "<br>"; $bsted = isset($newbsted[$id]) ? checkInput($newbsted[$id], 'no', 'no', 'javascript', false) : ''; echo $newbsted[$id] . "<br>"; $db->query("UPDATE nikksite_billedeuger SET buge='$buge', bsorter='$bsorter', bsted='$bsted' WHERE bsted='$ugested'"); $site_body = "<font class=txt><p align=center>Ugerne er opdateret!</p></font>"; } redirect('index.php?action=admin&sub=galleri', 2, X_REDIRECT_JS); }
23. september 2006 - 01:05
#17
Jamen, hvis det ikke hjalp at fjerne de 3 linier, så må du jo bevæge dig baglæns. Så ligger problemet jo nok her: $query = $db->query("SELECT * FROM nikksite_billedeuger WHERE bsted='$ugested'"); while ($uge = mysql_fetch_array($query)){ extract($uge); $buge=$_POST['buge'][$id]; $bsorter=$_POST['bsorter'][$id]; $bsted=$_POST['bsted'][$id]; Indeholder $id noget? Kører du korrekt "method" i din form, altså sender den dataene rigtigt? etc. etc. etc.
23. september 2006 - 01:08
#18
uhh.. det var mærkeligt ellebaek.. dette var hvad jeg fik :P SELECT * FROM nikksite_billedeuger WHERE bsted='valdisere0607' rækker3 id: id: id:
23. september 2006 - 01:09
#19
jeg har ikke defineret $id til at indeholde noget, men jeg har forstået det sådan at det er en files betegnelse for de felter/rækker der skal opdateres. min form skulle gerne sende dataene korrekt..
23. september 2006 - 01:11
#20
Hvis $id ikke indeholder noget, så er det jo klart der ingen data er, da du så bare har $_POST['buge'][]. $id skal indeholde et tal, afhængig af hvilken række i arrayet du vil have. Prøv at fjerne [$id] på de 3 linier.
23. september 2006 - 01:11
#21
du bliver nødt til at definere din $id, da det er den der referer til de enkelte felter... hvordan ser kildekoden for din form ud..? Altså når du viser den i IE/firefox etc...
23. september 2006 - 01:12
#22
dette er fra formularen: <form enctype="multipart/form-data" method="post" action="index.php?action=admin&sub=edituger&ugested=$bsted"> det ser vel ok ud? "index.php?action=admin&sub=edituger&ugested=$bsted" er adressen som scriptet er på.
23. september 2006 - 01:13
#23
det er ikk det vi skal bruge.... det er mere koden når du har eksekveret siden... altså ved højreklik på siden, og så vis kildekode... ligger siden et sted så vi kan se den...?
23. september 2006 - 01:14
#24
kildekoden: <td width="100%" bgcolor="#FFFFFF" style="border-width: 1; border-bottom-style: solid; border-color: #4E7BAD;" align="center"><br><br><table width="800" cellspacing="0" cellpadding="0" border="0"><tr><td align="center" class="txt"><form enctype="multipart/form-data" method="post" action="index.php?action=admin&sub=edituger&ugested=valdisere0607"> <table border="0" width="300" cellspacing="0" cellpadding="0"> <tr> <td width="100%" class="smalltxt"> <table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%" bgcolor="#FFFFFF"> <table border="0" width="100%" cellspacing="1" cellpadding="4"> <tr> <td bgcolor="#D1E5EF" width="25%" class="tablerow" align="center" colspan="3"><strong>Redigér ugerne</strong></td> </tr> <tr> <td bgcolor="#D1E5EF" width="25%" class="tablerow" align="center"><strong>#</strong></td> <td bgcolor="#D1E5EF" width="15%" class="tablerow" align="center"><strong>Uge</strong></td> <td bgcolor="#D1E5EF" width="30%" class="tablerow" align="center"><strong>Sted</strong></td> </tr> <tr> <td bgcolor="#EFEFEF" class="tablerow" align="center"><input type="text" name="newbsorter[]" value="10" size="3" /></td> <td bgcolor="#EFEFEF" class="tablerow" align="center"><input type="text" name="newbuge[]" value="38" size="2" /></td> <td bgcolor="#EFEFEF" class="tablerow" align="center"><select size="1" name="newbsted[]"> <option value="valdisere0607">valdisere0607</option> <option value=""></option> <option value="valdisere0607">Val d'Isere 06/07</option> <option value="alpedhuez0405">Alpe d'Huez 04/05</option> </select></td> </tr><tr> <td bgcolor="#EFEFEF" class="tablerow" align="center"><input type="text" name="newbsorter[]" value="20" size="3" /></td> <td bgcolor="#EFEFEF" class="tablerow" align="center"><input type="text" name="newbuge[]" value="39" size="2" /></td> <td bgcolor="#EFEFEF" class="tablerow" align="center"><select size="1" name="newbsted[]"> <option value="valdisere0607">valdisere0607</option> <option value=""></option> <option value="valdisere0607">Val d'Isere 06/07</option> <option value="alpedhuez0405">Alpe d'Huez 04/05</option> </select></td> </tr><tr> <td bgcolor="#EFEFEF" class="tablerow" align="center"><input type="text" name="newbsorter[]" value="30" size="3" /></td> <td bgcolor="#EFEFEF" class="tablerow" align="center"><input type="text" name="newbuge[]" value="40" size="2" /></td> <td bgcolor="#EFEFEF" class="tablerow" align="center"><select size="1" name="newbsted[]"> <option value="valdisere0607">valdisere0607</option> <option value=""></option> <option value="valdisere0607">Val d'Isere 06/07</option> <option value="alpedhuez0405">Alpe d'Huez 04/05</option> </select></td> </tr> </table> </td> </tr> </table> </td> </tr> <tr> <td width="100%" class="smalltxt"> </td> </tr> <tr> <td width="100%" class="smalltxt"><input type="submit" class="submit" name="edituger" value="Redigér ugerne" /></td> </tr> </table></form></td></tr></table><br><br> </td> </tr> </table> </center> </div>
23. september 2006 - 01:17
#25
ovenstående er FØR submit. der kræves desværre login. når siden er eksekveret viser intet der kan bruges, kun html..
23. september 2006 - 01:18
#26
ja... det er det der er problemet... du bliver nødt til at have en reference til $id med... eller kører du udelukkende på de 3 felter, for så kan du bare sige at formen med de første felter hedder 1 og så 2 og så 3... og derefter så skal du ændre lidt i den anden kode... som så skal se ud som: for ($id = 1; $id <= 3; $id++){ extract($uge); $buge=$_POST['buge'][$id]; $bsorter=$_POST['bsorter'][$id]; $bsted=$_POST['bsted'][$id]; $buge = isset($newbuge[$id]) ? checkInput($newbuge[$id], 'no', 'no', 'javascript', false) : ''; $bsorter = isset($newbsorter[$id]) ? checkInput($newbsorter[$id], 'no', 'yes', 'javascript', false) : ''; $bsted = isset($newbsted[$id]) ? checkInput($newbsted[$id], 'no', 'no', 'javascript', false) : ''; $db->query("UPDATE nikksite_billedeuger SET buge='$buge', bsorter='$bsorter', bsted='$bsted' WHERE bsted='$ugested'"); $site_body = "<font class=txt><p align=center>Ugerne er opdateret!</p></font>"; } redirect('index.php?action=admin&sub=galleri', 2, X_REDIRECT_JS);
23. september 2006 - 01:20
#27
du kan se her, at du ikke har nogen værdier med...men da php tolker det som et array tror jeg det går galt da du ikke benytter noget index... name="newbsorter[]"
23. september 2006 - 01:22
#28
men nu dør compen for i aften... skal have noget søvn... håber du får det til at spille.. vender tilbage i morgen...
23. september 2006 - 01:23
#29
PHP laver selv et indeks når der ikke er defineret et. Derfor skal $id være 0 hvis det er det eneste sted i formularen at det navn bliver brugt.
23. september 2006 - 01:23
#30
ok, jeg indsatte det du har postet der og ændret formularen til følgende: <tr> <td bgcolor="$altbg2" class="tablerow" align="center"><input type="text" name="newbsorter[1]" value="$uge[bsorter]" size="3" /></td> <td bgcolor="$altbg2" class="tablerow" align="center"><input type="text" name="newbuge[2]" value="$uge[buge]" size="2" /></td> <td bgcolor="$altbg2" class="tablerow" align="center"><select size="1" name="newbsted[3]"> <option value="$uge[bsted]">$uge[bsted]</option> <option value=""></option> <option value="valdisere0607">Val d'Isere 06/07</option> <option value="alpedhuez0405">Alpe d'Huez 04/05</option> </select></td> </tr> jeg har 3 rækker og nu fik jeg værdien fra $uge[bsorter] fra den 3. række gentaget i alle tre rækker.
23. september 2006 - 01:24
#31
Du skal sørge for at bruge samme indeks i alle de relaterede felter, og så sætte $id inden du prøver at tilgå dem i din kode.
23. september 2006 - 01:26
#32
jeg er ikke helt med.. kan du forklare det nærmere? evt. med et eksempel?
23. september 2006 - 01:31
#33
I stedet for at bruge: newbsorter[1] newbuge[2] newbsted[3] skal du bruge SAMME tal, da oplysningerne hører sammen (og du dermed skal bruge samme indeks når du hiver dem ud af arrayet igen). Det er selvfølgelig lidt træls hvis man selv skal skrive tallene i hvert eneste input-element, så man bruger normalt [] (dvs. UDEN noget inde i de firkantede paranteser), fordi PHP selv sørger for at tildele det rigtige indeks. Hvis du ikke har andre form-elementer med samme navn er det i øvrigt komplet overflødigt at bruge et array. I så fald udelader du [] i input/select-felternes names og henviser til dem uden [$id] i din kode.
23. september 2006 - 01:34
#34
ok.. jeg har flere form-elementer, ellers havde jeg bare brugt alm. update af felterne. men hvordan skal jeg sætte $id inden jeg tilgår dem? hvad skal jeg sætte $id som og på hvilken måde?
23. september 2006 - 01:50
#35
I din form skal du bruge []. Ikke [$id] eller noget andet, det bliver nemlig noget rod. Når du så skal til at BRUGE de data der er sendt med formen, sætter du $id-variablen til værdien på det indeks du nu engang skal bruge. Hvad det så er den skal sættes til, afhænger af om du kun skal bruge en bestemt af dem, eller om du skal bruge dem alle - hvis det er det sidste, skal du lave et for-loop: for($i=0;$i<3;$i++) { } eller en foreach, hvis du ikke kan vide hvor mange elementer der er: foreach (array_keys($newbuge) as $id) { //her skal du så bruge $newbsorter[$id], $newbuge[$id], etc. }
23. september 2006 - 01:55
#36
ok, jeg må prøve mig frem en anden dag.. nu begynder det her at køre rundt i hovedet på mig. det er vidst sengetid. tak for hjælpen!
23. september 2006 - 13:23
#37
Ok, så har jeg arbejdet lidt med mit script. Det ser sådan her ud, men nu sker der ingenting. Er jeg på rette vej og i så fald, hvad gør jeg nu galt? if(!isset($_POST['edituger'])) { $query = $db->query("SELECT * FROM nikksite_billedeuger WHERE bsted='".rawurldecode($ugested)."'"); while ($uge = mysql_fetch_array($query)){ // Val d'Isere 06/07 ugeliste if($uge['bsted'] == "valdisere0607") { eval("\$ugerne .= \"".template("nikk_admin_galleri_edituger_ugerne")."\";"); // Alpe d'Huez 04/05 ugeliste }elseif($uge['bsted'] == "alpedhuez0405") { eval("\$ugerne .= \"".template("nikk_admin_galleri_edituger_ugerne")."\";"); } } for ( $i = 0; $i < 5; $i++ ) { eval("\$site_body = \"".template("nikk_admin_galleri_edituger")."\";"); // '$ugerne' indsættes i denne template som selve rækkerne } }else{ $query = $db->query("SELECT * FROM nikksite_billedeuger WHERE bsted='$ugested'"); $uge = $db->fetch_array($query); $uge = mysql_query("SELECT * FROM nikksite_billedeuger WHERE bsted='$ugested'"); $n = mysql_num_rows($uge); for ( $i = 0; $i < $n; $i++ ) { $xbuge = isset($newbuge[$i]) ? checkInput($newbuge[$i], 'no', 'no', 'javascript', false) : ''; $xbsorter = isset($newbsorter[$i]) ? checkInput($newbsorter[$i], 'no', 'no', 'javascript', false) : ''; $xbsted = isset($newbsted[$i]) ? checkInput($newbsted[$i], 'no', 'no', 'javascript', false) : ''; // Indsættes i database til retning af indlæg $db->query("UPDATE nikksite_billedeuger SET buge='$xbuge', bsorter='$xbsorter', bsted='$xbsted' WHERE bsted='$ugested'"); $site_body = "<font class=txt><p align=center>Ugerne er opdateret!</p></font>"; } //redirect('index.php?action=admin&sub=galleri', 9, X_REDIRECT_JS); } Html-rækker i uploadformlen ser således ud: <tr> <td bgcolor="$altbg2" class="tablerow" align="center"><input type="text" name="newbsorter[]" value="$uge[bsorter]" size="3" /></td> <td bgcolor="$altbg2" class="tablerow" align="center"><input type="text" name="newbuge[]" value="$uge[buge]" size="2" /></td> <td bgcolor="$altbg2" class="tablerow" align="center"><select size="1" name="newbsted[]"> <option value="$uge[bsted]">$uge[bsted]</option> <option value=""></option> <option value="valdisere0607">Val d'Isere 06/07</option> <option value="alpedhuez0405">Alpe d'Huez 04/05</option> </select></td> </tr>
23. september 2006 - 20:15
#38
anyone?
23. september 2006 - 22:22
#39
Der er forresten ikke noget bestemt antal rækker der skal opdateres efter som man kan oprette nye rækker et andet sted på siden.
23. september 2006 - 22:49
#40
efter pidgeots kommentar og lidt mere granskning af diverse tråde her på eksperten er jeg ret sikker på at det er 'foreach' jeg skal bruge, men jeg er ikke helt tip top på hvordan jeg skal bruge den.. er der evt. nogen, der ud fra ovenstående script, kan ændre det til foreach?
24. september 2006 - 21:31
#41
Det lader til at jeg er nød til at åbne et nyt spørgsmål for at få noget respons.. hmm
24. september 2006 - 21:54
#42
slut, jeg laver en ny.
Vi tilbyder markedets bedste kurser inden for webudvikling