Nu echt hulp nodig

Overzicht

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Arno van Zanten

Arno van Zanten

21/04/2023 06:34:13
Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
// 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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    // 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 hulp

PHP hulp

19/04/2024 07:06:44
 
Jan Koehoorn

Jan Koehoorn

21/04/2023 09:30:04
Anchor link
Het kan zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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
Gewijzigd op 21/04/2023 09:30:37 door Jan Koehoorn
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 09:33:35
Anchor link
Ik ben benieuwd waarom je een foreach() en mysqli_fetch_all() gebruikt i.p.v..een gebruikelijke mysqli_fetch_assoc().

Een loop voor expliciet één user is onnodig.
Gewijzigd op 21/04/2023 09:37:36 door - Ariën -
 
Arno van Zanten

Arno van Zanten

21/04/2023 09:36:56
Anchor link
** quote knip **

Okay, dit ga ik zeker nog ten harte uitzoeken en proberen.
kom er zeker nog eens op terug.

Toevoeging op 21/04/2023 09:37:34:

Jan Koehoorn op 21/04/2023 09:30:04:
Het kan zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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.
Gewijzigd op 21/04/2023 17:35:08 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 09:39:34
Anchor link
Elke tutorial beschrijft mysqli_fetch_assoc() en de werking van while, dus ik ben benieuwd waar je jouw opmerkelijke constructie vandaan hebt.
 
Arno van Zanten

Arno van Zanten

21/04/2023 09:46:27
Anchor link
** quote knip **

Ik werk met oude scripts waar ik de codes uitsloop, maar dit is de eerste keer dat ik een vergelijking doe.
Gewijzigd op 21/04/2023 17:35:21 door - Ariën -
 
Adoptive Solution

Adoptive Solution

21/04/2023 09:47:32
Anchor link
Demo

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
// dit komt oorspronkelijk uit database
// de namen zijn in deze array uniek gemaakt
// anders werkt het niet

$all = [
    'Services_ID1' => '1',
    'Services_ID3' => '3'
];
echo '<pre>' . print_r( $all, TRUE ) . '</pre>';

$Serving = [
    "1"=>"Zonnebril",
    "2"=>"Emmer",
    "3"=>"Schep",
    "4"=>"Drank"
    ];
echo '<pre>' . print_r( $Serving, TRUE ) . '</pre>';

$found = [];

foreach( $all as $id => $compare ):
    $found[$id] = $Serving[$compare] . ' gevonden (to find, found, found)'; // " <= WAS FOUND<br />";
endforeach;

echo '<pre>' . print_r( $found, TRUE ) . '</pre>';

?>
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 09:51:32
Anchor link
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.
 
Arno van Zanten

Arno van Zanten

21/04/2023 10:05:04
Anchor link
Jan Koehoorn op 21/04/2023 09:30:04:
Het kan zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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.
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 10:27:45
Anchor link
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.
Gewijzigd op 21/04/2023 10:31:46 door - Ariën -
 
Ivo P

Ivo P

21/04/2023 10:48:32
Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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
 
Arno van Zanten

Arno van Zanten

21/04/2023 11:24:55
Anchor link
Okay Ivo, dat van jouw kijk ook even na, maar heb nu even dit gedaan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $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.
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 11:39:28
Anchor link
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.
Gewijzigd op 21/04/2023 11:41:13 door - Ariën -
 
Arno van Zanten

Arno van Zanten

21/04/2023 11:49:11
Anchor link
** 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.

Toevoeging op 21/04/2023 11:53:04:

Arno van Zanten op 21/04/2023 11:49:11:
- 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.


PS: er zijn maar 4 services waar ze uit kunnen kiezen, meer komen er niet bij.
Gewijzigd op 21/04/2023 17:34:33 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 12:12:30
Anchor link
Zeg nooit 'nooit'.

Met in_array kan je de genestelde while besparen .

PS: Gelieve niet steeds het direct voorgaande bericht te quoten. ;-)
Gewijzigd op 21/04/2023 12:13:55 door - Ariën -
 
Arno van Zanten

Arno van Zanten

21/04/2023 12:13:07
Anchor link
Sorry, was niet de bedoeling
 
Ivo P

Ivo P

21/04/2023 12:15:30
Anchor link
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.
 
Arno van Zanten

Arno van Zanten

21/04/2023 12:52:44
Anchor link
** 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
Gewijzigd op 21/04/2023 17:34:50 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 13:00:36
Anchor link
Dan zet je die gekoppelde services eerst in een array die je genereert via een while-loop.
 
Arno van Zanten

Arno van Zanten

21/04/2023 13:01:46
Anchor link
@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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 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 />";}
            }
Gewijzigd op 21/04/2023 13:03:06 door Arno van Zanten
 
Jan Koehoorn

Jan Koehoorn

21/04/2023 13:17:03
Anchor link
Ervan uitgaande dat je een tabel users, een tabel services, en een koppeltabel users_services hebt, kun je ook nog dit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
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
 

Pagina: 1 2 3 volgende »

 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.