Gemeinsame Freunde Script

tl2011

Mitglied
Hallo,
ich code zurzeit ein Soziales Netzwerk und habe dafür natürlich ein Freundesscript erstellt welches Freunde speichert und wiedergibt. Jetzt würde ich damit gerne gemeinsame Freunde ausgeben. (Beispiel: Personen die du vielleicht kennst: Beispiels User (2 gemeinsame Freunde). Mein Script zum ausgeben der Freunde ist folgendes:
PHP:
echo "<h2>Freunde:</h2>";
  $query = mysql_query("SELECT freunde FROM benutzer WHERE ID = '" .$row->ID. "'"); }
  while($row = mysql_fetch_array($query)) {
  $friends = unserialize($row["freunde"]);

  if(isset($friends[0])) {
  foreach($friends as $friend) {
  $_query = mysql_query("SELECT Vorname, bild,  Name FROM benutzer WHERE ID = '" . $friend . "'");
  $_row = mysql_fetch_array($_query);
Könnte mir vielleicht jemand einen Ansatz posten wie ich vorgehen kann? Wäre sehr nett ^^
Liebe Grüße tl2011
 
Du speicherst die Freunde also in ein Array serialisiert?
Ich zweifel ein wenig daran, ob das wirklich sinnvoll ist, wenn du funktionen wie Freundes-Freunde nutzen willst.

Du müsstest jetzt hingehen, und in deiner foreach noch eine abfrage machen, ob ein User eine Freundes id von dir in seiner Freundes-Spalte hat.

$ids = join(',',$);
WHERE freunde IN ($ids)

Allerdings, geht das wahrscheinlich nicht, weil du die freunde eben in einem array in MySQL ablegest.

Vielleicht WHERE freunde LIKE ':$freundid' -> Das müsste dann für jede deiner Freundes-IDs machen..

Wie gesagt, die serialize halte ich hier für wenig sinnvoll :(

Aber vielleicht vertue ich mich auch und jemand kann dir gleich eine Lösung nennen :)

paD
 
Ich stimme String zu, dass das der Ansatz nicht gut gewählt ist.


Könnte mir vielleicht jemand einen Ansatz posten wie ich vorgehen kann?

Lass die Relationale Datenbank das tun, wofür sie gemacht ist. Nämlich Relationen (Beziehungen, Verbindungen, also sowas wie Freundschaften ;-)) zu modellieren.

Wirf die Spalte "freunde" raus und nimm stattdessen eine dritte Tabelle namens "freunde", in der du zwei Spalten für die ID der jeweiligen Personen hast.

Dann kannst du mit einer einzigen MySQL Abfrage dein Problem lösen und das völlig ohne PHP Code.
 
Absolut richtig. Einfache Beziehungen sind das A und O in relationalen Datenbanken, um effizient zu sein.

mfg chmee
 
Ich habe das mal schnell durchgespielt:

SQL:
mysql> SELECT * FROM users;
+----+-------+
| id | name  |
+----+-------+
|  1 | alex  |
|  2 | hans  |
|  3 | peter |
+----+-------+
3 rows in set (0.00 sec)


mysql> SELECT * FROM friends;
+--------+----------+
| userid | friendid |
+--------+----------+
|      1 |        2 |
|      1 |        3 |
|      2 |        3 |
+--------+----------+
3 rows in set (0.00 sec)


mysql> SELECT users.name FROM users, friends as f1, friends as f2 WHERE f1.userid = 1 AND f2.userid = 2 AND users.id = f1.friendid AND f1.friendid = f2.friendid;
+-------+
| name  |
+-------+
| peter |
+-------+
1 row in set (0.00 sec)


Es gibt drei Personen Alex, Hans und Peter. Alex hat Hans und Peter als Freunde. Hans hat nur Peter als Freunde. Die Letzte Abfrage liefert die gemeinsamen Freunde von Alex und Hans, also Peter.
 
Zuletzt bearbeitet:
Hmm das heißt die Spalte Freunde würde in der Tabelle Benutzer wegfallen?
Ich frage das da bereits einige "Freundschaften" gespeichert habe und sie gerne übernehmen würde.
Liebe Grüße und danke für die Antworten
 
Ist doch ganz einfach, du kannst ein Script baslten, was die Freundschaften in die neue Tabelle schreibt.
Aber um es richtig zu machen, wirst du nicht drum rum kommen.

Gruß
 
Sowas in der Art

PHP:
$query = mysql_query("SELECT freunde FROM benutzer");

while($row = mysql_fetch_array($query)) {
    $friends = unserialize($row["freunde"]);

    //Jetzt über $friends iterieren und jeweils ein INSERT in die neue Tabelle machen.
}

Das Skript brauchst du ja nur ein einziges mal.
 
Zurück