Freunde-System Logik Problem!

Hi,

ich versuche grade ein Freunde-System zu entwickeln. Ich hänge dauernt an dem logischen Punkt, wie ich was vergleiche.

Vielleicht habt ihr ja eine bessere Lösung. Ich zeige euch meine anhand Screens nun den Aufbau der DB und poste unten das Script mal, vielleicht weiß ja einer wo es da hapert.

Erläuterung:
member_id = Das bin dann ich aus der users_tabelle, das wäre die 1
friend_id = Ist die ID des Freundes

buddy_tabelle
Hier klicken!

users_tabelle
Hier klicken!

Hier kommt nun der Codeausschnitt:

PHP:
//Username holn 
 $aus = @mysql_fetch_array(@mysql_query("SELECT * FROM users WHERE user_name='$_SESSION[user]'"));
 //Buddy tabelle mit Users Tabelle vergleichen
 $low = @mysql_fetch_array(@mysql_query("SELECT * FROM buddy WHERE member_id='$aus[id]'"));
 //Hier nimmt er aus der Buddy-ID den Namen
 $aus2 = @mysql_fetch_array(@mysql_query("SELECT * FROM users WHERE id='$low[friend_id]'"));

 $fname = $aus2[user_name];
 $fbild = $aus2[user_avatar];
 
  
   $db_erg = mysql_query( $sql );
   
  echo "<p>Seite ";
  for($i = 1; $i - 1< $seiten; $i++){              
      echo "<a href=\"?cat=friends&page=".$i."\">".$i."</a> ";
  } 
  echo "<br/><br/></p>";
  
  echo '<table width="100%" border="0" cellpadding="5" cellspacing="1" bgcolor="#DDDDDD">',
	   '<tr>',
 	   '<td class="td1">Name</td>',
 	   '<td class="td1">Bild</td>',
	   '<td class="td1">Online</td>',
	   '<td class="td1">Nachricht</td>',
 	   '<td class="td1">Löschen</td>',
 	   '</tr>',
 	   '<tr>';
  
    while ($row = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
    {
   echo "<td class=\"td2\">$fname</td>";
   echo "<td class=\"td2\"><img width=\"90\" height=\"90\" src=\"images/avatars/$fbild\"/></td>";
   echo "<td class=\"td2\">$row[member_id]</td>";
   echo "<td class=\"td2\">$row[member_id]</td>";
   echo "<td class=\"td2\">$row[member_id]</td>";
   echo "</tr>";
    }
	echo "</table>";

Ich erwarte keine Lösung von euch sondern ein Weg wo mir weiterhilft :)

Danke im vorraus :)

Grüßle dennis
 
Hi,

über welche Abfrage da jetzt noch die while-Schleife läuft, ist leider nicht ersichtlich. Auch nicht, wo Du versuchst, irgendetwas zu vergleichen.

Wenn Du einfach nur die Freunde eines Users auflisten willst, solltest Du Dich mit JOINs beschäftigen. Das kann man mit einer einzigen Abfrage lösen.
Auf SelfHTML findest Du eine Einführung in Joins.

LG
 
//UPDATE: Ok habe mehr gegoogelt.. Sry ^^ Ehm habe das rausbekommen.
PHP:
 $low = @mysql_fetch_array(@mysql_query("SELECT b.member_id, b.friend_id FROM buddy as b JOIN users as a ON (b.member_id = a.id AND b.friend_id = a.id)"));

Doch wenn ich nun

PHP:
echo $low[user_name];

mache passiert nichts. Habe den Select..... Befehl in phpmyadmin mal eingefügt um Fehler zu entdecken und nun ja, kein Fehler. Aber wie bekomm ich nun den Namen meines Freundes raus?

wo könnte der Fehler liegen?

Gruß
Dennis
 
Zuletzt bearbeitet:
Code:
SELECT * FROM buddys 
INNER JOIN Users ON
Users.member_id = buddys.friend_id 
WHERE memberID = X

...und schon bekommst du alle Friends von User X auf einmal und kannst sie durchlaufen
 
Also ok danke, dieser Code geht besser als meiner.

Jedoch gibt er mir jetzt 4 mal den gleichen Namen aus und zwar die erste Zeile 4mal.

Und ich habe mich mal in einen anderen Nutzer eingelogt und musste festellen, dass er auch 4 "Freunde" hat bei denen stehen dann aber keine Namen.

Was ist da nun Fallsch?

Darf ich eig in einer While -Schleife das ausgeben?

PHP:
 //Username holn 
 $aus = @mysql_fetch_array(@mysql_query("SELECT * FROM users WHERE user_name='$_SESSION[user]'"));
 $member = $aus[id];
 //Buddy tabelle mit Users Tabelle vergleichen
 $low = @mysql_fetch_array(@mysql_query("SELECT * FROM buddy INNER JOIN users ON users.id = buddy.friend_id WHERE buddy.member_id = '$member'"));
 

 $fname = $low[user_name];
 $fbild = $low[user_avatar];

$sql = "SELECT * FROM buddy";

