Entra

View Full Version : [PHP] Gestione delle amicizie


stefano861
25-12-2013, 23:44
Ciao, sto facendo un sito e ho bisogno di qualche aiuto sulla gestione delle amicizie.
Ho una tabella "amicizie" fatta in questo modo:
/******************************/
/* id | richiedente | accettante | stato */
/******************************/

dove:
- id è un auto incremet ed è chiave
- richiedente è l'username dell'utente che ha richiesto l'amicizia
- accettante è l'username dell'utente che ha ricevuto la richiesta
- stato può essere:
* 0 - richiesta in attesa di accettazione/rifiuto
* 1 - richiesta accettata (quindi gli utenti sono amici)

Ora voglio creare una pagina che mi visualizza una tabella contenente tutti gli utenti ed un bottone, il cui valore cambia a seconda che l'utente loggato sia:
- amico con l'utente --> mostra il bottone RIMUOVI AMICIZIA
- non amico con l'utente --> mostra il bottone RICHIEDI AMICIZIA
- in attesa di una richiesta --> mostra il "bottone" IN ATTESA

Quindi una cosa del genere:
* Username dell'utente loggato: mario (il suo id è 1)
* Nella pagina ListaUtenti.php viene visualizzata la tabella:
/******************************/
/* id | Username | Azione */
/* 2 | paolo | RICHIEDI AMICIZIA */
/* 3 | maria | IN ATTESA */
/* 4 | luca | RICHIEDI AMICIZIA */
/* 5 | chiara | RIMUOVI AMICIZIA */
/* 6 | .... | .... */
/*******************************/

* Cioè:
- mario e paolo non sono amici
- mario e maria non sono amici ma uno dei due (o mario o maria) ha fatto una richiesta all'altro
- mario e luca non sono amici
- mario e chiara sono amici

Quindi nel file ListaUtenti.php ho una semplice select * from utenti e per ogni risultato di questa query mi viene stampata una riga della tabella.
Il mio problema è: come faccio a inserire nella cella Azione il bottone giusto? Quali condizioni uso? Quali query devo far eseguire?

Spero di essermi spiegato bene.. Grazie anticipatamente a chi vuole aiutarmi :)

n0ise
26-12-2013, 10:42
a naso, e se ho capito bene, io farei un if dove se azione è in attesa mostra il tasto "in attesa" (e quindi non cliccabile) else mostri un tasto che quando è "on submit" invia una query di update verso Stato che diventa quindi 1

vfldj
26-12-2013, 11:03
a naso, e se ho capito bene, io farei un if dove se azione è in attesa mostra il tasto "in attesa" (e quindi non cliccabile) else mostri un tasto che quando è "on submit" invia una query di update verso Stato che diventa quindi 1
Esatto, fai delle condizioni con gli if.

stefano861
26-12-2013, 11:07
a naso, e se ho capito bene, io farei un if dove se azione è in attesa mostra il tasto "in attesa" (e quindi non cliccabile) else mostri un tasto che quando è "on submit" invia una query di update verso Stato che diventa quindi 1

Grazie per la risposta, agli if ci avevo pensato anche io. Il mio problema sono le query, non so come farle..

n0ise
26-12-2013, 11:16
L'update della tabella stato verrà una roba simile


UPDATE amicizie
SET stato='1'
WHERE accettante=nomedichiacetta(che ti passi con variabile php);

questo è l'abc di SQL, dovresti farti una ripassata :P

stefano861
26-12-2013, 19:03
Ok ma non è proprio questo quello che intendevo. Io ho una tabella che stampa una riga per ogni utente, come questa:

<?php
$utente = $_SESSION['username'];
$query = "SELECT id, user, nome, cognome FROM utenti WHERE user<>'" .$utente. "'";
$result = mysql_query($query);

while($row = mysql_fetch_array($result)) {
echo "<tr>
<td>$row[id]</td>
<td>$row[user]</td>
<td>$row[nome]</td>
<td>$row[cognome]</td>";
//utenti non amici
if(..qualcosa..) {
echo "<td><input type=\"submit\" name=\"submit\" value=\"RICHIEDI AMICIZIA\"></td>";
}
//utenti amici
else if(..qualcosa..) {
echo "<td><input type=\"submit\" name=\"submit\" value=\"RIMUOVI AMICIZIA\"></td>";
}
//in attesa
else {
echo "<td><input type=\"submit\" name=\"submit\" value=\"IN ATTESA\"></td>";
}
echo "</tr>";
}
?>


Quello che mi manca sono le condizioni dentro l'if, non so come farle.. :help:

Deep thought
28-12-2013, 16:34
Quello che mi manca sono le condizioni dentro l'if, non so come farle.. :help:

Per verificare la relazione fra due utenti, io creerei una funzione sonoAmici() da usare come condizione negli if. Per esempio:


function sonoAmici($user, $friend) {
// cerca lo stato fra due utenti
$sql = "SELECT stato FROM amicizie WHERE richiedente=$user AND accettante=$friend";
$query = mysql_query($sql);
$arr = mysql_fetch_array($query);
$stato = $arr['stato'];

// converte il numero dello stato in boolean
if ($stato==1) { // richiesta accettata
return true;
} else { // richiesta in attesa
return false;
}


Il problema è che nella tabella amicizie che tu hai definito ci sono solo due stati, cioè 'amici' e 'in attesa', ma le condizioni di amicizia ne richiedono tre, per verificare anche se i due non si sono nemmeno mai guardati in faccia (cioè non c'è stata fra loro nessuna richiesta o, se c'è stata, è stata rifiutata). La funzione booleana perciò non va più bene e bisogna definirne una numerica (a meno che tu non stia usando un computer quantistico), e cioè una cosa di questo tipo:


function sonoAmici($user, $friend) {
// per '$friend' si indica l'utente con cui effettuare il confronto
// cerca lo stato fra due utenti
$sql = "SELECT stato FROM amicizie WHERE richiedente=$user AND accettante=$friend";
$query = mysql_query($sql);
if (isset($arr = mysql_fetch_array($query))) { // c'è un contatto fra i due
return = $arr['stato'];
} else { // nessun contatto
return 2;


I valori restituiti sono:

0 per 'in attesa';
1 per 'amici';
2 per 'non amici'.


E quindi il tuo codice PHP diventerebbe:

$friend = $row['user']; // per 'friend' si indica l'utente con cui effettuare il confronto
//utenti non amici
if(sonoAmici($user, $friend)==2) {
echo "<td><input type=\"submit\" name=\"submit\" value=\"RICHIEDI AMICIZIA\"></td>";
}
//utenti amici
else if(sonoAmici($user, $friend)==1) {
echo "<td><input type=\"submit\" name=\"submit\" value=\"RIMUOVI AMICIZIA\"></td>";
}
//in attesa
else {
echo "<td><input type=\"submit\" name=\"submit\" value=\"IN ATTESA\"></td>";
}