Avatar billede 44fire44 Nybegynder
29. december 2007 - 23:11 Der er 40 kommentarer og
1 løsning

Gem variabelt antal checkbox (samt deres værdi) til database

Hej eksperter

Jeg har lavet en whileløkke som henter n lang række variabel data ud fra en database - sammen med denne data har får jeg generet en checkbox ud fra hver linie data (jeg har lavet to test-rækker i databasen som jeg henter ud her: http://iceweb.eu/xplayn/vinslottet/admin_tilfravalg.php?id=88888888 )

Hvordan skriver jeg min post-funktion og MySQL query når jeg ikke kender det eksakte antal checkboxe eller værdien af dem?

(simplificeret, så er det i bund og grund ret enkelt - jeg vil gerne have at man kan checke og unchecke checkboxene på denne side http://iceweb.eu/xplayn/vinslottet/admin_tilfravalg.php?id=88888888, trykke på "Gem" og så bliver de uncheckede fjernet, og de checkede gemt)
Avatar billede 44fire44 Nybegynder
29. december 2007 - 23:17 #1
det skal nok lige sides at dataen, altså teksten, hentes ud fra en seperat database-tabel

om checkboksene er checkede eller ej afhænger af en tabel med to rækker - den ene indeholder værdien i _GET-funktionen (her altså 88888888) og så nummeret på de checkbokse der er checked

altså på nævnte side er det altså:

2 - 88888888
35 - 88888888

dvs når en box bliver unchecked skal jeg have fjernet den post i databasen, og hvis der er en checkbox som er checked, skal jeg have en linie tilføjet i databasen

Håber det forklarede det hele lidt bedre - ellers spørg endelig
Avatar billede fant0mas Nybegynder
30. december 2007 - 19:13 #2
if((!is_null($row['wine_id']))? $value = '1': $value = 'null');

echo '<input name="vinID['.$row[vin_id].']" type="checkbox" value="'.$value.'" '.$checked.'>';

________________________________________________________
Så skal det indsættes

$vinID = $_POST[vinID];
foreach($vinID as $key => $val){
mysql_query("UPDATE vine_priv SET vin_id = '$val' WHERE id = '$key' LIMIT 1") or die(mysql_error());
}
Avatar billede 44fire44 Nybegynder
31. december 2007 - 13:38 #3
jeg har i forvejen denne:

<?
$num = 0;
while($row = mysql_fetch_assoc($result2)) {

    if((!is_null($row['wine_id']))? $checked = 'checked="checked"': $checked = '');
    if(($num % 2 == 0)?    $farve = 'light': $farve = 'dark');

    echo '<tr class="'.$farve.'"><td valign="top" width="25" align="center">';
    echo '<input name="'.$row[vin_number].'" type="checkbox" value="'.$row[vin_number].'" '.$checked.'>';
    echo '</td>
          <td valign="top">'.$row[vin_type].'</td>
          <td valign="top">'.$row[vin_origin].'</td>
          <td valign="top">'.$row[vin_grape].'</td>
          <td valign="top">'.$row[vin_name].'</td>
          <td valign="top">'.$row[vin_year].'</td>
          <td valign="top">'.$row[vin_price].'</td>
          </tr>';
$num++;
}
?>

skal jeg bare erstatte:

if((!is_null($row['wine_id']))? $checked = 'checked="checked"': $checked = '');
med
if((!is_null($row['wine_id']))? $value = '1': $value = 'null');

og

echo '<input name="'.$row[vin_number].'" type="checkbox" value="'.$row[vin_number].'" '.$checked.'>';
med
echo '<input name="vinID['.$row[vin_id].']" type="checkbox" value="'.$value.'" '.$checked.'>';

?? :)
- godt nytår!
Avatar billede fant0mas Nybegynder
31. december 2007 - 13:56 #4
1. Nej begge skal med
2. Den skal erstattes
3. Lige over :D
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:06 #5
hmm - ja, nu har jeg så skrevet det ind således

<?
$num = 0;
while($row = mysql_fetch_assoc($result2)) {

    if((!is_null($row['wine_id']))? $value = '1': $value = 'null');
    if((!is_null($row['wine_id']))? $checked = 'checked="checked"': $checked = '');
    if(($num % 2 == 0)?    $farve = 'light': $farve = 'dark');

    echo '<tr class="'.$farve.'"><td valign="top" width="25" align="center">';
    echo '<input name="vinID['.$row[vin_id].']" type="checkbox" value="'.$value.'" '.$checked.'>';
    echo '</td>
          <td valign="top">'.$row[vin_type].'</td>
          <td valign="top">'.$row[vin_origin].'</td>
          <td valign="top">'.$row[vin_grape].'</td>
          <td valign="top">'.$row[vin_name].'</td>
          <td valign="top">'.$row[vin_year].'</td>
          <td valign="top">'.$row[vin_price].'</td>
          </tr>';
$num++;
}

$vinID = $_POST[vinID];
foreach($vinID as $key => $val){
mysql_query("UPDATE wine_priv SET vin_id = '$val' WHERE id = '$key' LIMIT 1") or die(mysql_error());
}

?>

- nu får jeg så følgende to fejl:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\webserver\xampp\htdocs\iceweb\xplayn\vinslottet\admin_tilfravalg.php on line 37

Warning: Invalid argument supplied for foreach() in C:\webserver\xampp\htdocs\iceweb\xplayn\vinslottet\admin_tilfravalg.php on line 102
Avatar billede fant0mas Nybegynder
31. december 2007 - 14:17 #6
$vinID = $_POST[vinID];
foreach($vinID as $key => $val){
mysql_query("UPDATE wine_priv SET vin_id = '$val' WHERE id = '$key' LIMIT 1") or die(mysql_error());
}

Den skal selvfølgelig først køre når der bliver postet. if(isset($_POST[])); eller hvordan du nu gør det. Og tjek lige om navnene i queryen passer.
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:23 #7
nu poster den, men nu er problemet at vin-IDét ikke bliver hentet ind (som du jo kan se ved at vise kildekoden på siden)

når jeg poster får jeg bare fejlen
"Unknown column 'id' in 'where clause'"
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:25 #8
- eller det vil sige, dem som ER i databasen har et nummer - dem som ikke har er bare tomme...
Avatar billede fant0mas Nybegynder
31. december 2007 - 14:25 #9
WHERE id = '$key'

Det hedder nok noget andet ved dig?
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:30 #10
$key, er det det brugernummer som vinene skal tilføjes til? - for så er det jo bare min get-funktion ;)
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:34 #11
så bliver det: mysql_query("UPDATE wine_priv SET wine_id = '$val' WHERE user_id = '{$_GET[id]}' LIMIT 1") or die(mysql_error());
Avatar billede fant0mas Nybegynder
31. december 2007 - 14:35 #12
Nej $key skal du ikke ændre på. Det er index værdierne af arrayet. Eller sagt så det kan forståes, så er det dine id's.