$db_erg = mysql_query( $sql );

    while ($row = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
    {
   echo "<td class=\"td2\">$fname</td>";
   echo "<td class=\"td2\"><img width=\"90\" height=\"90\" src=\"images/avatars/$fbild\"/></td>";
   echo "<td class=\"td2\">$row[member_id]</td>";
   echo "<td class=\"td2\">$row[member_id]</td>";
   echo "<td class=\"td2\">$row[member_id]</td>";
   echo "</tr>";
    }

Danke nochmal, für eure super Hilfe!! Spitze Board! (!)
 
Hi,

was hast Du denn erwartet? Du liest nur den ersten gefundenen Datensatz aus und gibst den (natürlich immer gleichen) Namen in einer while-Schleife über das Ergebnis einer völlig anderen (komplett überflüssigen) Query aus. :confused:

Die Logik ist total daneben. Schau Dir den Schnipsel mal ganz in Ruhe an und überlege Dir, was da wo passiert.

Die erste Abfrage ist übrigens auch überflüssig. Wenn Du den Benutzernamen, für den Du die Freunde auflistest, auch haben möchtest, kannst Du die User-Tabelle einfach ein zweites Mal mit entsprechend anderer Bedingung joinen.

LG
 
Dann wäre es im Sinne dieser Community, wenn Du Deine Abfrage für die die Suchfunktion benutzende Nachwelt posten und das Thema als erledigt markieren würdest.

LG
 
Is ja ok chill ma, wollte es nür für deine "Nachwelt" verbessern....

Hier gebe ich mal meinen kompletten Freunde Code bekannt :)

PHP:
<?php

if($checklogin == 1) {
	
 //Username holn 
 $aus = @mysql_fetch_array(@mysql_query("SELECT * FROM users WHERE user_name='$_SESSION[user]'"));
 $member = $aus[id];
 
   if($_REQUEST[id]){
	@mysql_query("INSERT INTO buddy (member_id, friend_id) VALUES ('$aus[id]', '$_REQUEST[id]')");
	echo "<meta http-equiv=\"refresh\" content=\"0; URL=?cat=freunde\" />";
   }
   if($_REQUEST[lid]){
	@mysql_query("DELETE FROM buddy WHERE member_id='$aus[id]' AND friend_id='$_REQUEST[lid]'");
	echo "<meta http-equiv=\"refresh\" content=\"0; URL=?cat=freunde\" />";
   }


$sql = "SELECT * FROM buddy";
  $eintrage = mysql_num_rows(mysql_query($sql));   
	$maxproseite = 15;                                
	$i = 0; 

  $seiten = $eintrage / $maxproseite;              

  if (!isset($_GET['page'])) {                     
      $sql = "SELECT * FROM buddy ORDER BY id LIMIT 0,".$maxproseite.";";  
  } else {                                        
      $abeintrag = $_GET['page'] * $maxproseite - $maxproseite;
      $sql = "SELECT * FROM buddy ORDER BY id LIMIT ".$abeintrag.",".$maxproseite.";";
  } 
  

 //Buddy tabelle mit Users Tabelle vergleichen
 $low = "SELECT * FROM buddy INNER JOIN users ON users.id = buddy.friend_id WHERE buddy.member_id = '$member'";
 
  $db_erg = mysql_query( $low );
   
  echo "<p>Seite ";
  for($i = 1; $i - 1< $seiten; $i++){              
      echo "<a href=\"?cat=friends&page=".$i."\">".$i."</a> ";
  } 
  echo "<br/><br/></p>";
  	if (mysql_num_rows($db_erg) > 0)
	{
  echo '<table width="100%" border="0" cellpadding="5" cellspacing="1" bgcolor="#DDDDDD">',
	   '<tr>',
 	   '<td class="td1">Name</td>',
	   '<td class="td1">Online</td>',
	   '<td class="td1">Nachricht</td>',
 	   '<td class="td1">Löschen</td>',
 	   '</tr>',
 	   '<tr>';
  
    while ($row = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
    {
   echo "<td class=\"td2\"><a href=\"?cat=profil&id=$row[id]\" title=\"Profil anschauen!\">$row[user_name]</a></td>";
   echo "<td class=\"td2\">Noch unbekannt xD</td>";
   echo "<td class=\"td2\"><a href=\"?cat=msg&action=write&toid=$row[id]\" title=\"Private Nachricht abschicken!\"><img src='images/icons/email.png' border='0' title=\"Private Nachricht abschicken!\" /></td>";
   echo "<td class=\"td2\"><a href=\"?cat=freunde&lid=$row[id]\" title=\"Freund löschen?\"><img src='images/icons/delete.gif' border='0' title=\"Freund löschen?\" /></td>";
   echo "</tr>";
    }
	echo "</table>";
	}
	else{
		echo "Im Moment keine Freunde!";
	}
  echo "<p><br/>Seite ";
  for($i = 1; $i - 1< $seiten; $i++){              
      echo "<a href=\"?cat=userlist&page=".$i."\">".$i."</a> ";
  } 
  echo "</p>";

     
}
else {
	$note->notaccess();
}

   ?>
Der is nur für die Nachwelt und nicht für kuddeldaddeldu
:-) ;)

Gruß
Dennis
 
Zurück