PHP Fehler beim Zusammenfügen von drei Listen einer Datenbank

SirFrancisDrake

Cadet 4th Year
Registriert
Feb. 2014
Beiträge
115
Hallo,

bin ein Programmieranfänger bei PHP/mySQL. Habe eine Datenbank erstellt und kann in diese auch über eine Website Daten speichern. Die Datenbank besteht aus drei Listen: users, birthdays und citys. Nun möchte ich die komplette Datenbank ausgeben. Die drei Listen sollen als eine Tabelle angezeigt werden.

PHP:
<?php

error_reporting(E_ALL);
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'root' );
define ( 'MYSQL_KENNWORT', '' );
define ( 'MYSQL_DATENBANK', 'database_1' );

$db_link = mysqli_connect (
                     MYSQL_HOST,
                     MYSQL_BENUTZER,
                     MYSQL_KENNWORT,
                     MYSQL_DATENBANK
                    );
 
$sql  = "SELECT * FROM users
        LEFT JOIN birthdays ON birthdays.id = users.id
        LEFT JOIN citys ON citys.id = birthdays.id";

$db_erg = mysqli_query( $db_link, $sql );

if ( ! $db_erg )
{
  die('Ungültige Abfrage: ' . mysqli_error());
}

echo '<table border="1">';

echo "<tr><th>ID</th><th>forname</th><th>surname</th><th>email</th><th>phone</th><th>matrix</th><th>birthday</th><th>city</th></tr>";

while ($zeile = mysqli_fetch_array( $db_erg, MYSQLI_ASSOC))
{
  echo "<tr>";
  echo "<td>". $zeile['id'] . "</td>";
  echo "<td>". $zeile['forname'] . "</td>";
  echo "<td>". $zeile['surname'] . "</td>";
  echo "<td>". $zeile['email'] . "</td>";
  echo "<td>". $zeile['phone'] . "</td>";
  echo "<td>". $zeile['matrix'] . "</td>";
  echo "<td>". $zeile['birthday'] . "</td>";
  echo "<td>". $zeile['city'] . "</td>";
  echo "</tr>";
}

echo "</table>";
 
mysqli_free_result( $db_erg );

?>

Mit der ersten Zeile funktioniert das auch einwandfrei. Jedoch fehlen ab der zweiten Zeile Daten. Ist mein SELECT und JOIN Befehl richtig geschrieben?

796162


Viele Grüße

SFR
 
SirFrancisDrake schrieb:
$sql = "SELECT * FROM users LEFT JOIN birthdays ON birthdays.id = users.id LEFT JOIN citys ON citys.id = birthdays.id";

Der Aufbau des JOINS ist richtig, allerdings könnte es sein, dass Du Dich vertan hast beim JOIN von citys.id = birthdays.id
 
Lazy Lambo scheint keine ID zu haben (ist das der Primärschlüssel bzw. ist ID as Primärschlüssel festgelegt).

Bei LEFT JOIN wird alles mit NULL aufgefüllt, wenn es für die rechte Seite keinen Treffer gibt. Da die ID 0/NULL/"" ist, gibt es keinen und es wird nichts angezeigt.

EDIT: und wie theEvil007 richtig anmerkt, besser immer auf die Wurzel-ID verweisen, also "LEFT JOIN citys ON city.id=user.id"
 
Meine Listen sind so konfiguriert, dass sobald ein Datensatz gespeichert wird ein Autoinkrement der ID ausgeführt wird. Jedoch habe ich gerade festgestellt, dass die unterschiedlich inkrementieren, da ich erst später die anderen zwei Listen hinzugefügt habe.
 
Kleiner Nachtrag noch: Baue den Query so auf, dass es keinen "SELECT * " gibt, sondern nutze die direkten Verweise auf die Felder, z.B. citys.id, users.id, denn damit umgehst Du Fehler im Query durch doppeldeutige Spaltennamen.

