Freundschaftsanfrage

latinum_1982

Erfahrenes Mitglied
Hallo,

ich versuch sein einiger zeit eine freundschaftsanfrage zu schreiben ...

ich ziemlich lange gegooglet aber nicht lehrreiches gefunden..

ich hab mal einfach angefangen


das ist meine function

PHP:
function getFriends($user_id, $db) {
        $result = false;
		$status = 'no';
		/*
        $sql = 'SELECT
                        friend_id
                FROM
                        friends_list
                WHERE 
			user_id = ?
                       ';
// das ist nur Test gewesen
*/			   
					   
					   
					   
					   
    $sql = 'SELECT
              friends_list.friend_id AS friend_id,
				users.user_id AS user_id,
				users.username AS username,
				users.email AS email,
				users.foto AS foto
            FROM
                friends_list
            JOIN
                users
            ON
                friends_list.friend_id = users.user_id
            WHERE
                friends_list.user_id = ? ';

        $stmt = $db->prepare($sql);
		$stmt->bind_param('i', $user_id);
		$stmt->execute();
		$stmt->bind_result($friend_id, $user_id, $username, $email, $foto);
		while($stmt->fetch()) :
                $result[] = array(
								'friend_id' => $friend_id,
								'user_id' => $user_id,
								'username' => $username,
								'email' => $email,
								'foto' => $foto
								
              ); 	  
        endwhile;         
        return $result;	 			
}
wenn ich das ausführe bekomme ich

Fatal error: Call to a member function bind_param() on a non-object in




denn quell code hab ich von die angeschaut
http://tut.php-quake.net/de/admin.html
 
Hallo ich hätt da noch ne kleine frage bezüglich freundschaftsanfrage

ich hab sogut wie alles geschreiben und funktioniert auch bis auf das das die freunde nicht ganz angereicht werden

so schaut meine friends tabelle aus
friends_list_id
user_id
approved_status
date
friend_id

das ist zurzeit meine abfrage
PHP:
function getFriends($user_id, $db) {
        $result = false;
		$approved_status = 'yes';		   
					   
    $sql = 'SELECT
				friends_list.friends_list_id AS list_id,
                friends_list.friend_id AS friend_id,
				friends_list.user_id AS user_id,
				friends_list.datestamp AS time,
				user.user_id AS userid,
				user.username AS username,
				user.email AS email,
				user.foto AS foto
            FROM
                friends_list
            JOIN
                user
            ON
                friends_list.friend_id = user.user_id
            WHERE
                friends_list.friend_id = ?
			AND 
				approved_status = ?';
		

        $stmt = $db->prepare($sql);
		$stmt->bind_param('is', $user_id, $approved_status);
		$stmt->execute();
		$stmt->bind_result($list_id, $friend_id, $user_id, $time, $userid, $username, $email, $foto);
		while($stmt->fetch()) :
                $result[] = array(
								'friend_id' => $friend_id,
								'userid' => $userid,
								'username' => $username,
								'email' => $email,
								'foto' => $foto
								
              ); 	  
        endwhile;         
        return $result;	
}

hmm ich weiß nicht genau wie ich es jetzt mein problem beschreiben soll.... ich versuchs mal so:

ich hab ein 2 user mit der user_id 111 und 222

der user_id 111 will ne freundschaft mit 222 und versendet auch ne anfrage
der user_id 222 akzeptiert

der user_id 111 hat user_222 auf seiner liste aber
der user_id 222 hat nicht in user_111 auf seine liste...

wie muss ich jetzt die sql abfrage gestallten...

ich steh voll am schlauch :(
 
Wenn ich es richtig verstanden habe, dann wird ja zuerst ein Eintrag erzeugt, bei dem ein Status für "nicht bestätigt" gesetzt wird.
So gesehen existiert zuerst ein einzelner Eintrag: user1 will mit user2 befreundet sein, also hat user_id = 111 einen Eintrag mit einer Aufforderung.

Sobald user2 akzeptiert, wird der Status auf "ok" gesetzt. Jetzt hat aber nur User1 einen Eintrag, den musst du dementsprechend für User2 noch duplizieren.

Theoretisch wäre es auch nicht verkehrt, wenn du zwei Tabellen machst:
1) Anfrage-Tabelle
2) Freundes-Tabelle

Wenn dann User1 mit User2 befreundet sein will, wird ein Eintrag in der Anfrage-Tabelle gemacht. Wird diese bestätigt, kommen zwei Einträge in die Freundes-Tabelle (A-B und B-A), zugleich wird auch die Anfrage wieder gelöscht. Ist vielleicht etwas platzsparender.

