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 />";
				}
				
			}
		}
Wat lukt er niet met die query?
Dit krijg ik als response van de mysql
Daarom dat ik vroeg hoe hij aan die variable komt en hoe het precies werkt.

FOUT

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 LIMIT 0, 25
MySQL meldt: Documentatie

#1146 - Tabel 'sexyde_services.users' bestaat niet

Logischer kan het niet als je leest.
Kan wel zijn,

Maar kan hij aangeven hoe en wat?
Welke tabel eerst en etc.. Ja ik ben van dit script best moe geworden en radeloos.
Ik ben met iets bezig en ik raak de draad een beetje kwijt.
Zoveel adviezen en tips, wel goed bedoeld en ik neem ze ook ten harte, maar ik probeer en probeer, maar het lukt me gewoon niet zoals ik wil.
Wat ik ook doe, While, Foreach of INNER JOIN, niks werkt zoals ik het graag zou willen.
Het erge is, dat ik met dit script nu al 3 dagen bezig ben en nog steeds op null uitkom
Kijk eens naar de EXPLAIN functie van MySQL. Handig voor debuggen.

Misschien is het handig om te focussen op een simpele testomgeving met logische tabel- en veldnamen. En daar JOIN's te verkennen.

Laat eens een structuur dump vanuit phpMyAdmin (Exporteer) zien van je database.?
Om te testen heb ik deze structuur gebruikt en de tabellen met wat dummy-records gevuld:


