LEFT JOIN, selectie uit 2 tabellen.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jerry

jerry

16/10/2007 19:41:00
Quote Anchor link
Hier weer een vraag over JOIN, het blijft misschien het lastigste onderwerp van php mysql.

Ik ben voor mezelf een cmsje aan het bouwen.
Mijn vraag is, ik heb een registratiesysteem gebouwd, dat werkt, wanneer ik eenmaal ben ingelogd, krijg ik dmv van sessies me gebruikersnaam te zien, ik kom dan in het menu, waarbij ik een post kan invoeren. Ik zou graag willen dat mijn "in sessie opgeslagen" gebruikersnaam wordt meegegeven aan de post, zodat die op de index pagina te zien is.

Ik heb gezocht, de tutorial gevolgd hier, maar niks helpt :(

Tot nu toe 2 tabelllen

POSTS
- id (int)
- titel (varchar)
- datum (tekst, voor de eenvoud)
- tekst (tekst)
- gebruikerid (mediumint)

GEBRUIKERS
- id
- naam
- password
- value (gebruik ik nog niet, nvt)

een gedeelte uit

new_post.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

session_start();

if($_SESSION['id'])
{

    echo "<p>Voeg hier een nieuw bericht toe. Je bent ingelogd  als: \"" . $_SESSION['gebruikersnaam'] . "\"</p>";?>



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
} else {
$titel = $_POST['titel'];
$datum = $_POST['datum'];
$bericht = $_POST['bericht'];  

                                            
$sql = mysql_query("INSERT INTO `posts` (titel, datum, bericht) VALUES ('$titel', '$datum', '$bericht')");
echo "Het bericht zit er nu bij! Wil je nog een post maken klik dan <a href=\"new_post.php\">hier</a> <br/>
of  <a href=\"..\"index.php\">bekijk</a> de home page om je post te zien> !"
;
} }

?>


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

en hier een gedeelte uit index.php waar de data uit de database wordt gehaald





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
<?php

include ("admin/db.php");  

$sql = "SELECT * FROM `posts` ORDER by id DESC";  

$query = mysql_query( $sql )  
or die( mysql_error() );

// Controleren of er resultaten zijn:
if( mysql_num_rows( $query ) == 0 ){   echo "De tabel is leeg.";}else{  
    // While maken  
    while( $uitvoer = mysql_fetch_assoc( $query ) )   {    
     echo 'auteur: ' . $uitvoer['naam'] . '<br/>' . 'titel: ' . $uitvoer['titel'] . '<br/>' . 'datum: ' . $uitvoer['datum'] . '<br/>' . 'bericht: ' .  $uitvoer['bericht'] . '<br/><br/>' ;   }}

?>



Hier heb ik even geen JOIN gebruikt, omdat het elke keer mislukte, als ik dit doe krijg ik dit te zien:
auteur:
titel : blaat
datum : blaat
bericht : blaat

Het moet dus uiteindelijk worden

auteur: $gebruikersnaam
titel : blaat
datum : blaat
bericht : blaat
Gewijzigd op 01/01/1970 01:00:00 door Jerry
 
PHP hulp

PHP hulp

12/01/2025 03:02:11
 
Jan Koehoorn

Jan Koehoorn

16/10/2007 19:48:00
Quote Anchor link
Ik denk dat deze query fout is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    $sql
= "SELECT * FROM `posts` ORDER BY 1 DESC";
?>

ORDER BY 1 ken ik niet.
 
Jerry

jerry

16/10/2007 19:50:00
Quote Anchor link
Ja dat is gewoon simpele versie
van DESC
nieuwste posts komt bovenaan
het moet eigenlijk zijn order by id
maar dit doet het wel gewoon
 
Jan Koehoorn

Jan Koehoorn

16/10/2007 19:53:00
Quote Anchor link
Dan is de variabele $uitvoer['naam'] leeg of niet geset. Zet dit eens bovenaan je script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    ini_set ('display_errors', 1);
    error_reporting (E_ALL);
?>
 
Jerry

jerry

16/10/2007 19:56:00
Quote Anchor link
ik heb btw die order by even snel verbeterd


