Avatar billede dj-sejler Praktikant
17. september 2005 - 17:55 Der er 12 kommentarer og
1 løsning

multi selectboks og opdatering af db

Hej alle i venlige eksperter.

Jeg har et mindre problem.

Jeg har en multi selectboks, hvor indholdet gerne skulle kunne opdateres, men det driller.

--> i formen: <--

echo '<select name="writer[]" size="10" multiple="multiple">';

  $w_result = mysql_query($w_query) or die("MySQL fejl: " . mysql_error());
  while ($writers = mysql_fetch_array($w_result)) {
   
    $b_result = mysql_query($b_query) or die("MySQL fejl: " . mysql_error());
    $b_log = mysql_fetch_array($b_result);
   
    if ($b_log[2]==$writers[0]) {
      echo '<option value="'.$writers[0].'" selected="selected">'.$writers[1].' '.$writers[2].'</option>';
    } else {
      echo '<option value="'.$writers[0].'">'.$writers[1].' '.$writers[2].'</option>';
    }
  }

  echo '</select>';


--> når formen godkendes! <--
Først tælles $writer i $count

og derefter køres følgende:

      for ($i=0; $i<$count; $i++) {
   
    $l_query = "SELECT id, id_books, id_writer FROM lib_library WHERE id_books = ".$bid." AND id_writer = '".$writer[$i]."' ORDER by id";
    $l_result = mysql_query($l_query) or die("MySQL fejl: " . mysql_error());
    $l_log = mysql_fetch_array($l_result);
    if ($l_log) {
      if ($writer[$i] == $l_log[2]) {
        echo 'test 1<br />';
      } else {
        echo 'test 2<br />';
      }
    } else {
      echo 'add: '.$writer[$i].'<br />';
    }
      }

Det jeg mangler er hvis der i databasen findes en post som ikke er valgt mere, den skal jo nu slettes.
oven stående køre fint hvis man tilføjer og/eller beholder den eksisterende.

Nogen der kan hjælpe eller har noget bedre?
Avatar billede nielle Nybegynder
17. september 2005 - 21:36 #1
Hvad er dit problem? Ønsker du at slette de forfattere som ikke er valgt i select-boksen fra formen? Og hvis du sletter forfatteren, skal forfatterens bøger så også slettes fra lib_library-tabellen?
Avatar billede nielle Nybegynder
17. september 2005 - 21:37 #2
BTW. Din føste kode bliver mere effektiv hvis du trækker $b_query-kaldet udenfor din while-løkke:

echo '<select name="writer[]" size="10" multiple="multiple">';

$b_result = mysql_query($b_query) or die("MySQL fejl: " . mysql_error());
$b_log = mysql_fetch_array($b_result);

$w_result = mysql_query($w_query) or die("MySQL fejl: " . mysql_error());
while ($writers = mysql_fetch_array($w_result))
{
    if ($b_log[2] == $writers[0])
    {
        echo '<option value="' . $writers[0] . '" selected="selected">' . $writers[1] . ' ' . $writers[2] . '</option>';
    }
    else
    {
        echo '<option value="' . $writers[0] . '">' . $writers[1] . ' ' . $writers[2] . '</option>';
    }
}

echo '</select>';
Avatar billede dj-sejler Praktikant
17. september 2005 - 21:43 #3
altså...

jeg har tre tabeller:
en med bøger, en med forfattere og en med referancerne, og det er referencerne der skal slettes når forfatteren ikke er valgt i select boksen

og min $b_query er afhængig af resultatet i while-løkken:

