hoe doe ik dit met join?
id,titel,bericht,datum,naam
where id = '" . $_GET['id'] . "'
en uit tabel 2 users
de kolommen: username,credits,activity_points,online
en dat moet dus gebeuren met de kolom topics.naam uit tabel 1.
dus topics.naam = users.id
Wie kan me hier mee helpen?
Mvg
Gewijzigd op 06/04/2011 20:49:54 door Henke van der bunt
Je moet sowieso altijd joinen op primary key. Niet op iets wat kan veranderen.
Gewijzigd op 06/04/2011 20:52:20 door Niels K
Kolom naam maakt niet uit. als ik maar weet hoe ik die join uitvoer
Niels bedoelt dat de kolom topics.naam waarschijnlijk een string bevat die niet valt te vergelijken met een integer veld. Een join voer je (meestal) uit op twee integer velden.
Dat betekend dus dat je naam -> id krijgt. Dat is niet iets wat je moet doen. Je moet altijd joinen op basis van primary key. (PK)
Terugkomend op jouw vraag:
Hoe wil je de naam van een topic koppelen naar een naam of id van een gebruiker?
Wat je moet doen is het volgende:
- Maak een nieuw veld aan in de tabel topic met de naam user_id
- Maak daarna een join op basis van user_id.
Dat is toch wat je wilt?
(daar zit het user id in)
Gegevens van de user opvragen
maar ik zal die kolom wel even veranderen in ID
Dus bijv. ik wil credits opvragen van die user op basis van Userid in topics.
Mvg
- topic_id
- user_id
- titel
- naam
- bericht
- datum
Database users:
- user_id
- naam
etc..
Query wordt dan als volgt:
Let op: Wildcard wordt even gebruikt voor de test, wanneer je deze query gaat gebruiken zet je in de query wat je wilt selecteren, niet alles!
Code (php)
1
2
3
2
3
SELECT t.id,t.titel,t.userid,t.bericht,t.datum u.username,u.credits,u.activity_points,u.online
FROM topic AS t
LEFT JOIN users AS u ON t.userid = u.id
FROM topic AS t
LEFT JOIN users AS u ON t.userid = u.id
Maar de gegevens die uit de tabel Topic gehaald moet worden moet met
where id = '" . $_GET['id'] . "'
En wordt met die query die ik hierboven noem de gegevens uit users gehaald door het userid van de tabel topics?
Mvg
Gewijzigd op 06/04/2011 21:12:29 door Henke van der bunt
Niels Kieviet op 06/04/2011 20:51:42:
Onzin, je mag ook altijd op andere velden joinen. Meestal join je een primary key met een foreign key. Maar non key velden mag je ook joinen en om performance te halen is het handig om er een index op te definieren.Je moet sowieso altijd joinen op primary key. Niet op iets wat kan veranderen.
Gewijzigd op 06/04/2011 21:51:04 door Aad B
Quote:
Maar non key velden mag je ook joinen en om performance te halen is het handig om er een index op te definieren.
Kan, maar dan wel met index (unique) neem ik aan?
Quote:
Maar de gegevens die uit de tabel Topic gehaald moet worden moet met
where id = '" . $_GET['id'] . "'
where id = '" . $_GET['id'] . "'
Dan bouw je die where conditie er toch even in?
Let op: Gebruik te prefix (t) want anders krijg je als ik het goed heb de foutmelding: Column .. in .. is ambiguous.
Quote:
En wordt met die query die ik hierboven noem de gegevens uit users gehaald door het userid van de tabel topics?
Test het zou ik zeggen? ;)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql = "SELECT t.id,t.titel,t.userid,t.bericht,t.datum,u.username,u.credits,u.activity_points,u.online
FROM topics WHERE t.id = '" . $_GET['id'] . "' AS t
LEFT JOIN users AS u ON t.userid = u.id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
?>
$sql = "SELECT t.id,t.titel,t.userid,t.bericht,t.datum,u.username,u.credits,u.activity_points,u.online
FROM topics WHERE t.id = '" . $_GET['id'] . "' AS t
LEFT JOIN users AS u ON t.userid = u.id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
?>
Deze gebruik ik nu.
Nu krijg ik deze error:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in tpl/forum-replys.tpl on line 9
Toevoeging op 07/04/2011 17:51:22:
?
Gewijzigd op 07/04/2011 12:45:36 door Henke van der bunt
doe is foutafhandeling?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql = "SELECT t.id,t.titel,t.userid,t.bericht,t.datum,u.username,u.credits,u.activity_points,u.online
FROM topics AS t WHERE t.id = '" . $_GET['id'] . "'
LEFT JOIN users AS u ON t.userid = u.id";
$res = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($res);
?>
$sql = "SELECT t.id,t.titel,t.userid,t.bericht,t.datum,u.username,u.credits,u.activity_points,u.online
FROM topics AS t WHERE t.id = '" . $_GET['id'] . "'
LEFT JOIN users AS u ON t.userid = u.id";
$res = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($res);
?>
Zo heb ik hem maar dan zegt hij
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 'LEFT JOIN users AS u ON t.userid = u.id' at line 3
Waar ligt dat aan?
Gewijzigd op 07/04/2011 18:11:07 door Henke van der bunt
goede foutafhandeling
- fetch_array is nergens voor nodig, gebruik gewoon fetch_assoc
- Gebruik een while loop voor fetch_assoc als het om meerdere gegevens gaat.
- Is dit je enige code? Dan vergeet je de mysql_connect en mysql_select_d.
- or die is geen goede foutafhandeling. Gebruik - fetch_array is nergens voor nodig, gebruik gewoon fetch_assoc
- Gebruik een while loop voor fetch_assoc als het om meerdere gegevens gaat.
- Is dit je enige code? Dan vergeet je de mysql_connect en mysql_select_d.
Heb je die?
De basis van een goed script is dat je alle fouten goed afhandelt. Je moet altijd zorgen dat je basis goed is, zodat je dat eventueel kan uitbreiden. En kijk eens naar mijn laatste puntje.
daar connect hij al?
Where komt altijd na join.
Super :)
Code (php)
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
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
<?php
$csql = "SELECT r.naam,r.bericht,r.datum,u.username,u.look,u.credits,u.activity_points,u.online
FROM replys AS r
INNER JOIN users AS u ON r.naam = u.id
WHERE r.tid = '" . $_GET['id'] . "'";
$cres = mysql_query($csql) or die(mysql_error());
$crow = mysql_fetch_assoc($cres);
if (mysql_num_rows($cres) >= 1)
{
while ($crow = mysql_fetch_array($cres))
echo "<tr>
<td><center><b>" . $crow['username'] . "</b></center></td>
<td><b>Reactie op: " . $row['titel'] . "</b></td>
</tr>
<tr>
<td><center></center></td>
<td>" . $crow['bericht'] . "</td>
</tr>
<tr>
<td><b>Credits:</b> " . $crow['credits'] . "<Br><b>Pixels:</b> " . $crow['activity_points'] . "<br><b>Status:</b> " . ($crow['online'] == 1 ? "Online" : "Offline") . "<br><br></td>
<td> </td>
</tr><p>";
}
else
{
echo "Er zijn nog geen reacties.";
}
?>
$csql = "SELECT r.naam,r.bericht,r.datum,u.username,u.look,u.credits,u.activity_points,u.online
FROM replys AS r
INNER JOIN users AS u ON r.naam = u.id
WHERE r.tid = '" . $_GET['id'] . "'";
$cres = mysql_query($csql) or die(mysql_error());
$crow = mysql_fetch_assoc($cres);
if (mysql_num_rows($cres) >= 1)
{
while ($crow = mysql_fetch_array($cres))
echo "<tr>
<td><center><b>" . $crow['username'] . "</b></center></td>
<td><b>Reactie op: " . $row['titel'] . "</b></td>
</tr>
<tr>
<td><center></center></td>
<td>" . $crow['bericht'] . "</td>
</tr>
<tr>
<td><b>Credits:</b> " . $crow['credits'] . "<Br><b>Pixels:</b> " . $crow['activity_points'] . "<br><b>Status:</b> " . ($crow['online'] == 1 ? "Online" : "Offline") . "<br><br></td>
<td> </td>
</tr><p>";
}
else
{
echo "Er zijn nog geen reacties.";
}
?>
Ik heb nu dit bij Reacties staan.
Maar er staan 4 reacties in de database
En hij geeft er 3 weer.
Hoe kan dat nu weer?
- Center tag hoort in museum thuis, gebruik CSS hiervoor
- HTML tags zijn helemaal kleine letters
- While heeft ook {} nodig
- Let op SQL injection
- fetch_assoc en een fetch_array? Je hoeft alleen maar fetch_assoc te gebruiken
- Waarschijnlijk is die ene reactie die niet weergegeven wordt niet juist voor de JOIN of WHERE