PHP - Datenbankabfrage - Mehrere Tabellen

Alice

Erfahrenes Mitglied
Hallo.

Ich habe ein Problem mit dem folgenden PHP-Skript:

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Avatare von Usern</title>
</head>
<body>

<?php
$db_server   = "XXX";
$db_name     = "XXX";
$db_user     = "XXX";
$db_passwort = "XXX";

$db = @MYSQL_CONNECT($db_server,$db_user,$db_passwort);
mysql_select_db($db_name,$db);

$select = "select * from userfield";
$result = mysql_query($select,$db);

if($result)
{
echo "<table>";
while($row = mysql_fetch_array($result))
{

if (empty($row['field2'])) 
{
}
else
{
echo "<tr><td>User</td><td>:</td><td>".$row['username']."</td></tr>";
echo "<tr><td>User</td><td>:</td><td>".$row['field2']."</td></tr>";
echo "<tr><td>User</td><td>:</td><td><img src=\"/Avatare/Avatar-".$row['field2'].".png\"></td></tr>";
}

}
echo "</table>";
}

?>

</body>
</html>

Was macht das Skript?

Im Ordner "Avatare" sind Avatar-Grafiken gespeichert. Der Dateiname dieser Grafiken setzt sich aus einem Code zusammen den der User eingibt. Die Grafiken haben eine Präfixe -> Grafik-

Beispiel für eine Grafik:
/Avatare/Avatar-bl5000.png

Das Skript ist eine Art "Avatar-Galarie" und zeigt alle Avatare an. User die das Profilfeld Nr. 2 nicht ausgefüllt haben, werden in der Galarie nicht angezeigt -> if (empty($row['field2']))

Das Skript funktioniert so wie es jetzt ist perfekt aber ich möchte aus das man die Usernamen sieht.

Die Profilfelder befinden sich in der Tabelle "userfield" und die Usernamen in der Tabelle "user" und genau hier ist mein Problem.

Wenn ich aus...

PHP:
$select = "select * from userfield";
$result = mysql_query($select,$db);

das hier...

PHP:
$select = "select * from user, userfield";
$result = mysql_query($select,$db);

mache, werden alle User geladen und die vorhandenen Avatare werden auf alle User aufgeteilt.

Was mache ich hier falsch? Ich denke es liegt an der Abfrage?
 
Hallo Bl5000,
wenn ich dich Richtig verstehe, hast du eine Tabelle wo die Avatarlinks gespeichert sind? -> Dann wird sicher auch eine UserID hinterlegt sein?! Dann kannst du in dem Query wo die Avatare geholt werden, ganz einfach einen "LEFT JOIN" hinzufügen. Der dir dann die UserProfile holt.

Ansonst bitte etwas mehr Code zur Schau stellen ;)
Mfg Splater
 
Hallo. :)

Also im Profilfeld "field2" ist lediglich etwas wie "bl5000" gespeichert.

Ob eine User ID hinterlegt ist, weiss ich nicht.

In PHPMyAdmin sehe ich unter userfield -> field2 nur den code (bl5000).

Übrigens ist das Skript im 1. Beitrag das Originalskript. Mehr gibt es nicht.
 
Hm, also man braucht definitiv etwas, wo man Eindeutig erkennen kann von welchem Benutzer welcher Avartar ist, sonst kann man es schlecht irgendwie zuordnen. Eventuell eine ID die vom "userfield" in "user" eingetragen wird?
 
Also bei der Datenbank handelt es sich um eine vBulletin Datenbank. Vielleicht kannst du mit dieser Information etwas anfangen?

Ich sehe gerade das es in der userfield eine userid Tabelle gibt.

Also gibt es userid in der Tabelle user und userfield.
 
Na das ist doch eine Gute Info ;) dann kannst du das wie folgt lösen:
PHP:
SELECT * FROM userfield as parent
LEFT JOIN (
		  SELECT * FROM user 
		  )as child
ON ( parent.userid = child.userid )
Damit vergleichst du die UserID und bekommst die Benutzer zur zugehörige ID.
Mfg SPlater
 
Ist es so richtig?

PHP:
$select = "SELECT * FROM userfield as parent 
           LEFT JOIN (
                     SELECT * FROM user
                     )as child 
           ON (parent.userid = child.userid)";

Wird mit dem * nicht zuviel Serverleistung verbraucht? Kann man das evtl. auf die richtigen Spalten beschränken?
 
na türlich kannst du auch nur die Spalten wählen die du brauchst, beachtet aber : Es können nicht 2 vom Namen gleiche Tabellen geladen werden, dann musst die ein Alias für eins der beiden setzen und diese dann auch nutzten um die Spalte anzusprechen also :
PHP:
SELECT id, name AS username FROM...
hoffe du verstehst was ich meine ;) Ansonst, musst du auch alle Spalten wählen die in dem Query auch so vorkommen.

Mfg Splatü
 
Zurück