SirFrancisDrake schrieb:
Meine Listen sind so konfiguriert, dass sobald ein Datensatz gespeichert wird ein Autoinkrement der ID ausgeführt wird. Jedoch habe ich gerade festgestellt, dass die unterschiedlich inkrementieren, da ich erst später die anderen zwei Listen hinzugefügt habe.
Das kann nicht funktionieren. Du musst immer von einem Bezugspunkt ausgehen. Dieser ist Deine users-Tabelle, welche den Primärschlüssel als Auto-Increment hat. Jede andere Tabelle kann diesen auch haben, muss aber zwangsweise die ID des jeweiligen users auch besitzen, sonst stimmen die Referenzen nicht.
 
Du kannst bei Mysql einstellen, dass die ID niemals doppelt vorkommen darf und immer eine Zahl sein muss (INTEGER PRIMARY KEY), damit gibt es das Problem dann nicht mehr.

Noch ein Tipp: Ein Benutzer hat i.d.R. nur einen Geburtstag, den kannst du direkt bei deinem Nutzer mitspeichern. Du musst da nicht eine extra Tabelle machen. (Da du noch übst, ist das vollkommen OK, nur das du es im Hinterkopf behältst.)
 
@theEvil007: Du meinst direkt die gewünschten Zeilen angeben?
@ Hancock: Habe ich so eingestellt. Das mit den drei Tabellen ist nur um das Verlinken zu üben.

Es funktioniert, es lag an den unterschiedlichen IDs. Vielen Dank euch (=!!!
 
Ja, immer das im SELECT angeben, was Du direkt haben willst:

"SELECT u.id, u.forname AS forname, u.surname AS surname, u.email AS email, u.phone AS phone, u.matrix AS matrix, b.birthday AS birthday, c.city AS city FROM users u
LEFT JOIN birthdays b ON birthdays.id = users.id
LEFT JOIN citys c ON citys.id = birthdays.id"

btw: das heisst first name bzw. given name, oder forename ;-)
 
Alles klar danke.

#edit: Eine Frage hätte ich noch. Und zwar würde ich gerne die drei Listen auf zwei Eigenschaften durchsuchen. Jedoch zerschießt mir der Select Befehl meine Tabelle.

PHP:
<?php

$s_birthday = $_POST["s_birthday"];
$s_city = $_POST["s_city"];

/* Connect to Server*/
$con = new MySQLi("localhost", "root", "", "database_1");
if ($con->connect_error) {
        echo "Fehler bei der Verbindung: " . mysqli_connect_error();
        exit();
}

$sql = "SELECT users.id, users.forname, users.surname, users.email, users.phone, users.matrix, birthdays.birthday, citys.city FROM users, birthdays, citys WHERE citys.city = '$s_city' AND birthdays.birthday = '$s_birthday'";
$ergebnis = mysqli_query($con, $sql)or die("Fehler bei der Datenbankabfrage.");

echo '<table border="1">';
echo "<tr><th>ID</th><th>forname</th><th>surname</th><th>email</th><th>phone</th><th>matrix</th><th>birthday</th><th>city</th></tr>";

while ($zeile = mysqli_fetch_array( $ergebnis, MYSQLI_ASSOC))
{
  echo "<tr>";
  echo "<td>". $zeile['id'] . "</td>";
  echo "<td>". $zeile['forname'] . "</td>";
  echo "<td>". $zeile['surname'] . "</td>";
  echo "<td>". $zeile['email'] . "</td>";
  echo "<td>". $zeile['phone'] . "</td>";
  echo "<td>". $zeile['matrix'] . "</td>";
  echo "<td>". $zeile['birthday'] . "</td>";
  echo "<td>". $zeile['city'] . "</td>";
  echo "</tr>";
}

echo "</table>";

mysqli_close($con);

?>

796539


Muss ich dafür noch den JOIN Befehl in der Select Zeile ergänzen?

PHP:
$sql = "SELECT users.id, users.forname, users.surname, users.email, users.phone, users.matrix, birthdays.birthday, citys.city FROM users, birthdays, citys WHERE citys.city = '$s_city' AND birthdays.birthday = '$s_birthday'";
$ergebnis = mysqli_query($con, $sql)or die("Fehler bei der Datenbankabfrage.");
 
Zuletzt bearbeitet:
Zurück
Oben