Hoe krijg ik een INNER JOIN echo correct op de pagina

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Christian Snijders

Christian Snijders

01/07/2020 21:05:40
Quote Anchor link
Onderstaande code ben ik al een behoorlijk tijdje aan het bekijken.
Beide tabellen hebben een veld genaamd "id", maar nu wil ik dus van beide velden het id op de pagina laten tonen.

Welke manier kan ik het beste uitvoeren zonder dat ik de tabel aan moet passen?

P.s.: niet te vergeten dat ik heel veel zal moeten leren betreft MySQL querys.

Alvast bedankt!
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
<?php

$dataquery
= mysqli_query($connect_mysql, "SELECT * FROM `users` INNER JOIN `user_settings` as us ON (users.id = us.user_id) WHERE `setting_id` = 'PROFPIC' ORDER BY users.id desc");
while($data = mysqli_fetch_array($dataquery))
{

// hier wil ik dus de info van user_settings -> id zien
// De query is nu natuurlijk niet correct.
// dit is sowieso niet goed:

$prof = $data['us.id'];
// Deze wordt ook niet geaccepteerd
$prof =  $data->us->id;
print $prof;
}


?>
 
PHP hulp

PHP hulp

19/03/2024 09:14:41
 
- Ariën  -
Beheerder

- Ariën -

01/07/2020 21:09:11
Quote Anchor link
Noem alle velden los in de SELECT, en gebruik geen *

Een aantal enters in je query maakt het geheel ook een stuk overzichtelijker.
Gewijzigd op 01/07/2020 21:10:03 door - Ariën -
 
Christian Snijders

Christian Snijders

01/07/2020 21:12:42
Quote Anchor link
- Ariën - op 01/07/2020 21:09:11:
...


Dus als ik het goed begrijp is het bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT `id`, `naam`, `achternaam` FROM `users` INNER JOIN `user_settings` ON (users.id = user_settings.user_id)

Maar hoe krijg ik dan van de user_settings de id te pakken?
 
- Ariën  -
Beheerder

- Ariën -

01/07/2020 21:14:16
Quote Anchor link
user_settings.id in je SELECT.
 
Christian Snijders

Christian Snijders

01/07/2020 21:16:44
Quote Anchor link
- Ariën - op 01/07/2020 21:14:16:
..


Dus als ik het goed begrijp is het dan zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT `users.id`, `user_settings.id`, `naam`, `achternaam` FROM `users` INNER JOIN `user_settings` ON (users.id = user_settings.user_id)

print $data['id'] <- als ik daar de user settings id of de users id wil tonen, wat moet ik er dan aan aanpassen?
 
- Ariën  -
Beheerder

- Ariën -

01/07/2020 21:28:23
Quote Anchor link
Dan kan je beter een AS alias gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT user_settings.id AS settingID, bla, blah....
 
Christian Snijders

Christian Snijders

01/07/2020 21:37:43
Quote Anchor link
Thanks Ariën,

Dan ga ik morgen even kijken of het middels de alias werkt :-)
 
- Ariën  -
Beheerder

- Ariën -

01/07/2020 23:24:40
Quote Anchor link
Nog mooier is een alias koppelen aan een tabelnaam:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT us.id AS settingID, bla, blah....
FROM users u
INNER JOIN user_settings us ON (users.id = user_settings.user_id)


Scheelt je een hoop lange tabelnamen als je je lange tabelnamen hebt.
 
Christian Snijders

Christian Snijders

03/07/2020 20:21:54
Quote Anchor link
- Ariën - op 01/07/2020 23:24:40:
..


Ik krijg de volgende error:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in public_html/4-newsite/includes/newestusers.php on line 23


dit is hetgene wat ik hem uit laat voeren:

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
$dataquery = mysqli_query($connect_mysql, "
    SELECT

        users.id AS 'uid',
        users.voornaam AS 'uv',
        users.achternaam AS 'ua',  
        users.username AS 'uname',
        us.value AS 'picture',
        st.value AS 'top'
    FROM `users`
        INNER JOIN

            `user_settings` as us ON (users.id = us.user_id) WHERE `setting_id` = 'PROFPIC'
        INNER JOIN

            `user_settings` as st ON (users.id = st.user_id) WHERE `setting_id` = 'PROFPIC_TOP'
        ORDER BY users.id desc");


Vraag me af wat ik hier fout doe, als ik één INNER JOIN verwijder doet hij het wel.

Toevoeging op 03/07/2020 20:34:37:

Heb hem inmiddels gevonden, in plaats van WHERE moest ik AND gebruiken en ik moest st.setting_id gebruiken.
 
- Ariën  -
Beheerder

- Ariën -

03/07/2020 21:15:40
Quote Anchor link
Als je die bovenste foutmelding ziet, dat betekent dat in feite dat je geen goede foutafhandeling hebt. ;-)
 
Thomas van den Heuvel

Thomas van den Heuvel

04/07/2020 20:59:07
Quote Anchor link
- Ariën - op 03/07/2020 21:15:40:
Als je die bovenste foutmelding ziet, dat betekent dat in feite dat je geen goede foutafhandeling hebt. ;-)

Mja, maar dit is het gevolg van een syntactisch incorrecte query. Het is dus niet zozeer het probleem dat de code / databaselaag geen foutafhandeling zou hebben. Indien de query wel zou kloppen -en deze is verder compleet statisch / heeft geen enkel dynamisch deel- dan zou het eigenlijk niet uitmaken of je een foutmeldingslaag hebt of niet.

Neemt niet weg dat het voor een productie-omgeving netter zou zijn dat je wat extra "stootkussens" hebt in de vorm van foutafhandeling, en dan bij voorkeur een variant waarbij de gebruiker een nette foutmeldingspagina krijgt indien er iets misgaat - wellicht met HTTP status code 500 (internal server error), in plaats van rauwe foutmeldingen op het scherm, die op een productie-omgeving eigenlijk altijd uit zouden moeten staan (de weergave, niet de registratie).

Ook is het belangrijk dat je de foutmeldingen echt leert lezen/interpreteren. Als je dit kunt ben je namelijk al halverwege met het oplossen van het achterliggende probleem.
Gewijzigd op 04/07/2020 20:59:28 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

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.