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

<?php

session_start();

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


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





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


Ik denk dat deze query fout is:

<?php
    $sql = "SELECT * FROM `posts` ORDER BY 1 DESC";
?>

ORDER BY 1 ken ik niet.
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
Dan is de variabele $uitvoer['naam'] leeg of niet geset. Zet dit eens bovenaan je script:
<?php
ini_set ('display_errors', 1);
error_reporting (E_ALL);
?>
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:
<?php
ini_set ('display_errors', 1);
error_reporting (E_ALL);
?>
hmm niemand?
- 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
- 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:)
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.

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.

Reageren