Ga naar inhoud

[php] array and checkboxes


anoniem

Aanbevolen berichten

Enige tijd geleden heb ik een bericht gepost over een boekencatalogus. Ik ben aan de slag gegaan en heb inmiddels een systeem geschreven, maar ik loop tegen een probleem met checkboxes aan. Ik heb een formulier dat de waarden in de database schrijft. Ook de waarden van de checkboxes worden weggeschreven, alleen als ik in de database kijk zie ik alleen staan Array en niet de waarden die de checkboxes hebben. Dit is de code die ik gebruik om het formuliergegevens in de database te plaatsen. (Ik controleer in dit script trouwens ook of de titel al voorkomt in de database) [code:1:8770cb0644] include("../library/config.inc.php"); if(!empty($_POST)){ $auteur = $_POST['auteur']; $titel = $_POST['titel']; $genre = $_POST['genre']; $omschrijving = $_POST['omschrijving']; $moeilijkheidsgraad = $_POST['moeilijkheidsgraad']; $schooltype = $_POST['schooltype']; $jaar = $_POST['jaar']; foreach($genre as $key => $value) { $sql = ""; if ($value > 0) { $sql .= sprintf("INSERT INTO boek(genre1, genre2, genre3, genre4, genre4, genre5, genre6, genre7, genre8, genre9, genre10) VALUES('% s','%s');", $value, $old_no); mysql_query($sql); } } $sql_query = "SELECT * FROM boek WHERE titel='".$titel."';"; $result = mysql_query($sql_query); if(mysql_num_rows($result) > 0) { header ("Location: error.php"); } else { $sql_query = "INSERT INTO boek (auteur, titel, genre, omschrijving, moeilijkheidsgraad, schooltype, jaar) "; $sql_query .="VALUES ('".$auteur."', '".$titel."', '".$genre."', '".$omschrijving."', '".$moeilijkheidsgraad."', '".$schooltype."', '".$jaar."');"; $result = mysql_query($sql_query) or die(mysql_error()); header ("Location: toevoeg_boek_2.php"); } } [/code:1:8770cb0644] De checkboxes hebben de volgende structuur. [code:1:8770cb0644] <input type="checkbox" name="genre[]" value="sf/fantasy" id="sf/fantasy" />[/code:1:8770cb0644] Waarschijnlijk zie ik iets kleins over het hoofd, maar ik kom er zelf niet uit. Ik hoop dat iemand mij hiermee kan helpen. Bedankt. Rob
Link naar reactie
In onderstaand stukje code stop je de variable $genre (is een array) in een string. Je zal de losse waarden uit deze array moeten plaatsen in de database. [quote:fd640b3321="rjpm"] [code:1:fd640b3321] $sql_query = "INSERT INTO boek (auteur, titel, genre, omschrijving, moeilijkheidsgraad, schooltype, jaar) "; $sql_query .="VALUES ('".$auteur."', '".$titel."', '".$genre."', '".$omschrijving."', '".$moeilijkheidsgraad."', '".$schooltype."', '".$jaar."');"; [/code:1:fd640b3321] [/quote:fd640b3321] Echter lijkt het erop dat je huidige datamodel niet echt optimaal is. Zoals ik het nu zie, kan je namelijk alleen de genres (bijv) komma-gescheiden in de database stoppen. Beter is het om een n-m relatie aan te leggen tussen boeken en genres. Ik neem ten minste aan dat een boek aan meerdere genres kan hangen (gezien ook het feit dat je met checkboxes werkt). Overigens zal onderstaande code ook nooit kunnen werken. Het aantal kolommen in de insert komt niet overeen met de values. [quote:fd640b3321="rjpm"] [code:1:fd640b3321] foreach($genre as $key => $value) { $sql = ""; if ($value > 0) { $sql .= sprintf("INSERT INTO boek(genre1, genre2, genre3, genre4, genre4, genre5, genre6, genre7, genre8, genre9, genre10) VALUES('% s','%s');", $value, $old_no); mysql_query($sql); } } [/code:1:fd640b3321] [/quote:fd640b3321]
Link naar reactie
Beste Annie, bedankt voor je antwoord. Ik ben een php newbee en ik begrijp nog niet precies wat je bedoelt. Kun je me iets meer uitleg geven? Het is inderdaad zo dat een boek bij meerdere genres ondergebracht moet worden. Hoe zou ik met n-m relaties mijn datamodel kunnen optimaliseren? Ik hoop dat je me wat verder kunt helpen. Rob
Link naar reactie
Meerdere genres per titel opslaan doe je met 3 tabellen: Titels (TitelID, Titel, Auteur, ...) Genres (NUR, Genre) TitelGenres (TitelID, NUR) Je hebt bijv de titel: 12 'Zonder mij' 3 (auteur nr 3) Genres: 301 Vertaalde literaire roman, novelle 323 Literaire essays Je wil de titel aan beide genres koppelen, dus maak je twee records in TitelGenres: 12 301 12 323 Je kan dan per titel de genres uitlezen met SELECT * FROM TitelGenres WHERE TitelID = $TitelID
Link naar reactie
Paulus, Een goede tip. Ik heb het even geprobeerd en het lijkt te werken, maar ik vind het nog te omslachtig. Er moet toch een manier te vinden zijn om via een invulformulier direct alles in de goede tabel te schrijven? Zoals ik het nu zie heb je dus twee formulieren. 1 om de boeken in de tabel boeken te plaatsen en 1 om de boeken te koppelen aan de genres (in TitelGenres). Is er niet een mogelijkheid om dit met 1 formulier te doen? Rob
Link naar reactie
Mijn php is niet zo sterk, maar op het eerste gezicht lijkt het erop alsof je een lijstje met checkboxen als een array wil doorgeven, zodat je er aan de ontvangende kant (je php-script) ook als een array mee kan werken. Volgens mij kan dat niet. Je kan checkboxen maken met namen "genre1", "genre2", genre3" etc. en dan in je php-script iets doen als: if ($genre1=='on') { $sql .= sprintf("INSERT INTO TitelGenres (TitelID, Genre) VALUES($titelid,$genre1);", $value, $old_no); mysql_query($sql); } if ($genre2=='on') { $sql .= sprintf("INSERT INTO TitelGenres (TitelID, Genre) VALUES($titelid,$genre2);", $value, $old_no); mysql_query($sql); } Ik vind het er wel een beetje omslachtig uitzien, je zou op zijn minst een Function kunnen maken die een record toevoegt en waaraan je titelid en genre als parameters meegeeft: function addGenre(tit, gen) { $sql .= sprintf("INSERT INTO TitelGenres (TitelID, Genre) VALUES(tit,gen);", $value, $old_no); mysql_query($sql); } Verder copy/paste ik bovenstaande code een beetje uit je eigen script, of het werkt is een tweede... Er is vast wel iemand die daar nog wat aan kan schaven?
Link naar reactie
Natuurlijk kan dat in één formulier, maar dat betekent niet automatisch dat je het dan ook in één tabel moet opslaan. Je kan dit het best in meerdere tabellen opslaan (het datamodel dat door Paulus wordt geschetst). Ik werk daarbij meestal op de volgende wijze (de lijst met checkboxes krijgt daarbij als value de ID van een genre). [code:1:8db32b9f07] Bestaat boek? nee: aanmaken en ID bepalen ja: boekgegevens updaten Verwijder alle verwijzingen in koppeltabel voor boek ID Voeg de gekoppelde genres toe in de koppeltabel [/code:1:8db32b9f07] Een aardige truuk voor de laatste query is om de array met aangevinkte genres joinen met een komma en deze gebruiken in een WHERE IN clause. Voorbeeld, waarbij [i:8db32b9f07]$genres [/i:8db32b9f07]de array met aangevinkte genres is en [i:8db32b9f07]$boek[/i:8db32b9f07] het ID van het boek: [code:1:8db32b9f07] // controleer eerst of $genres geldige data bevat! // (niet opgenomen in voorbeeld) // join de genres $in = join(",", $genres); // maak de insert query $sql = "INSERT INTO koppeltabel (BoekID, GenreID) " . "SELECT " . $boek . ", GenreID FROM Genres " . "WHERE GenreID IN (" . $in . ")"; [/code:1:8db32b9f07]
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...