"Unknown column 'id' in 'where clause'"

WHERE id

Skal vist være WHERE vin_id
Avatar billede fant0mas Nybegynder
31. december 2007 - 14:40 #13
Hmm, men jeg kan godt se der bliver et problem, for det skal selvfølgelig også (måske) oprettes nogle nye rækker.
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:47 #14
hmm - altså den laver noget underligt nu...

lige nu er der et enkelt tal som ændrer sig i min tabel, og det er et 0 som ændrer sig til et 1-tal

den melder en fejl, men det er fordi jeg ikke har skrevet min header-location endnu
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:48 #15
der bliver ikke tilføjet noget, og den opdaterer kun den eksisterende post, hvor brugernummer er 88888888, selvom det er en anden bruger jeg gemmer fra
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:52 #16
arh - jeg fandt lige ud af hvorfor at de rækkernes checkboxe ikke havet noget nummer - der var den forkerte række jeg hentede ind fra

jeg skulle hente nummeret ind fra vin_number fra vin-tabellen fremfor wine_id fra privilegie-tabellen

    echo '<input name="vinID['.$row[vin_number].']" type="checkbox" value="'.$value.'" '.$checked.'>';
Avatar billede 44fire44 Nybegynder
31. december 2007 - 14:58 #17
Men altså lige nu sker der altså ingenting når jeg trykker gem - Det eneste jeg ønsker er at der kommer en ny linie i tabellen for hver vin der er checked - nummeret, og brugernummeret - og hvis man unchecker en boks skal linien bare fjernes fra databasen igen - som det er nu checker den selv boksen af hvis nummeret eksisterer i databasen


kan jeg egentligt skrive mit header_location således
Header("Location: side.php?id='.$_GET[id].'"); ??
Avatar billede 44fire44 Nybegynder
31. december 2007 - 15:01 #18
nu har jeg for sjov skyld prøver at tilføje en post i databasen

31 - 88888888 (31 er vin nummer 31) - den bliver fint checked af får jeg henter brugeren, men når jeg trykker gem, ændres tallet 31 bare til et 1-tal

