Avatar billede 44fire44 Nybegynder
08. december 2007 - 18:23 Der er 35 kommentarer og
1 løsning

Valg i select-boks skal ændre checkbokse udfra databaseudtræk

Hej Eksperter

Jeg står og skal bruge en funktion, som henter en række brugere ud fra en database og lister dem i en dropdown-boks (altså en SELECT-boks)

Under denne select-boks har jeg en lang liste med data, hvor der er en checkbox ud for hver række

når man så vælger en bruger i dropdownboksen skal man kunne checke de checkboxe af som man har lyst til, og derefter gemme valgene i databasen - når man så næste gang vil redigere valgene, skal de valg man lavede sidst hentes ud fra databasen

Den data som bliver hentet ud hvor checkboksene er i, bliver genereret ud fra en whileløkke

Alle linier i min whileløkke har et nummer, og der bliver oprettet en tabel i databasen for hver bruger, så det nemmeste er vel at smide en liste ind med de numre som er blever checked af - men hvordan udfører jeg dette rent praktisk?

min select:

<select name="vaelgbruger">
<?
$result = mysql_query("select * from users");
while ($row = mysql_fetch_array($result))
{
echo "<option value=\"$row[phone]\">".$row[name]."</option>";
}
?>
</select>

min while:

<table border="0" align="center"><tr><td width="25" align="center">X</td><td>Type</td><td>Land</td><td width="70">Drue</td><td>Navn</td><td>Årgang</td><td width="70">Pris</td></tr>
<?php

while($vin = mysql_fetch_assoc($query))
{
    $num = $num + 1;

  if($num % 2 == 0)
  {
      $farve = "class=\"light\"";
  }
  else
  {
      $farve = "class=\"dark\"";
  }
 
  ?>
  <tr <?php print $farve; ?>>
  <td valign="top" width="25" align="center"><input type="checkbox" name="vin_<? echo $vin[vin_number]; ?>" value="<? echo $vin[vin_number]; ?>"></td><td valign="top"><?php print $vin[vin_type]; ?></a></td><td valign="top"><?php print $vin[vin_origin]; ?></td><td valign="top"><?php print $vin[vin_grape]; ?></td><td valign="top"><?php print $vin[vin_name]; ?></td><td valign="top"><?php print $vin[vin_year]; ?></td><td valign="top"><?php print $vin[vin_price]; ?></td>
  </tr>
  <?php
}


?>
<tr><td colspan="7"><input type="submit" name="gem" value="Gem valgte checkbokse"></form></td></tr>
</table>

På forhånd tak
/K
Avatar billede fant0mas Nybegynder
09. december 2007 - 10:18 #1
Ja, du er nød til at oprette en ny række, som indeholder den fra brugerens side valgte data. Og så opstille nogle nogle if's til at se hvad der skal vælges:

if(($row[phone] == $phone)? $selected = 'selected="SELECTED"'; : $selected = '';);

echo "<option value=\"$row[phone]\" ".$selected.">".$row[name]."</option>";
Avatar billede 44fire44 Nybegynder
09. december 2007 - 12:06 #2
Hvordan fortæller jeg så at den skal SELECT * from user_XXXXXXXX"); (altså user_$phone) og så checke alle dem allerede ER gemt i databasen når man vælger brugeren?
Avatar billede fant0mas Nybegynder
09. december 2007 - 13:11 #3
Jeg misforstode det vist lidt.
Du skal nok nærmere have fat i en hop menu, og så derfra hoppe til et bruger id, og så se på hvad du har af valg til netop den bruger.
Avatar billede 44fire44 Nybegynder
09. december 2007 - 13:53 #4
...hvad er en hop-menu? :P
Avatar billede 44fire44 Nybegynder
09. december 2007 - 14:32 #5
jeg har lavet et eksembel på hvordan jeg gerne vil have at det skal virke:

http://iceweb.eu/xplayn/vinslottet/admin_tilfravalg.php

som du kan se, så står den på "Hansens Bøfhus" foroven - det jeg gerne vil have, er at man kan checke de vine af som man gerne vil gemme, og derefter trykke "Tilføj" - derefter kan jeg så vælge "Larsens Bodega" i menuen og de valg som jeg tidligere har foretaget til "Larsens Bodega" skal så blive krydset af automatisk

(Jeg ved godt hvordan jeg reelt gemmer det i databasen, men mit problem er at hente dem ind for hver af brugerne og så få checkboksene opdateret automatisk)
Avatar billede fant0mas Nybegynder
09. december 2007 - 15:02 #6
Jamen så er jeg med. Jeg troede det var en mere kompliceret. I din bruger tabel, kan du så oprette rækker for alle de forskellige valg man kan lave, og så standart sætte dem til 0. Her eksempel på en hop menu:

