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.
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 />";
}
}
}
<?php
// 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 = [$all];
$Serving = [
1 => 'Drank',
2 => 'Emmer',
3 => 'Schep',
4 => 'Zonnebril',
];
// 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 //
foreach ($all as $row) {
echo $Serving[$row['Services_ID']] . ' was selected';
}
?>
(uit het hoofd, niet gecheckt)
Ik raad wel aan om geen arrays met harde waarden in je PHP te gebruiken. Het is veel beter om een tweede tabel met "servings" te hebben en dan een JOIN in je query te gebruiken op basis van dat Services_ID.
Algemene tip 1: je gebruikt hoofd- en kleine letters nogal willekeurig door elkaar. Probeer een vast systeem the hanteren, of dat nu camelCase, Pascal Case, snake_case of kebab-case is (dat hangt ook een beetje van de taal af die je gebruikt en wat daar toegestaan is)
Algemene tip 2: naamgeving. Je hebt nu servings en service_id. Ik zou verwachten: services | service_id, of servings | serving_id
Okay, dit ga ik zeker nog ten harte uitzoeken en proberen.
kom er zeker nog eens op terug.
[size=xsmall]Toevoeging op 21/04/2023 09:37:34:[/size]
Jan Koehoorn op 21/04/2023 09:30:04
Het kan zo:
<?php
// 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 = [$all];
$Serving = [
1 => 'Drank',
2 => 'Emmer',
3 => 'Schep',
4 => 'Zonnebril',
];
// 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 //
foreach ($all as $row) {
echo $Serving[$row['Services_ID']] . ' was selected';
}
?>
(uit het hoofd, niet gecheckt)
Ik raad wel aan om geen arrays met harde waarden in je PHP te gebruiken. Het is veel beter om een tweede tabel met "servings" te hebben en dan een JOIN in je query te gebruiken op basis van dat Services_ID.
Algemene tip 1: je gebruikt hoofd- en kleine letters nogal willekeurig door elkaar. Probeer een vast systeem the hanteren, of dat nu camelCase, Pascal Case, snake_case of kebab-case is (dat hangt ook een beetje van de taal af die je gebruikt en wat daar toegestaan is)
Algemene tip 2: naamgeving. Je hebt nu servings en service_id. Ik zou verwachten: services | service_id, of servings | serving_id
Ik zal dit eens checken, in ieder geval dank voor de hulp alvast.
Oude scripts, die moet je negeren. Ik denk dat je hiermee al een foute afslag heb gemaakt, waardoor je met 20 jaar oude constructies staat te klieren, en dus inefficiënt programmeert.
Misschien dat je een flink poosje uit running bent geweest met het programmeren in PHP? Dan lijkt een 'full reset' beter door vanaf het begin te beginnen met een verse tutorial.
<?php
// 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 = [$all];
$Serving = [
1 => 'Drank',
2 => 'Emmer',
3 => 'Schep',
4 => 'Zonnebril',
];
// 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 //
foreach ($all as $row) {
echo $Serving[$row['Services_ID']] . ' was selected';
}
?>
(uit het hoofd, niet gecheckt)
Ik raad wel aan om geen arrays met harde waarden in je PHP te gebruiken. Het is veel beter om een tweede tabel met "servings" te hebben en dan een JOIN in je query te gebruiken op basis van dat Services_ID.
Algemene tip 1: je gebruikt hoofd- en kleine letters nogal willekeurig door elkaar. Probeer een vast systeem the hanteren, of dat nu camelCase, Pascal Case, snake_case of kebab-case is (dat hangt ook een beetje van de taal af die je gebruikt en wat daar toegestaan is)
Algemene tip 2: naamgeving. Je hebt nu servings en service_id. Ik zou verwachten: services | service_id, of servings | serving_id
Okay, heb het getest en het werkt idd beter dan het van mij.
Echter en hier komt de clou, had ik ook vermeld in de post hier boven (denk ik)
Zo moet het eruit zien in de output :
Drank : niet geselecteerd
Emmer : wel geselecteerd
Schep : wel geselecteerd
Zonnebril : niet geselecteerd
Jouw script doet dit :
Emmer : wel geselecteerd
Schep : wel geselecteerd
Is goed, maar ik wil de andere 2 ook zien.
Waarom denk je nu?
Het is nu nog een ruwe versie, maar dit moet dadelijk met checkboxen gedaan worden, zodat de user ten allertijden iets kan aanzetten of uitzetten.
Mijn script dit wel alles laten zien, maar liet bij de user die 2 opties had aanstaan, dus ook alles dubbel zien.
User met 3 opties, dus 3x alles laten zien.
Maar ik ben ook nog aan het sleutelen, maar met jouw script kom ik al een heel eind op weg.
Dank je alvast voor de moeite en ik zal er vast en zeker uitkomen.
Als ik een goed stappenplan mag geven waarmee je de data uit een database haalt, dan is dit zeer robuust:
- Bepaal zelf eerst of je expliciet één item op wilt halen met een SELECT-query, of meerdere items.
- Als je één item ophaalt via de url met GET, gebruik eerst een isset() om te controleren of die waarde ook is ingevuld.
- Voer je mysqli_query() uit, gebruik mysqli_error(..) om errors te kunnen tonen.
- Contoleer of er records zijn. Dit kan met mysqli_num_rows(). Als je expliciet één record verwacht, vergelijk dit aantal dan met één. Verwacht je meer records, dan kijk je of het aantal groter is dan 0. Bij een else statement hiervan vermeld je de melding dat 'er geen records zijn gevonden'
- Nu gaan we wat met de data doen: Gebruik een $data = mysqli_fetch_assoc(..); om de data te kunnen verwerken als je expliciet één record verwacht. Verwacht je meerdere records, dan moet je dit verpakken in een while:
while($data = mysqli_fetch_assoc(...)) {
// hier lees je stuk voor stuk alle records uit.
}
Als je alles goed hebt gedaan, sluit je het script af met else-statements waar je vertelt dat er het record niet bestaat, en daarna eventueel de melding dat er geen waarde is ingevuld.
Probeer dit eens te vertalen in een concept-scriptje. :-)
En het koppelen van records met producten uit een andere tabel, zoals je doet. Daar zijn twee mogelijkheden voor:
- Of je gebruikt een JOIN in je query.
- Of je haalt ze apart op uit de database met als voorwaarde dat ze voor enkel die een user gelden, en zet ze in een array om zo te vergelijken. in_array() kan hierbij prima helpen.
Nu hebben we gisteren dit onderwerp ook al langs zien komen.
Toen kwam de lijst met Services nog uit de database.
Dat je die lijst nu in een hardcoded array zet, maakt misschien je script overzichtelijk voor jouw benadering, maar maakt het weer moeilijker omdat je nu een niet sorteerbaar array hebt waar je stuk voor stuk moet vergelijken.
Je wilt alle services hebben
SELECT * FROM Services -- WHERE x = y ORDER BY z
En je wilt weten of deze user gekozen heeft:
SELECT s.*, us.User_ID IS NOT NULL AS gekozen
FROM Services
LEFT JOIN UserServices us ON us.Services_ID = s.ID AND us.User_ID = ' . $_SESSION['ID']
En dan loop je door de resultaten, met mysql_fetch_assoc zoals Ariën aangeeft.
En hij is gekozen als $row['gekozen'] == 1