Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[php] array and checkboxes

Annie
6 antwoorden
  • 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
  • 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]
  • 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
  • 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
  • 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
  • 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?

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.