head:
<script type="text/javascript">
function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}
</script>

i body:
<form name="form" id="form">
  <select name="jumpMenu" id="jumpMenu" onchange="MM_jumpMenu('parent',this,0)">
    <option value="dinside.php?id=<?=$row[id]?>"><?=$row[navn]?></option>
    <option value="dinside.php?id=<?=$row[id]?>"><?=$row[navn]?></option>
  </select>
</form>

Så skal du så lave noget ala.
If $_GET[id]{
hent data og udskriv

if($row[roedvin] == 1): $checked = 'checked': $checked = '');
if($row[roedvin] == 1): $value = '1': $value = '0');

<input name="roedvin" type="checkbox" value="<?=$value?>" <?=$checked?> />
Avatar billede 44fire44 Nybegynder
09. december 2007 - 15:19 #7
det stemmer desværre ikke overens med resten af systemet hvis jeg opretter rækker for alle de forskellige valg

jeg havde mere tænkt mig at den indsætter et nummer (hver genstand har et nummer) og derefter henter det antal linier ud som der er numre i tabellen og skriver de numre ind som er gemt
Avatar billede fant0mas Nybegynder
09. december 2007 - 15:51 #8
Ja, du kan bare bruge en reference tabel i stedet, kig på:
http://www.w3schools.com/sql/sql_join.asp
Avatar billede 44fire44 Nybegynder
09. december 2007 - 16:23 #9
kan godt se din idé nu :) - nu er det tilføjet her

http://iceweb.eu/xplayn/vinslottet/admin_tilfravalg.php

så skal jeg bare lige finde ud af hvordan jeg gemmer og hiver ting ud af databasen :)
det bliver vel noget med INSERT into $_GET['id']-agtigt ;)
Avatar billede fant0mas Nybegynder
09. december 2007 - 16:52 #10
Hvordan ser din tabel ud?
Avatar billede 44fire44 Nybegynder
09. december 2007 - 17:02 #11
jeg har en tabel (users) som indeholder alle brugerne
den er i og for sig irellevant, da det kun er "name" og "phone" som jeg skal bruge fra den tabel

derudover har jeg en tabel pr. bruger som har navnet user_XXXXXXXX (altså user_$phone) - i den er der en række der hedder "vin_nummer" - og det er i denne række jeg gerne vil have alle de vinnumre gemt som bliver valgt på siden
Avatar billede 44fire44 Nybegynder
09. december 2007 - 17:03 #12
dvs. når jeg opretter en bruger, så oprettes der en bruger i tabellen "users" samtidig med at der bliver oprettet en ny tabel ved navn "user_$phone"
Avatar billede 44fire44 Nybegynder
13. december 2007 - 21:24 #13
okay, nu har jeg ændret lidt på min databaseopsætning

Nu har jeg en tabel med brugere, en tabel med vine, og en tabel jeg kalder wine_priv

- den indholder vin_id og user_id - fx.


1 - 88888888
2 - 88888888
1 - 47586932
4 - 88888888
3 - 78456235

- altså nummeret på vinen, samt brugerID som er telefonnummeret - der er nememre end en tabel for hver bruger

jeg har også lavet en query som ser sådan ud: $user_wine = mysql_query("SELECT * FROM wine_priv WHERE user_id = '{$_GET[ID]}'") or die(mysql_error());

det er jo fint - men hvordan skal min funktion se ud, som sørger for at checkboksene er checked eller unchecked? (jeg skal have en funktion der tjekker om nummeret eksisterer på vin-listen og på privilegie-listen - og hvis den findes begge steder skal den checkes, samt en funktion som gemmer nye tilføjelser til brugeren)
Avatar billede fant0mas Nybegynder
14. december 2007 - 11:51 #14
Så må det blive sådan:

$nummer = mysql_real_escape_string($_GET[nummer]);