met de error melding krijg ik btw
Notice: Undefined index: naam in D:\wamp\www\cms\index.php on line 42

dit is uiteraard logisch omdat ik
in me query ['naam'] uit de andere tabel gebruikers nog moet selecteren
maar hoe doe ik dit precies
zonder mijn db te aan te passen.




Jan Koehoorn schreef op 16.10.2007 19:53:
Dan is de variabele $uitvoer['naam'] leeg of niet geset. Zet dit eens bovenaan je script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    ini_set ('display_errors', 1);
    error_reporting (E_ALL);
?>
 
Jerry

jerry

16/10/2007 22:03:00
Quote Anchor link
hmm niemand?
 
Frank -

Frank -

17/10/2007 00:15:00
Quote Anchor link
Quote:
- datum (tekst, voor de eenvoud)

Eenvoud? Je maakt het juist moeilijker! Een datum sla je op in een DATE om het eenvoudig te maken. Ga maar eens sorteren op jouw tekst-datum, zelfs deze zeer eenvoudige klus wordt een heidens karwei. Je zult jouw tekst namelijk weer moeten converteren naar een echte datum, een DATE, en dan pas kun je sorteren. Beetje kansloos dus.

Gebruik een DATE en alle datum-problemen en uitdagingen kun je nu met het volste vertrouwen oplossen.
 
Jerry

jerry

18/10/2007 13:11:00
Quote Anchor link
pgFrank schreef op 17.10.2007 00:15:
Quote:
- datum (tekst, voor de eenvoud)

Eenvoud? Je maakt het juist moeilijker! Een datum sla je op in een DATE om het eenvoudig te maken. Ga maar eens sorteren op jouw tekst-datum, zelfs deze zeer eenvoudige klus wordt een heidens karwei. Je zult jouw tekst namelijk weer moeten converteren naar een echte datum, een DATE, en dan pas kun je sorteren. Beetje kansloos dus.

Gebruik een DATE en alle datum-problemen en uitdagingen kun je nu met het volste vertrouwen oplossen.


Ik heb naar je geluisterd
en inmiddels datetime gebruikt.
Hij geeft dat uiteraard jaar-maand-dag weer
dit heb ik voorkomen door substr
dus dat hij andere waarden leest zodat het in de juiste volgerde wordt weergegeven

het databaseprobleempje heb ik gelost om niet uit 2 tabellen te lezen.
in de tabel posts staat nu auteur.
$sql = mysql_query("INSERT INTO `posts` (auteur, titel, datum, bericht) VALUES ('".$_SESSION['gebruikersnaam']."'

dat is me sql query geworden

ik heb dus het vermijden van het probleem van selecteren van 2 tabellen opgelost. nu kon het, maar als me cms af, de join selecties zal ik later pas toepassen in mijn cms maar in iedergeval allemaal bedankt:)
 
Joren de Wit

Joren de Wit

18/10/2007 13:26:00
Quote Anchor link
Quote:
Hij geeft dat uiteraard jaar-maand-dag weer
dit heb ik voorkomen door substr
Gebruik hiervoor de MySQL functie DATE_FORMAT(). Op die manier kun je de datum uit de database in elk gewenst formaat krijgen.

Quote:
het databaseprobleempje heb ik gelost om niet uit 2 tabellen te lezen.
En dit is juist de verkeerde oplossing. Als een auteur meerdere posts kan schrijven, heb je dus een 1-op-veel relatie en als gevolg daarvan een aparte tabel voor je auteurs/gebruikers nodig. Precies zoals je in het begin had.

In de tabel post sla je, zoals je al deed, het id van de gebruiker op die de post schrijft. Om aan dit id te komen, zou het veel verstandiger zijn om het id van de gebruiker op te slaan in een sessievariabele ipv de gebruikersnaam. Of desnoods beide als je de gebruikersnaam ook nog ergens anders voor gebruikt.

Met het id van de gebruiker in een sessievariabele, kun je deze gewoon gebruiken in een INSERT query die je op je tabels met posts uitvoert.
 



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.