Geneste SELECT met een IF
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
?>
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)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql = "SELECT categorieID, naam FROM tblCategorie";
$resultaat = mysql_query($sql);
while ($rij = mysql_fetch_array($resultaat))
{
?>
$sql = "SELECT categorieID, naam FROM tblCategorie";
$resultaat = mysql_query($sql);
while ($rij = mysql_fetch_array($resultaat))
{
?>
<tr>
<td></td>
<td><input type="checkbox" name="cat[]" value=""
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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\"");
}
};
?>
$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\"");
}
};
?>
</tr>
</table>
<input type="submit" name="submit" value="Wijzigen" class="button">
</form>
</body>
</html>
Code (php)
1
2
3
4
5
6
7
8
9
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
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
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?
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.
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.
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.
@Ger: is het luiheid of is het uit oogpunt van efficiency? ;-)
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
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.
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 ;-)