besynderligt...
Avatar billede fant0mas Nybegynder
31. december 2007 - 15:08 #19
Nej for vi sætter jo værdien til 1 her:
if((!is_null($row['wine_id']))? $value = '1': $value = 'null');

giv mig lige 10 min, så ser jeg på det :D
Avatar billede fant0mas Nybegynder
31. december 2007 - 15:35 #20
if((!is_null($row['wine_id']))? $value = '1': $value = 'null');
Ændre til:
if((!is_null($row['vin_id']))? $value = $row['vin_id']: $value = '');
Avatar billede fant0mas Nybegynder
31. december 2007 - 15:36 #21
Indsæt i din form:
echo '<input type="hidden" name="nummer" value="'.$nummer.'"';
Avatar billede fant0mas Nybegynder
31. december 2007 - 15:39 #22
$nummer skal du ændre til der hvor du har dit telefonnummer (88888888)
Avatar billede 44fire44 Nybegynder
31. december 2007 - 15:43 #23
alter $_GET[id]?
Avatar billede 44fire44 Nybegynder
31. december 2007 - 15:45 #24
altså*
Avatar billede fant0mas Nybegynder
31. december 2007 - 15:47 #25
Ja
Avatar billede fant0mas Nybegynder
31. december 2007 - 15:52 #26
Indsæt istedet for det tidligere hvor vi updaterede:
--------------------------------------------------------------

$vinID = $_POST[vinID];
$nummer = $_POST[nummer];
//først sletter vi de gamle rækker
$sql = "DELETE FROM wine_priv WHERE tlfnummer='$nummer'"; //Det hedder nok ikke tlfnummer ved dig så det skal ændres.
$result = mysql_query($sql) or die(mysql_error());
//så indsætter vi de nye   
foreach($vinID as $key => $val){
   
mysql_query("INSERT INTO wine_priv (id, vin_id, tlfnummer) values ('NULL', '$key', '$nummer')") or die(mysql_error());
//her skal du også ændre så navnene passer.
Avatar billede 44fire44 Nybegynder
31. december 2007 - 15:54 #27
nu sker der bare ingenting når jeg gemmer? :/
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:02 #28
arrh! - NU virker det ;)
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:03 #29
- dog ikke når men sletter posterne igen :P
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:05 #30
problemet er bare at den tilføjer en ny post når jeg trykker gem selvom den allerede eksisterer
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:06 #31
og når jeg så fjerner fluebenet igen og trykker gem, så fjerner den ikke posterne. Der sker bare simpelthen intet
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:18 #32
funktionen ser således ud nu:

if($_POST['gem'])
{

$vinID = $_POST[vinID];
$nummer = $_POST[nummer];
//først sletter vi de gamle rækker
$sql = "DELETE FROM wine_priv WHERE user_id= '{$_GET[id]}' "; //Det hedder nok ikke tlfnummer
$result = mysql_query($sql) or die(mysql_error());
//så indsætter vi de nye   
foreach($vinID as $key => $val){
   
mysql_query("INSERT INTO wine_priv (id, wine_id, user_id) values ('NULL', '$key', '$nummer')") or die(mysql_error());
}

        Header("Location: admin_tilfravalg.php?id='.$_GET[id].'");
}
?>
Avatar billede fant0mas Nybegynder
31. december 2007 - 16:36 #33
Header("Location: admin_tilfravalg.php?id=$nummer");

sæt lige den i stedet
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:38 #34
sådan :)
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:39 #35
det fjernede min location-fejl, men den sletter stadig intet fra databasen
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:42 #36
problem løst ;) - erstattede {$_GET[id]} med $nummer og så virkede det :P
Avatar billede 44fire44 Nybegynder
31. december 2007 - 16:44 #37
nu er der heller ingen problemer med ting der ikke bliver fjernet eller dobbelt-posts :)

smid et svar for points! :D
Avatar billede fant0mas Nybegynder
31. december 2007 - 16:44 #38
Det ser da fint ud her - eller?
Avatar billede fant0mas Nybegynder
31. december 2007 - 16:45 #39
Fedt. Godt nytår!
Avatar billede 44fire44 Nybegynder
31. december 2007 - 17:02 #40
I lige måde ;)
Avatar billede 44fire44 Nybegynder
10. januar 2008 - 12:44 #41
(Btw, har lige smidt den sidste del af problemet her - http://www.eksperten.dk/spm/813927 - håber du kan hjælpe :) /K)
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