lg
 
ja das ist mir auch schon eingefallen das ich 2 einträge gleichzeitig machen könnte ...

jetzt hab ich das mit die doppelte einträge gemacht

so schauts aus
PHP:
function addNewFriend($user_id, $getuser_id, $massage, $db)
{
$approved_status = 'no';
$sql = '
		INSERT INTO
					friends_list
					(user_id, approved_status, datestamp, friend_id, invite_message)
		VALUES
					(?, ?, NOW(), ?, ?)';
$stmt = $db->prepare($sql);
$stmt->bind_param('isis', $user_id, $approved_status, $getuser_id, $massage);

	if(!$stmt->execute()) 
	{
		if(strpos($db->error, 'Duplicate') !== false) {
			
			return false;
		}    
	}
	true;
$user_id = $getuser_id;
$approved_status = 'no';
$getuser_id = $user_id;
$massage = $massage;

	if(!$stmt->execute()) 
	{
		if(strpos($db->error, 'Duplicate') !== false) {
			
			return false;
		}    
	}
	return true;
}

aber das mit status update bekomm ich nicht hin ..

es tut mir immer nur ein zeile updaten

PHP:
function answerFrined ($user_id, $friendid, $db) {


	$approved_status = 'yes';
	$sql = 'UPDATE
                friends_list
            SET
                approved_status = ?
            WHERE
                user_id = ?
			AND
				friend_id = ?';
    $stmt = $db->prepare($sql);
    $stmt->bind_param('sii', $approved_status, $friendid, $user_id);
    $stmt->execute();
	
	$approved_status = 'yes';
	$friendid = $user_id;
	$user_id = $friendid;
	$stmt->execute();

	$stmt->fetch();
	return;
}
 
Ich hab die Sache nochmal überdacht und bin zu folgendem Entschluss gekommen:
- Es ist performanter, zwei Tabellen anzulegen: Anfragen und tatsächliche Freundschaften
- In der Freundschafts-Tabelle reicht ein Eintrag für die Freundschaft zwischen zwei Personen

Zu 1)
Wie ich bereits erwähnt hatte, speicherst du die Information des Status für jeden Eintrag mit. Selbst wenn der Status auf "ok" steht, frisst er bei vielen Einträgen Speicher. Daher würde ich eine Tabelle für Anfragen und eine für die bestehenden Freundschaften anlegen.

Anfragen: ID -- userID1 -- userID2
Freundschaften: ID -- userID1 -- userID2

Bei den Anfragen wird die Person, die eine Anfrage ausstellt, als userID1 festgelegt.
Bei den Freundschaften selber ist das völlig egal, denn...

Das führt zu 2)
Man kann ja einfach eine Abfrage formen, die beides abfragt:
SQL:
SELECT * FROM friends WHERE userID1 = '222';
UNION
SELECT * FROM friends WHERE userID2 = '222';
Das wäre jetzt ein Beispiel, mit dem man die eigenen Freunde auflisten könnte.


Zu deiner Frage bezüglich des Updatens:
PHP:
$stmt->bind_param('sii', $approved_status, $friendid, $user_id);
$stmt->execute();
$stmt->bind_param('sii', $approved_status, $user_id, $friendid);
$stmt->execute();
Einfach ein zweites Kommando ausführen, dass die Parameter entgegengesetzt entgegennimmt.

gruß
 
Hallo

Danke für deine Hilfe LIME..

aber ich hab jetzt so gemacht das ich immer 2 datensätze in die SQL schreibe..

user1 added user 2 = user2 landet gleicht bei user1 auf der freundesliste
und user2 bestätig oder löscht die anfrage (dann verschwindes user2 auch von der freundesliste von user1)

für meine php kenntnisse ich das schon sher gut was ich da zusammengebracht habe :)
 
Der Unterschied ist eigentlich nur, dass du so doppelt soviel Speicher verbrauchst. Wenn du jetzt 200 User hast, ist das nicht entscheidend. Bei Größenordnungen von mehreren Millionen Nutzern wird das aber schnell zum Problem.

Aber wenn dir das reicht, dann lass es so.

lg
 
Ah wenn ich mal 1 million user sichregistriert haben wenn das projekt fertig is komm werd ich auf dein vorschlag züruck kommen..

Wer träumt denn nicht von 1 million user :)
 
Zurück