her kommer hele koden, så er det nok nemmere:


      if ($writer[$i] == $l_log[2]) {
      echo 'test '.$writer[$i].'<br />';
      } else {
      echo 'test 2<br />';
      }
      } else {
      if (
      $query_writer = "INSERT INTO lib_library (id_books,id_writer) VALUES ('$bid','$writer[$i]')";
      echo 'add: '.$writer[$i].'<br />';
      echo ' - sql: '.$query_writer.'<br />';
      }



      for ($i=0; $i<$count; $i++) {
    $l_query = "SELECT id, id_books, id_writer FROM lib_library WHERE id_books = ".$bid." AND id_writer = '".$writer[$i]."' ORDER by id";
    $l_result = mysql_query($l_query) or die("MySQL fejl: " . mysql_error());
    $l_log = mysql_fetch_array($l_result);
    if ($l_log) {
      if ($writer[$i] == $l_log[2]) {
        echo 'test '.$writer[$i].'<br />';
      } else {
        echo 'test 2<br />';
      }
    } else {
   
      $query_writer = "INSERT INTO lib_library (id_books,id_writer) VALUES ('$bid','$writer[$i]')";
      echo 'add: '.$writer[$i].'<br />';
      echo ' - sql: '.$query_writer.'<br />';
      if {
    }
   
      }
Avatar billede nielle Nybegynder
17. september 2005 - 22:16 #4
Prøv lige at poste den der en gang til - jeg tror at der er gået noget serøst galt med din cut'n'paste ;^)

Desuden vil jeg gerne vede lidt mere om din referance-tabel når det nu er den der skal slettes fra. Hvordan ser den ud og hvad er det præcis for en slags referencer den indeholder?
Avatar billede dj-sejler Praktikant
17. september 2005 - 22:32 #5
oki...
reference tabellen hedder: lib_library og har følgende:
id
id_books  (id fra bog-tabellen)
id_writer (id fra forfatter-tabellen)
og det er naturligvis alle tal.

--> Select-boksen <--
  echo '<select name="writer[]" size="10" multiple="multiple">';

  $w_query = "SELECT id, firstname, lastname FROM lib_writer ORDER by lastname";
  $w_result = mysql_query($w_query) or die("MySQL fejl: " . mysql_error());
  while ($writers = mysql_fetch_array($w_result)) {
   
    $b_query = "SELECT id, id_books, id_writer FROM lib_library WHERE id_books = ".$log['id']." AND id_writer = ".$writers[0]." ORDER by id";
    $b_result = mysql_query($b_query) or die("MySQL fejl: " . mysql_error());
    $b_log = mysql_fetch_array($b_result);
   
    if ($b_log[2]==$writers[0]) {
      echo '<option value="'.$writers[0].'" selected="selected">'.$writers[1].' '.$writers[2].'</option>';
    } else {
      echo '<option value="'.$writers[0].'">'.$writers[1].' '.$writers[2].'</option>';
    }
  }

  echo '</select>';




--> Når formen er gedkendt <--

      for ($i=0; $i<$count; $i++) {
    $l_query = "SELECT id, id_books, id_writer FROM lib_library WHERE id_books = ".$bid." AND id_writer = '".$writer[$i]."' ORDER by id";
    $l_result = mysql_query($l_query) or die("MySQL fejl: " . mysql_error());
    $l_log = mysql_fetch_array($l_result);
    if ($l_log) {
      if ($writer[$i] == $l_log[2]) {
        echo 'test '.$writer[$i].'<br />';
      } else {
        echo 'test 2<br />';
      }
    } else {
      echo 'add: '.$writer[$i].'<br />';
    }
   
      }

Tror den er god nok nu...
hvis forfatteren er markeret og findes i lib_library skrives: echo 'test '.$writer[$i].'<br />';
hvis forfatteren er markeret og _ikke_ finde i lib_library skrives: echo 'add: '.$writer[$i].'<br />';

og så er problemet der ;)
hvis forfatteren ikke er markeret med findes i lib_library, så skal den naturligvis slettes
Avatar billede nielle Nybegynder
17. september 2005 - 22:39 #6
Der er nu ingen grund til at genposte koden fra spørgsmålet - det var nu mere koden fra 17/09-2005 22:32:06 som jeg spurgte til.
Avatar billede nielle Nybegynder
17. september 2005 - 22:41 #7
Kan du ikke lige poste den SQL som gemmer sig i maven på din $w_query - altså den du danner din select udfra?
Avatar billede nielle Nybegynder
17. september 2005 - 22:42 #8
... og jeg mente selvfølgelig koden fra 17/09-2005 21:43:47 - ikke den fra 17/09-2005 22:32:06. :^|
Avatar billede dj-sejler Praktikant
17. september 2005 - 22:45 #9
den er med i den fra 17/09-2005 22:32:06
det er det der er forskellen på spørgsmålet og genposten...

men $w_query = "SELECT id, firstname, lastname FROM lib_writer ORDER by lastname";
Avatar billede nielle Nybegynder
17. september 2005 - 23:01 #10
Du bør kunne slette efter denne opskrift. Men husk nu lige at lave en sikkerhedeskopi først!

// Find alle forfatter-id'erne.

$sql = "SELECT id FROM lib_writer";
$result = mysql_query($sql) or die(mysql_error());

$writerAllArr = array();
while ($row = mysql_fetch_assoc($result))
{
    $writerAllArr[] = $row["id"];
}

// Træk alle dem som er selected fra.

$writerNoSelectArr = array_diff($writerAllArr, $writer);

// Slet derefter dem som ikke er selected:

foreach ($writerNoSelectArr as $writerToDelete)
{
    $sql = "DELETE FROM lib_library WHERE id=" . $writerToDelete;
    mysql_query($sql) or die(mysql_error());   
}
Avatar billede dj-sejler Praktikant
17. september 2005 - 23:03 #11
jamen det vil jeg da prøve... foreløbig tak
Avatar billede dj-sejler Praktikant
17. september 2005 - 23:44 #12
men en smulle ændringer og sådan lidt, ser det ud til at virke rigtig godt...
smid et svar og få nogen point :D
Avatar billede nielle Nybegynder
18. september 2005 - 07:17 #13
Svar :^)
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