$result = mysql_query("
SELECT *
FROM vine
LEFT JOIN wine_priv
ON vine.vin_id = wine_priv.vin_id AND wine_priv.tlfnummer = '$nummer'
");
while ($row = mysql_fetch_array($result)) {
    if((!is_null($row['vin_id']))? $checked = 'checked="checked"': $checked = '');
    echo '<input name="'.$row[vin_navn].'" type="checkbox" value="1" '.$checked.'>';
}
Avatar billede 44fire44 Nybegynder
14. december 2007 - 12:26 #15
Nu får jeg følgende fejl når jeg smider det ind (jeg har lige rettet det til, så tabellerne passer på navn:

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 41

$nummer = mysql_real_escape_string($_GET[id]);

$result2 = mysql_query("
SELECT * FROM vine
LEFT JOIN wine_priv
ON vine.vin_number = wine_priv.vin_id AND wine_priv.user_id = '$nummer'
");

while ($row = mysql_fetch_array($result2)) {
    if((!is_null($row['vin_id']))? $checked = 'checked="checked"': $checked = '');
    echo '<input name="'.$row[vin_navn].'" type="checkbox" value="1" '.$checked.'>';

} ?>
Avatar billede fant0mas Nybegynder
14. december 2007 - 12:55 #16
Argh, hader når man må til at teste sin pseudo-kode. :D
Men det fungerer altså her.
Du må have en fejl, enten tastefejl, eller forkert navn i:
ON vine.vin_number = wine_priv.vin_id AND wine_priv.user_id = '$nummer'
Avatar billede 44fire44 Nybegynder
14. december 2007 - 13:00 #17
$nummer = mysql_real_escape_string($_GET[id]);
$result2 = mysql_query("SELECT * FROM vine LEFT JOIN wine_priv ON vine.vin_number = wine_priv.vin_id AND wine_priv.user_id = '$nummer'");

sådan ser den ud hos mig :/
Avatar billede 44fire44 Nybegynder
14. december 2007 - 13:01 #18
arrh - tabelnavnet :P
Avatar billede 44fire44 Nybegynder
14. december 2007 - 13:03 #19
det virker også nu :P - nu mangler jeg bare at skrive den ind i min nuværende løkke :)
Avatar billede fant0mas Nybegynder
14. december 2007 - 13:18 #20
Det lyder farligt. Vi har jo netop brugt LEFT JOIN for at undgå at lave et utal af query's. Nå men jeg hører nok mere fra dig, så må vi se på det... :P
Avatar billede 44fire44 Nybegynder
14. december 2007 - 14:10 #21
well - jeg har jo den her løkke i forvejen:

<table border="0" align="center"><tr><td width="25" align="center">X</td><td>Type</td><td>Land</td><td width="70">Drue</td><td>Navn</td><td>Årgang</td><td width="70">Pris</td></tr>
<?php

while($vin = mysql_fetch_assoc($query))
{
    $num = $num + 1;

  if($num % 2 == 0)
  {
      $farve = "class=\"light\"";
  }
  else
  {
      $farve = "class=\"dark\"";
  }
 
  ?>
  <tr <?php print $farve; ?>>
  <td valign="top" width="25" align="center"><input type="checkbox" name="vin_<? echo $vin[vin_number]; ?>" value="<? echo $vin[vin_number]; ?>"></td><td valign="top"><?php print $vin[vin_type]; ?></a></td><td valign="top"><?php print $vin[vin_origin]; ?></td><td valign="top"><?php print $vin[vin_grape]; ?></td><td valign="top"><?php print $vin[vin_name]; ?></td><td valign="top"><?php print $vin[vin_year]; ?></td><td valign="top"><?php print $vin[vin_price]; ?></td>
  </tr>
  <?php
}


?>
<tr><td colspan="7"><input type="submit" name="gem" value="Gem valgte checkbokse"></form></td></tr>
</table>

- og det er jo der jeg skal skrive checkboxen ind i? :)
Avatar billede fant0mas Nybegynder
14. december 2007 - 14:24 #22
Jamen det er da lige til at copy/paste ind i det tidligere?

Så skal du selvfølgelig ændre:
while ($row = mysql_fetch_array($result2)) {

while ($vin = mysql_fetch_array($result2)) {
Avatar billede 44fire44 Nybegynder
14. december 2007 - 15:45 #23
underligt nok, så bliver alle 5 checked selvom det kun burde være nummer 2 og 5 der burde checkes

http://iceweb.eu/xplayn/vinslottet/admin_tilfravalg.php?id=88888888
Avatar billede fant0mas Nybegynder
14. december 2007 - 18:03 #24
Må jeg se koden?
Avatar billede 44fire44 Nybegynder
14. december 2007 - 19:24 #25
nu har jeg så fået checkboxen til at virke

men lidt underligt, for der kommer 5 nye oven over de 5 der skal være der :S
- men hvis jeg skifter mellem de to while-starts, så kan jeg hente hhv. teksten og checkboxene ind

<table border="0" align="center"><tr><td width="25" align="center">X</td><td>Type</td><td>Land</td><td width="70">Drue</td><td>Navn</td><td>Årgang</td><td width="70">Pris</td></tr>
<?php

// while($vin = mysql_fetch_assoc($query)) {
while($row = mysql_fetch_assoc($result2)) {


  if((!is_null($row['wine_id']))? $checked = 'checked="checked"': $checked = '');
    echo '<input name="'.$row[vin_number].'" type="checkbox" value="1" '.$checked.'>';

    $num = $num + 1;

  if($num % 2 == 0)
  {
      $farve = "class=\"light\"";
  }
  else
  {
      $farve = "class=\"dark\"";
  }
 
  ?>
  <tr <?php print $farve; ?>>
  <td valign="top" width="25" align="center"><input type="checkbox" name="<? echo $row[vin_number]; ?>" value="<? echo $row[vin_number]; ?>" <?=$checked?> ></td><td valign="top"><?php print $vin[vin_type]; ?></a></td><td valign="top"><?php print $vin[vin_origin]; ?></td><td valign="top"><?php print $vin[vin_grape]; ?></td><td valign="top"><?php print $vin[vin_name]; ?></td><td valign="top"><?php print $vin[vin_year]; ?></td><td valign="top"><?php print $vin[vin_price]; ?></td>
  </tr>
  <?php
}


?>
<tr><td colspan="7"><input type="submit" name="gem" value="TIlføj vine til bruger"></form></td></tr>
</table>

http://iceweb.eu/xplayn/vinslottet/admin_tilfravalg.php?id=88888888
Avatar billede 44fire44 Nybegynder
14. december 2007 - 19:25 #26
okay, fair nok - det var mig der ikke lige var vågen ;) - jeg skulle selvfølgelig have fjernet echo-sætningen

nu har jeg kun det problem at jeg kun kan hente en ting ind af gangen
Avatar billede fant0mas Nybegynder
14. december 2007 - 19:44 #27
En ting? Det forstår jeg ikke helt...
Avatar billede 44fire44 Nybegynder
14. december 2007 - 20:40 #28
det eneste som der ikke passer nu, er at teksten ikke er i min tabel - checkboxene passer fint, men teksten er der ikke

og hvis jeg skifter mellem disse to whiles

// while($vin = mysql_fetch_assoc($query)) {
while($row = mysql_fetch_assoc($result2)) {

så kan jeg med den første hente teksten ud - og med den anden om checkboxene er checked eller ej - men hvordan får jeg BÅDE teksten OG checkboxene til at virke på samme tid?
Avatar billede fant0mas Nybegynder
14. december 2007 - 20:56 #29
Har prøvet at gøre det lidt mere overskueligt for dig. Som du kan se har jeg ændret alle dine $vin[] til $row[] da data jo ligger der når vi bruger
while($row =
Nå men her er det endelige:
---------------------------------------------------------------------------

<table border="0" align="center">
<tr><td width="25" align="center">X</td>
<td>Type</td><td>Land</td><td width="70">Drue</td>
<td>Navn</td><td>Årgang</td><td width="70">Pris</td></tr>
<?
$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="1" '.$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++;
}
?>
<tr><td colspan="7"><input type="submit" name="gem" value="TIlføj vine til bruger"></form></td></tr>
</table>
Avatar billede 44fire44 Nybegynder
14. december 2007 - 22:32 #30
du fortjener dine points ;) - smid et svar! :D
Avatar billede fant0mas Nybegynder
14. december 2007 - 23:05 #31
Det er den bedste dag i mit liv!
...svar.
Avatar billede fant0mas Nybegynder
14. december 2007 - 23:05 #32
Q('.'Q)
Avatar billede 44fire44 Nybegynder
14. december 2007 - 23:41 #33
jeg har også smidt dig lidt karma :)
Avatar billede 44fire44 Nybegynder
15. december 2007 - 00:40 #34
lige et hurtigt input

nu laver jeg så en nu query som skal smide navnet på brugeren ud således

$navn = mysql_query("SELECT name FROM users WHERE phone = $_GET[id]");

når jeg så printer den med <? print $navn; ?>, så får jeg bare udskriften: "Resource id #5" - hvorfor får jeg det?
Avatar billede fant0mas Nybegynder
15. december 2007 - 10:54 #35
$navn = mysql_query("SELECT name FROM users WHERE phone = $_GET[id]");
$row = mysql_fetch_array($name);

<?=$row[name]?>
Avatar billede fant0mas Nybegynder
15. december 2007 - 14:10 #36
Du bør forresten aldrig bruge $_GET / $_POST direkte i din query uden på en eller anden måde at checke dataen.
Det var derfor jeg tidligere skrev:
$nummer = mysql_real_escape_string($_GET[nummer]);

is_numeric
Bør du også bruge i dette tilfælde.

Læs mere:
http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection
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