Ga naar inhoud

[php & mysql] loop binnen een loop


anoniem

Aanbevolen berichten

Situatieschets: Ik heb 4 tabellen in m'n mysql db: 1. leverancier 2. bekledingtypen 3. stoelen 4. koppeltabel bekleding_stoelen Nu is het zo, een leverancier heeft een assortiment stoelen en een assortiment bekleding. Voor elke stoel zijn een aantal bekledingstypen mogelijk (maar niet allemaal!). nu wil ik in een cms-je aangeven welke bekleding er nog aan een stoel gekoppeld kan worden. Dus de kleding van dezelfde leverancier als de geselecteerde stoel, maar waar nog geen relatie is aangemaakt in de koppeltabel. Ik wilde dit doen door middel van een for-loop binnen een for-loop: [code:1:1df38551b9] $rs = $myDBC->getData("SELECT bekleding_id,naam FROM bekleding WHERE leverancier_id = '" . $_POST['leverancier'] . "'"); $num = mysql_num_rows($rs); $ss = $myDBC->getData("SELECT * FROM stoel_bekleding WHERE stoel_id = '" . $_POST['stoel'] . "'"); $oum = mysql_num_rows($ss); for($i=0 ; $i < $num ; $i++ ){ $naam = mysql_result($rs, $i, 'naam'); $id = mysql_result($rs, $i, 'bekleding_id'); for ($n=0 ; $n < $oum ; $n++){ $bestaand = mysql_result($ss, $n, 'bekleding_id'); if($id != $bestaand){ echo "<div style=\"float: left;\"><input type='checkbox' value='" . $id . "'> " . $naam . "<br></div>"; } } } [/code:1:1df38551b9] Het is dus de bedoeling dat de bekleding van dezelfde leverancier als de stoel die nog niet is gekoppelt wordt weergegeven met een checkbox. Het lijkt erop dat met het doorlopen van de eerste for-loop de tweede for-loop en if-statement worden genegeerd. Weet iemand wat ik over het hoofd zie?
Link naar reactie
de gebruikelijke procedure is volgens mij mysql_fetch_array/assoc/row te gebruiken op een result en hierop eventueel ifs en dergelijke op los te laten... http://nl.php.net/manual/en/function.mysql-fetch-array.php http://nl.php.net/manual/en/function.mysql-fetch-assoc.php http://nl.php.net/manual/en/function.mysql-fetch-row.php
Link naar reactie
@annie Stoelen heeft een kolom: leverancier_id Bekleding heeft ook een kolom: leverancier_id @de oplossing Nu is het zo dat er meerdere (maar niet allemaal) bekledingtypen mogelijk zijn voor een bepaalde stoel. Deze relaties zijn in de tabel stoel_bekleding opgeslagen. Wat deed ik nu fout? stel resultset 1 was: ( 1 | 2 | 3 | 4 ) dit waren alle bekleding_id's van een bepaalde leverancier, maar ik wil alleen de bekleding_id's die nog niet gekoppeld zijn aan een stoel, maar evt wel gekoppeld kunnen worden. Nu wilde ik op de hierboven beschreven manier middels een loop controleren of "1" voorkwam in resultset 2. stel resultset 2: ( 1 | 4 ). Dus bij controle van 1 krijg ik 1 == 1, dus true die bestaat al, waar ik niet aan had gedacht is dat als ik van resultset 1 ga controleren 2 == 1 false krijg. en 1 uit resultset 2 alsnog ge-echo-ed wordt. Ik heb het nu op een andere manier gedaan,hier de oplossing : mocht er ooit nog iemand op een zelfde probleem stuitten.... [code:1:415a1f99fb] $rs = $myDBC->getData("SELECT bekleding_id, naam FROM bekleding WHERE leverancier_id = " . $_POST['leverancier']); $num = mysql_num_rows($rs); $bekleding = array(); for ($i=0;$i<$num;$i++) { $bekleding[$i] = mysql_result($rs,$i,'bekleding_id'); } $res = $myDBC->getData("SELECT bekleding_id FROM stoel_bekleding WHERE stoel_id = " . $_POST['stoel']); $numr = mysql_num_rows($res); for ($i=0;$i<$num;$i++) { for ($j=0;$j<$numr;$j++) { if ($bekleding[$i] == mysql_result($res,$j,'bekleding_id')) { $bekleding[$i] = ""; } } } for ($i=0;$i<$num;$i++) { if ($bekleding[$i] != "") { echo "<input type='checkbox' name='c" . $i . "'value='" . $bekleding[$i] . "'> " . mysql_result($rs,$i,'naam') . "<br>"; } } [/code:1:415a1f99fb]
Link naar reactie
Zoals gezegd moet het ook mogelijk zijn om het via een outer join in 1 query te doen. Onderstaand wat ideetjes. Onderstaande query geeft alleen de bekledingen (van een leverancier) terug die niet gekoppeld zijn aan de stoel: [code:1:83f31f076a] SELECT b.naam FROM bekledingtypen AS b LEFT JOIN bekleding_stoelen AS k ON (k.bekleding_id = b.bekleding_id AND k.stoel_id = [id stoel]) WHERE b.leverancier_id = [id leverancier] AND k.stoel_id IS NULL; [/code:1:83f31f076a] En als je alle bekledingtypes terug wil krijgen dan kan de je laatste where-clause weglaten (stoel_id is null). Als je in de code controleert op de nullwaarde dan zou je bijvoorbeeld het vinkje bij de checkbox weg kunnen laten bij een nullwaarde (m.a.w. de bekleding kan geselecteerd worden). p.s. Je naamgeving van tabellen/entiteiten is niet consequent (enkel- en meervoud door elkaar). p.s.2. heb even snel getest in Access. Maar het kan zijn dat ik een foutje heb gemaakt in de query, het datamodel en/of de testdata.
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...