Hallo,

Ik ben de hele tijd aan het puzzelen met een script en ik krijg hem niet volledig aan de praat.
Hij doet voor 50% wat het moet doen en ik heb nog niet geslapen en ik ben echt alles aan het afzoeken op internet en via youtube en andere kanalen, maar kan niet vinden wat ik zoek of ik zoek verkeerd.
Ik heb alle tips en adviezen van jullie zeker op een blaadje staan en ik ga die ook zeker gebruiken, maar nu is de site niet actief voor de end user.
Dus ik kan er nog mee doen wat ik wil.
Waar het mij nu om gaat is als volgt.

Wat moet het script doen?
Kijk in de UserServices tabel welke Services_ID staat en vergelijk die met een fixed array.
Komt dit overeen, zet dan gekozen er achter, zo niet, laat dan leeg.
Nu vergelijkt hij wel, maar als een user 2 of meer gekozen heeft, dan krijg je dus 2x of 3x de output te zien.
De fixed array heeft 4 opties zeg maar en daar moet hij dus mee vergelijken.

// Fixed array //
$Serving = array("1"=>"Zonnebril", "2"=>"Emmer", "3"=>"Schep", "4"=>"Drank");

nu heeft de gebruiker 2 opties gekozen, wat doet mijn script zover dan?
Voorbeeld :
Zonnebril : [leeg]
Emmer : Gekozen
Schep : [Leeg]
Drank : [Leeg]

Zonnebril : [leeg]
Emmer : [Leeg]
Schep : Gekozen
Drank : [Leeg]

Hij gaat dus 2x de loop doen, wat ik niet wil.
Hoe kan ik dat doen?
Hier de rest van het script en ik vraag niet om hem aan te passen, maar om mee te kijken en misschien dat je een tip hebt of een oplossing voor mijn probleem.

	// Database where users has their selected services //
		$sql = 'SELECT * FROM UserServices WHERE User_ID = '.$_SESSION['ID'].'';
		$result = mysqli_query($connect, $sql);
		$all = mysqli_fetch_all($result, MYSQLI_ASSOC);
		$base = array($all);
        // Fixed array //
                $Serving = array("1"=>"Zonnebril", "2"=>"Emmer", "3"=>"Schep", "4"=>"Drank");
	// print fixed array and compare with user selection //
	// if user selection is the same as the ficed array, set selection on yes //
	// if not, than set selection on no //
		
		echo "<br />";
		foreach($Serving as $num => $selected) {
			foreach($all as $compare){
								
				if($num == $compare['Services_ID']) {
					echo $selected." <= WAS FOUNDED<br />";
				} else {
					echo $selected." <= NOT FOUND <br />";
				}
				
			}
		}
Okay Ivo, dat van jouw kijk ook even na, maar heb nu even dit gedaan.

		$sql     = 'SELECT * FROM UserServices WHERE User_ID = ' . $_SESSION['ID'] . '';
		$result  = mysqli_query($connect, $sql);

		$sql2     = 'SELECT * FROM Services';
		$result2  = mysqli_query($connect, $sql2);

		while ($row = mysqli_fetch_object($result)) {
			while ($row2 = mysqli_fetch_object($result2)) {
				$koe = $row->Services_ID;
				$schaap = $row2->ID;
				if($koe == $schaap){
					echo "Gevonden<br />";
				}else{
					echo "Niet gevonden<br />";
				}
			}
		}
	}

Echter zet hij bij 1 "Gevonden" neer, maar er zijn 2 records waar hij dat neer moet zetten.
echter doet hij de loop maar 1 keer, wel goed en ik zie ook 4 results, maar waar hij "Gevonden" moet neer zetten, doet ie maar bij 1.
terijl hij er 2 neer moet zetten.
Je moet vóórdat je jouw User ophaalt, via een aparte query fetch_assoc() en een while() een nieuwe array samenstellen met alle services.

En dan voor je Users één andere while loop, en daarin kan je met in_array controleren of de service bestaat. Want als je meerdere loops in elkaar gaat nestelen, maak je alles uiteindelijk ontzettend traag, en onoverzichtelijk.

Ook zou het vreselijk inefficiënt zijn als je straks 1000 servies zou hebben die je per stuk zou doorlopen.

Dus:
1 query voor de services die je ophaalt
1 aparte query voor de gebruiker

