LEFT JOIN, selectie uit 2 tabellen.
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)
1
2
3
4
5
6
7
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>";?>
session_start();
if($_SESSION['id'])
{
echo "<p>Voeg hier een nieuw bericht toe. Je bent ingelogd als: \"" . $_SESSION['gebruikersnaam'] . "\"</p>";?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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> !";
} }
?>
} 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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/>' ; }}
?>
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
van DESC
nieuwste posts komt bovenaan
het moet eigenlijk zijn order by id
maar dit doet het wel gewoon
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:
hmm niemand?
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.
pgFrank schreef op 17.10.2007 00:15:
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.
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:)
Quote:
Gebruik hiervoor de MySQL functie DATE_FORMAT(). Op die manier kun je de datum uit de database in elk gewenst formaat krijgen.Hij geeft dat uiteraard jaar-maand-dag weer
dit heb ik voorkomen door substr
dit heb ik voorkomen door substr
Quote:
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.het databaseprobleempje heb ik gelost om niet uit 2 tabellen te lezen.
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.