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:

<?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">
<?php
$sql = "SELECT categorieID, naam FROM tblCategorie";
$resultaat = mysql_query($sql);
while ($rij = mysql_fetch_array($resultaat))
{
?>
<tr>
<td><?php echo($rij["naam"]); ?></td>
<td><input type="checkbox" name="cat[]" value="<?php echo($rij["categorieID"]); ?>" <?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>
<?php
}
?>
</table>
<input type="submit" name="submit" value="Wijzigen" class="button">
</form>
</body>
</html>
Je kan dit in één query doen:

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
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?

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.
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.
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.
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? ;-)
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

Laten we het maar efficiënte luiheid noemen ;-)

[size=xsmall]Toevoeging op 21/07/2013 14:28:15:[/size]

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.
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
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 ;-)

Reageren