En niet nestelen.
** quote knip **

Okay, dit begrijp ik nog wel.
Maar hij moet de services van gebruiker vergelijken, heeft ie hem gekozen of niet?
Services_tbl
ID | Services
1 = Schep
2 = Emmer
3 = Eten
4 = Drank
UserServices_tbl
ID | User_ID | Services_ID <= deze correspondeert met de Services_tbl met de ID
1 | 2 | 3
2 | 2 | 4
3 | 3 | 2
Voorbeeld natuurlijk, maar dan moet hij kijken welke Services_ID met de ID correspondeert.
Dat is waarom ik dus 2 whiles in elkaar heb.

[size=xsmall]Toevoeging op 21/04/2023 11:53:04:[/size]

Arno van Zanten op 21/04/2023 11:49:11

[quote="- Ariën - op 21/04/2023 11:39:28"]
Je moet vóórdat je jouw User ophaalt, via een aparte query fetch_assoc() en een while() een nieuwe array samenstellen met alle services.

En dan voor je Users één andere while loop, en daarin kan je met in_array controleren of de service bestaat. Want als je meerdere loops in elkaar gaat nestelen, maak je alles uiteindelijk ontzettend traag, en onoverzichtelijk.

Ook zou het vreselijk inefficiënt zijn als je straks 1000 servies zou hebben die je per stuk zou doorlopen.

Dus:
1 query voor de services die je ophaalt
1 aparte query voor de gebruiker

En niet nestelen.


Okay, dit begrijp ik nog wel.
Maar hij moet de services van gebruiker vergelijken, heeft ie hem gekozen of niet?
Services_tbl
ID | Services
1 = Schep
2 = Emmer
3 = Eten
4 = Drank
UserServices_tbl
ID | User_ID | Services_ID <= deze correspondeert met de Services_tbl met de ID
1 | 2 | 3
2 | 2 | 4
3 | 3 | 2
Voorbeeld natuurlijk, maar dan moet hij kijken welke Services_ID met de ID correspondeert.
Dat is waarom ik dus 2 whiles in elkaar heb.
[/quote]

PS: er zijn maar 4 services waar ze uit kunnen kiezen, meer komen er niet bij.

Zeg nooit 'nooit'.

Met in_array kan je de genestelde while besparen .

PS: Gelieve niet steeds het direct voorgaande bericht te quoten. ;-)
heb je het nu al eens met één query geprobeerd (in phpmyadmin).

Je loopt zo vaak rond dat je compleet de weg kwijt raakt.
Helaas ben je ook niet echt in staat om terug het box uit te gaan om te kijken of er niet een groot pad dwars door het bos naar de andere kant liep.
** quote knip **

Ja ivo, maar ik moet uit 2 tabellen records halen.
De ene geeft Services_ID en de andere de ID, deze staan gelijk met elkaar of niet.
Ligt er wel aan als de gebruiker het geselecteerd heeft of niet
Dan zet je die gekoppelde services eerst in een array die je genereert via een while-loop.
@arien, dat ben ik de hele tijd aan het zoeken en het proberen, maar weet niet hoe

Ik heb nu dit, maar hij pakt alleen de laatste record van de gebruiker op waar hij dus Ja achter zet.

// Database where users has their selected services //
		$sql     = 'SELECT * FROM UserServices WHERE User_ID = ' . $_SESSION['ID'] . '';
		$result  = mysqli_query($connect, $sql);

		$sql2     = 'SELECT * FROM Services';
		$result2  = mysqli_query($connect, $sql2);

		
			while ($row = mysqli_fetch_object($result)) {
				$schaap = $row->Services_ID;
				echo $schaap."<br />";
			}
			while ($row2 = mysqli_fetch_object($result2)) {
				$koe = $row2->ID;
				$kip = $row2->Services;
				echo $koe." - ".$kip;
				if ($koe == $schaap) { echo " <= Ja <br />"; } else {echo " <= Nee <br />";}
			}
Ervan uitgaande dat je een tabel users, een tabel services, en een koppeltabel users_services hebt, kun je ook nog dit doen:

SELECT
    u.username,
    s.service,
    IF(
        (SELECT id FROM users_services WHERE user_id = u.user_id AND service_id = s.service_id LIMIT 1) IS NULL,
        'not found',
        'found'
    ) result
FROM users u, services s

Reageren