Nu echt hulp nodig

Overzicht

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

- Ariën  -
Beheerder

- Ariën -

21/04/2023 13:18:35
Anchor link
Arno van Zanten op 21/04/2023 13:01:46:
@arien, dat ben ik de hele tijd aan het zoeken en het proberen, maar weet niet hoe


https://stackoverflow.com/questions/9105419/generate-array-from-php-while-loop
 
PHP hulp

PHP hulp

16/05/2024 23:46:41
 
Ivo P

Ivo P

21/04/2023 13:30:17
Anchor link
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:
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


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



Toevoeging op 21/04/2023 13:32:40:

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.
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 16:16:30
Anchor link
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.
Gewijzigd op 21/04/2023 16:16:54 door - Ariën -
 
Arno van Zanten

Arno van Zanten

21/04/2023 17:36:12
Anchor link
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

Toevoeging op 21/04/2023 18:45:10:

@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 :

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
$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 />";
        }
Gewijzigd op 21/04/2023 18:46:37 door Arno van Zanten
 
- Ariën  -
Beheerder

- Ariën -

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

Arno van Zanten

21/04/2023 18:56:28
Anchor link
- 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
 
Jan Koehoorn

Jan Koehoorn

21/04/2023 19:01:54
Anchor link
Afbeelding
Gewijzigd op 21/04/2023 23:35:16 door - Ariën -
 
Arno van Zanten

Arno van Zanten

21/04/2023 19:04:17
Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$sql    = 'SELECT Services.ID, UserServices.ID
      FROM Services
      FULL OUTER JOIN UserServices ON Services.ID = UserServices.ID;';
$result    = mysqli_query($connect, $sql);
 
Adoptive Solution

Adoptive Solution

21/04/2023 20:37:52
Anchor link
Full outer join bestaat niet in mysql.

Oplossing (UNION) staat hier :

https://stackoverflow.com/questions/4796872/how-can-i-do-a-full-outer-join-in-mysql
 
Arno van Zanten

Arno van Zanten

21/04/2023 20:41:13
Anchor link
@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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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
Gewijzigd op 21/04/2023 20:48:31 door Arno van Zanten
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 20:52:26
Anchor link
Wat lukt er niet met die query?
 
Arno van Zanten

Arno van Zanten

21/04/2023 20:57:09
Anchor link
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
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 20:59:16
Anchor link
Logischer kan het niet als je leest.
 
Arno van Zanten

Arno van Zanten

21/04/2023 21:03:55
Anchor link
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
 
- Ariën  -
Beheerder

- Ariën -

21/04/2023 21:05:54
Anchor link
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.?
Gewijzigd op 21/04/2023 21:19:33 door - Ariën -
 
Jan Koehoorn

Jan Koehoorn

21/04/2023 21:21:37
Anchor link
Om te testen heb ik deze structuur gebruikt en de tabellen met wat dummy-records gevuld:

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
-- 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;
 
- Ariën  -
Beheerder

- Ariën -

22/04/2023 00:11:29
Anchor link
Ik ga eens kijken hoe dit werkt.

Toevoeging op 22/04/2023 00:27:54:

Deze query werkt hier prima:

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


Afbeelding

Is dit resultaat wat je wilt, Arno?
Gewijzigd op 22/04/2023 00:28:42 door - Ariën -
 
Arno van Zanten

Arno van Zanten

22/04/2023 04:04:03
Anchor link
Yes, dat is perfect
---------------------------------------------
Myu Sql Dump, wel hier en daar aangepast wegens privacy redenen.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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;


Toevoeging op 22/04/2023 07:14:47:

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 :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
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
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
                $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.
Gewijzigd op 22/04/2023 07:17:10 door Arno van Zanten
 
- Ariën  -
Beheerder

- Ariën -

22/04/2023 09:41:47
Anchor link
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?
Gewijzigd op 22/04/2023 09:44:28 door - Ariën -
 
Arno van Zanten

Arno van Zanten

22/04/2023 09:47:26
Anchor link
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.
 

Pagina: « vorige 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.