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 />";
				}
				
			}
		}
Jan Koehoorn op 21/04/2023 13:17:03

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



Dat is hetzelfde als met een join die ik eerder ga. Maar dan gebruik je hier een subquery.



[size=xsmall]Toevoeging op 21/04/2023 13:32:40:[/size]

Arno van Zanten op 21/04/2023 12:52:44

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



Ja, daarom is het een query met een join (samenvoeging) om gegevens uit 2 tabellen samen te voegen.

Draai die query nu gewoon, dan zie je wat eruit komt.
Je zegt nu in feite: ik snap niet wat er staat, dus dit is niet wat ik nodig heb.

Voor de goede orde: We spreken over twee mogelijkheden

1) De oplossing die ik aandroeg: Met een aparte query alle bestaande, of aan een specifieke gebruiker gekoppelde gekoppelde service ophalen, en die in een array zetten. Waarna je in de while() van het ophalen van je gebruikers met met in_array controleer of het gekoppelde bestaat. Deze is vrij simpel uit te voeren, en ook eenvoudig leesbaar.

2) Ivo's mogelijkheid, waarbij je bij het ophalen van de gebruiker(s) ophaalt meteen in de result van de query een extra virtueel veld wordt toegevoegd waarin staat beschreven of er een koppeling is (not found/found). Zelf vind ik dit ook wel praktisch, maar als je de query uitbreidt met andere JOINS en functies, dan wordt de query voor de niet-doorgewinterde SQL-programmeur lastiger te begrijpen. Maar het kan zeker geen kwaad om te kijken of je soms delen in PHP kan overbrengen naar SQL.

Hallo,

Ja ik ben net weer een beetje wakker, had even een grote pauze ingelast.
Ik lees dit allemaal en ik zal zeker de opties overwegen die hier worden aangedragen.

Alvast bedankt voor de tips

[size=xsmall]Toevoeging op 21/04/2023 18:45:10:[/size]

@Ivo,

Ik heb je inner join gedaan, werkt, maar haalt alleen de records op van de gebruiker en laat verder niks zien.
Of ik doe iets fout ofzo...??

Hij moet eigenlijk uit Services alles halen wat er in staat en vergelijken met wat er in UserServices staat.
VB:
Table : Services <= vaste gegevens en er komt niks bij, kan ook niet toegevoegd worden.
ID : '1', '2', '3', '4'
Services : 'Schep', 'Emmer', 'Drank', 'Eten'

Table : UserService
ID : '1', '2', '3' <= op moment
User_ID : '1', '1', '2'
Services_ID : '1', '2', '1'

Ik hoop dat je nu begrijpt wat ik bedoel? Dus ik zocht naar OUTER JOIN, maar die kreeg ik niet zoals ik wou, kreeg fouten. Ga ik nog eens proberen en zal de errors posten.
Wat ik dus nu heb is dit :


$sql		= '	SELECT Services.Services, Services.Serv_ID, UserServices.Services_ID, UserServices.User_ID
						FROM Services
						INNER JOIN UserServices
						ON Services.ID = UserServices.Services_ID ORDER BY UserServices.ID';
		$result		= mysqli_query($connect, $sql);

		while ($row = mysqli_fetch_object($result)) {
				$schaap = $row->Serv_ID;
				$koe 	= $row->Services_ID;
				$kip	= $row->User_ID;
				$varken = $row->Services;
				echo $schaap." - ";
				echo $koe." - ";
				echo $kip." - ";
				echo $varken."<br />";
		}
Volgens mij bedoel je dat je die query met die IF en de subquery nodig hebt. Dan haal je alle services op, en kijk je bij UserService welke Service' erbij horen.
- Ariën - op 21/04/2023 18:51:25

Volgens mij bedoel je dat je die query met die IF en de subquery nodig hebt. Dan haal je alle services op, en kijk je bij UserService welke Service' erbij horen.


Dit bedoel ik ja, daarom kijk even met OUTER JOIN
Deze error krijg ik met OUTER JOIN

Fatal error: Uncaught mysqli_sql_exception:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN UserServices ON Services.ID = UserServices.ID'
at line 3 in /data/sites/web/[cut out]/www/Users/inc/services.php:22
Stack trace: #0 /data/sites/web/[cut out]/www/Users/inc/services.php(22):
mysqli_query(Object(mysqli), '\tSELECT Service...') #1 /data/sites/web/[cut out]/www/Users/inc/start.php(61):
include('/data/sites/web...') #2 /data/sites/web/[cut out]/www/Users/index.php(24):
include('/data/sites/web...') #3 {main} thrown in /data/sites/web/[cut out]/www/Users/inc/services.php on line 22

En dit is de code ervan

$sql    = 'SELECT Services.ID, UserServices.ID
	  FROM Services
	  FULL OUTER JOIN UserServices ON Services.ID = UserServices.ID;';
$result	= mysqli_query($connect, $sql);
@jan Koehoorn,

Heb het van je gekopieerd, nu moet ik er wel wijs uitkomen.
Ik zal dit eens testen in de MySql database met de sql query functie.

Kun je mij wel even uitleggen hoe dit werkt? en waar je de variable vandaan komen enzo?
Heb het getest in de Mysql database, maar krijg steeds fouten.

jouw code

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