-- Create syntax for TABLE 'services'
CREATE TABLE `services` (
  `service_id` int unsigned NOT NULL AUTO_INCREMENT,
  `service` char(64) DEFAULT NULL,
  PRIMARY KEY (`service_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- Create syntax for TABLE 'users'
CREATE TABLE `users` (
  `user_id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` char(32) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- Create syntax for TABLE 'users_services'
CREATE TABLE `users_services` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL,
  `service_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Ik ga eens kijken hoe dit werkt.

[size=xsmall]Toevoeging op 22/04/2023 00:27:54:[/size]

Deze query werkt hier prima:


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 LIMIT 0, 25




Is dit resultaat wat je wilt, Arno?
Yes, dat is perfect
---------------------------------------------
Myu Sql Dump, wel hier en daar aangepast wegens privacy redenen.


CREATE TABLE `Girls` (
  `ID` int(100) NOT NULL,
  `Nickname` varchar(100) NOT NULL,
  `Fname` varchar(100) NOT NULL,
  `Lname` varchar(100) NOT NULL,
  `IDcard` varchar(100) NOT NULL,
  `Birthday` date NOT NULL,
  `Wphone` varchar(20) NOT NULL,
  `Pphone` varchar(20) NOT NULL,
  `Nationality` varchar(50) NOT NULL,
  `ICEName1` varchar(100) NOT NULL,
  `ICePhone1` varchar(20) NOT NULL,
  `ICEName2` varchar(100) NOT NULL,
  `ICEPhone2` varchar(20) NOT NULL,
  `Password` varchar(50) NOT NULL,
  `keycode` int(10) NOT NULL,
  `Address` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

CREATE TABLE `Services` (
  `ID` int(11) NOT NULL,
  `Services` varchar(50) NOT NULL,
  `Serv_ID` int(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `Services` (`ID`, `Services`, `Serv_ID`) VALUES
(1, 'Emmer', 1),
(2, 'Schep', 2),
(3, 'Eten', 3),
(4, 'Drank', 4);

-- --------------------------------------------------------

CREATE TABLE `UserServices` (
  `ID` int(11) NOT NULL,
  `User_ID` int(11) NOT NULL,
  `Services_ID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `UserServices` (`ID`, `User_ID`, `Services_ID`) VALUES
(1, 3, 2),
(2, 3, 3),
(3, 4, 2);


ALTER TABLE `Girls`
  ADD PRIMARY KEY (`ID`);

ALTER TABLE `Services`
  ADD PRIMARY KEY (`ID`);

ALTER TABLE `UserServices`
  ADD PRIMARY KEY (`ID`);

ALTER TABLE `Girls`
  MODIFY `ID` int(100) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

ALTER TABLE `Services`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

ALTER TABLE `UserServices`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
COMMIT;


[size=xsmall]Toevoeging op 22/04/2023 07:14:47:[/size]

Na uren en dagen bezig geweest te zijn en proberen en uitzoeken, nog steeds op het zelfde resultaat gebleven.
1. Wat heb ik nu gedaan?
2. Wat heb ik geprobeerd?
3. Wat geeft de output weer?

1. Heb geprobeerd de unique waardes eruit te filteren, maar ook dit lukt niet
2. Heb alles naar een array gedaan en deze dus via array_unique proberen te filteren, maar tja... nog steeds niks.
3. de output doet nog steeds als vanouds en dus dubbele weergavens.

De output :

User_A - 1 - Emmer <= NOT Selected
User_A - 1 - Emmer <= NOT Selected
User_A - 2 - Schep <= Selected
User_A - 2 - Schep <= NOT Selected
User_A - 3 - Drank <= NOT Selected
User_A - 3 - Drank <= Selected
User_A - 4 - Eten <= NOT Selected
User_A - 4 - Eten <= NOT Selected

Zoals je ziet, krijg ik dubbelen variabelen terug en ik wil per services maar 1 zien.
De output zou er zo uit moeten zien.

User_A - 1 - Emmer <= NOT Selected
User_A - 2 - Schep <= Selected
User_A - 3 - Drank <= Selected
User_A - 4 - Eten <= NOT Selected

Nu vraag ik me zelf af hoe kan ik dit voor elkaar krijgen?
Mijn code kan ik her en der aanpassen en werkend krijgen, maar het resultaat blijft het zelfde.
Nieuwe code, maar resultaat blijft het zelfde

<?php
                $sql = 'SELECT Girls.Nickname,	UserServices.User_ID, serServices.Services_ID,	Services.ID, Services.Services
		FROM Girls, UserServices, Services 
                WHERE Girls.ID = '.$_SESSION['ID'].' AND UserServices.User_ID = '.$_SESSION['ID'].'';
		$result		= mysqli_query($connect, $sql);
		$data 		= mysqli_fetch_all($result, MYSQLI_ASSOC);
		
		foreach($data as $row) {
			$konijn = $row['ID'];
			$schaap = $row['Nickname'];
			$varken = $row['Services'];
			$gans	= $row['Services_ID'];
			$kuiken	= $row['User_ID'];
		
			$boer = array($konijn, $schaap, $varken, $gans, $kuiken);
			$boer_1 = array($konijn, $varken);
			$stier = array_unique($boer);
			foreach ($stier as $kalf) {
				
				if($kalf == $konijn && $kalf == $gans) {
					echo "<font color='#00FF00' size='2px'><b>".$schaap." - ".$konijn." - ".$varken." <= Selected</b></font><br />";
				}elseif($kalf == $gans) {
					echo "<font color='#FF0000' size='2px'><b>".$schaap." - ".$konijn." - ".$varken." <= NOT Selected</b></font><br />";
				}
			}
		}
?>

Nu vraag ik toch hulp en advies, want ik probeer alles en nog krijg ik niet wat ik wil.
Je maakt het niet duidelijker met je hele boerderij aan variabelen? Wat is de reden dat je je vaste variabelen opnieuw gaat benoemen in opmerkelijke namen?
Ik was even op aan benamingen, dus ging ik de boederij maar leeg roven aan namen ;)
Maar dat maakt even niet uit, het gaat om de werking.
Zoals je ziet in mijn post, de output blijft steeds het zelfde.
Ik krijg maar niet wat ik wil, wat ik ook probeer.

Reageren