Geneste SELECT met een IF

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Karin Gijssen

Karin Gijssen

21/07/2013 12:17:12
Quote Anchor link
Ik ben beginnend PHPer en ik ben voor mijn cursus bezig met een webshop.
Ik wil een wijzigingsformulier maken voor een webshopartikel. Daarbij kan een artikel in één of meerdere categorieën zitten. Mijn artikelID in dit voorbeeld heb ik er even hard in gezet (komt normaal met een GET mee) en zit in de 2e en 5e categorie. Ik wil dat bij het openen van het formulier de juiste checkboxen gevuld zijn(2 en 5 dus). De lijst met alle categorieën verschijnt keurig, maar in plaats van twee, zijn álle checkboxen aangevinkt. De sqlstatements werken in myPhpAdmin. En hij gaat dus wel de tweede while lus in. Waar ga ik de fout in?

Dit is mijn code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

require_once 'config.php';
require_once 'lib/lib.php';

$db = mysql_connect($strServerName, $strUsername, $strPassword)
or die("Kan niet verbinden: " . mysql_error());
mysql_select_db($strDbName, $db);

// artikelID in variabele plaatsen voor test

$artID = 1;

?>

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
<form action="test.php" method="post" enctype="multipart/form-data">
<h3>Categorie</h3>
<table class="catoverzicht">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
   $sql
= "SELECT categorieID, naam FROM tblCategorie";
   $resultaat = mysql_query($sql);
   while ($rij = mysql_fetch_array($resultaat))
   {

   ?>

<tr>
<td>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo($rij["naam"]); ?>
</td>
<td><input type="checkbox" name="cat[]" value="
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo($rij["categorieID"]); ?>
"
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
           $sql
= "SELECT categorieID FROM tblCategorieArtikel WHERE artikelID = " . $artID;
        $categorie = mysql_query($sql);
        while($arrayCategorie = mysql_fetch_array($categorie))
        {
                              
            if ($arrayCategorie["categorieID"] = $rij["categorieID"])
            {

                echo("checked=\"checked\"");
            }
        };

        ?>
></td>
</tr>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    }
    ?>

</table>
<input type="submit" name="submit" value="Wijzigen" class="button">
</form>
</body>
</html>
 
PHP hulp

PHP hulp

18/12/2024 23:50:37
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/07/2013 12:32:01
Quote Anchor link
Je kan dit in één query doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
    c.categorieID
    c.naam
    IF(a.categorieID IS NULL, '', ' checked=\"checked\"') AS checked
FROM
    tblCategorie AS c
LEFT JOIN
    tblCategorieArtikel AS a
    ON c.categorieID = a.categorieID AND a.artikelID = 1
Gewijzigd op 21/07/2013 14:49:19 door Ger van Steenderen
 
Karin Gijssen

Karin Gijssen

21/07/2013 12:47:10
Quote Anchor link
Zoals ik zij: ik ben beginnend, dus vergeef me domme vragen ;-)
Deze regel begrijp ik niet: IF(a.categorieID IS NULL, '', ' checked="checked"') AS checked
Ik heb drie tabellen: tblArtikel, tblCategorie en tblCategorieArtikel. CategorieID komt niet voor in de tabel artikel, alleen in de tussentabel. En daar is hij verplicht, dus kan hij nooit NULL zijn.
Kun je het iets uitgebreider uitleggen?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/07/2013 13:53:29
Quote Anchor link
In de tabel zelf is hij geen NULL maar in het resultaat wel, dit komt door de LEFT JOIN.
Met een join voeg je de kolommen uit twee tabellen samen tot één dataset, dus je krijgt dan in totaal de kolommen uit beide tabellen tot je beschikking.
Dus je krijgt dan c.categorieID, c.naam, a.categorieID, a.artikelID
Met een LEFT JOIN worden de rijen uit de tabel voor de categorieën allemaal geselecteerd, en als dan in de koppeltabel een record voorkomt wat voldoet aan de JOIN voorwaarde dan krijgen de kolommen a.* een waarde, zoniet dan blijven ze leeg (NULL). En daar kan je dan op controleren.

Ik doe dat in de query zelf, maar je kan dat natuurlijk ook in PHP doen.

PS
Er valt niks te vergeven ;-), het juist heel slim om uitleg te vragen over iets wat je niet begrijpt.
 
Karin Gijssen

Karin Gijssen

21/07/2013 14:05:39
Quote Anchor link
Dank je Ger, dat van die join snap ik nu. Ik begrijp dan alleen nog niet helemaal waar de c en en a voor staan.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/07/2013 14:12:29
Quote Anchor link
Die c en die a staan voor luiheid ;-)
Dat zijn aliassen voor de tabelnaam, zodat je niet elke keer de kolommen met de volledige tabelnaam hoeft te prefixen, want dat prefixen is wel belangrijk als je met joins werkt.
 
Obelix Idefix

Obelix Idefix

21/07/2013 14:15:27
Quote Anchor link
Op regel 6 en 8 zie je waar hij de c en a aanmaakt.

@Ger: is het luiheid of is het uit oogpunt van efficiency? ;-)
 
Karin Gijssen

Karin Gijssen

21/07/2013 14:19:51
Quote Anchor link
Ok ;-)

Ik heb het in phpMyAdmin uitgeprobeerd. Hij valt over de 'AS' statements. Waar dienen die voor? Want als ik ze weglaat en in de eerste select de primary key van tblCategorieArtikel meeneem, dan krijg ik wat ik wil terug. Ik heb nu dit werkend:

SELECT
tblCategorie.categorieID,
tblCategorie.naam,
tblCategorieArtikel.categorieartikelID

FROM
tblCategorie
LEFT JOIN
tblCategorieArtikel
ON tblCategorie.categorieID = tblCategorieArtikel.categorieID AND tblCategorieArtikel.artikelID = 1
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/07/2013 14:19:54
Quote Anchor link
Laten we het maar efficiënte luiheid noemen ;-)

Toevoeging op 21/07/2013 14:28:15:

Karin, met AS geef je een alias aan een tabelnaam of kolom.
Het zou wel heel vreemd zijn als PMA daar over valt, ik denk dat het meer met ' checked="checked"' te maken heeft. De dubbele quote's geven dat probleem.
 
Karin Gijssen

Karin Gijssen

21/07/2013 14:31:21
Quote Anchor link
Reuze bedankt Ger!! Hier kan ik mee verder (na twee dagen worstelen). De aliassen laat ik misschien nog een voor wat ze zijn. Eerst het maar eens gewoon leren en dan efficiënt/lui worden haha.

Ja hoor...gelukt!! Thanks
Gewijzigd op 21/07/2013 14:36:16 door Karin Gijssen
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

21/07/2013 15:08:47
Quote Anchor link
Graag gedaan!
Enne als je weer eens ergens tegenaan loopt, geen 2 dagen gaan lopen worstelen, 2 uur is lang genoeg en dan gewoon een topic openen ;-)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.