[GDRCD 5.4] - Messaggi stile WA
03/02/2022 09:46:15
zepam ha scritto: ...
Strano che non funzioni correttamente il letto, ho provato diverse volte ma non mi ha dato questa anomalia.
In ogni caso, il motivo per il quale non entra nel controllo if è legato al fatto che tu vai a controllare la variabile $row['destinatario'], ma questa non viene più presa nell'indexnew del pacchetto.
Per intenderci, questa sotto è la query che ti trovi poco sotto inizio pagina:
// Costruisco la query per raccogliere le conversazioni
$sqlConversazioni = "
SELECT conversazioni.personaggio AS personaggio_conversazione,
conversazioni.testo, conversazioni.spedito, conversazioni.letto
FROM (
SELECT IF(destinatario = '".$_SESSION['login']."', mittente, destinatario) AS personaggio,
messaggi.*
FROM messaggi
) AS conversazioni
INNER JOIN (
SELECT MAX(spedito) AS spedito,
IF(destinatario = '".$_SESSION['login']."', mittente, destinatario) AS personaggio
FROM messaggi
WHERE 1
AND (
(destinatario = '".$_SESSION['login']."' AND destinatario_del = 0)
||
(mittente = '".$_SESSION['login']."' AND mittente_del = 0)
)
GROUP BY personaggio
) AS ultimo_messaggio_conversazione
ON (
conversazioni.spedito = ultimo_messaggio_conversazione.spedito
AND
conversazioni.personaggio = ultimo_messaggio_conversazione.personaggio
)
WHERE 1
AND (
(conversazioni.destinatario = '".$_SESSION['login']."' AND conversazioni.destinatario_del = 0)
||
(conversazioni.mittente = '".$_SESSION['login']."' AND conversazioni.mittente_del = 0)
)
GROUP BY personaggio_conversazione
ORDER BY conversazioni.spedito DESC
";
Anche se dentro la subquery esiste destinatario, questo viene sempre passato alla SELECT finale (quella sopra di tutte) come personaggio e, infine, gli viene dato il nome di personaggio_conversazione.
Prova a mettere personaggio_conversazione e dovresti vedere che entra nell'if se lo debugghi.
Kasa.
03/02/2022 16:11:51
Ciao! Intanto ti ringrazio tantissimo della risposta, anche se... sono ancora un po' lontana dal comprenderla!
Per prima cosa che intendi col fatto che il letto non ti dà problemi? Nel senso, già nella versione base del pacchetto dovrebbe essere possibile fare distinzione fra un messaggio non letto da parte dell'utente loggato e un messaggio non letto da parte del pg a cui l'utente loggato ha mandato un messaggio?
Perché il letto/non letto di per sé funziona, ma come detto, il mio problema è solo che non fa distinzione fra CHI non ha letto, ecco.
kasa ha scritto:
Anche se dentro la subquery esiste destinatario, questo viene sempre passato alla SELECT finale (quella sopra di tutte) come personaggio e, infine, gli viene dato il nome di personaggio_conversazione.
Prova a mettere personaggio_conversazione e dovresti vedere che entra nell'if se lo debugghi.
Kasa.
Ecco, che il problema fosse la query su l'avevo immaginato... solo che non so proprio gestire le subquery. Di fatto quindi non so che cosa mi stai consigliando di fare, a meno che il risultato finale non debba essere questo
if($row['personaggio_conversazione'] == $_SESSION['login'] && $row['letto'] == 0) {?>
<img src="imgs/icons/mail_new.gif" class="colonna_elengo_messaggi_icon">
<?php } elseif ($row['personaggio_conversazione'] != $_SESSION['login'] && $row['letto'] == 0) { ?>
<img src="imgs/icons/mail_new.png" class="colonna_elengo_messaggi_icon">
<?php } elseif ($row['letto'] == 1) { ?>
<img src="imgs/icons/mail_read.png" class="colonna_elengo_messaggi_icon">
<?php
} ?>
che mi pare strano, e che comunque non funziona. Mi sento veramente una piaga e mi dispiace, ma visto che ci sono vorrei approfittare per capire meglio!
04/02/2022 18:48:56 e modificato da zepam il 04/02/2022 18:56:36
Buondì!
Ritorno qui perché sono riuscita a risolvere il problema (leggasi: ho tediato per metà pomeriggio un altro poveraccio) e volevo condividere qui la cosa, se mai a qualcuno dovesse servire.
In pratica ho dovuto cambiare la query, da
SELECT conversazioni.personaggio AS personaggio_conversazione,
conversazioni.testo, conversazioni.spedito, conversazioni.letto
FROM (
SELECT IF(destinatario = '".$_SESSION['login']."', mittente, destinatario) AS personaggio,
messaggi.*
FROM messaggi
) AS conversazioni
INNER JOIN (
SELECT MAX(spedito) AS spedito,
IF(destinatario = '".$_SESSION['login']."', mittente, destinatario) AS personaggio
FROM messaggi
WHERE 1
AND (
(destinatario = '".$_SESSION['login']."' AND destinatario_del = 0)
||
(mittente = '".$_SESSION['login']."' AND mittente_del = 0)
)
GROUP BY personaggio
) AS ultimo_messaggio_conversazione
ON (
conversazioni.spedito = ultimo_messaggio_conversazione.spedito
AND
conversazioni.personaggio = ultimo_messaggio_conversazione.personaggio
)
WHERE 1
AND (
(conversazioni.destinatario = '".$_SESSION['login']."' AND conversazioni.destinatario_del = 0)
||
(conversazioni.mittente = '".$_SESSION['login']."' AND conversazioni.mittente_del = 0)
)
GROUP BY personaggio_conversazione
ORDER BY conversazioni.spedito DESC
a
SELECT conversazioni.personaggio AS personaggio_conversazione,
mittente, destinatario, conversazioni.testo, conversazioni.spedito, conversazioni.letto
FROM (
SELECT IF(destinatario = '".$_SESSION['login']."', mittente, destinatario) AS personaggio, messaggi.*
FROM messaggi
) AS conversazioni
INNER JOIN (
SELECT MAX(spedito) AS spedito,IF(destinatario = '".$_SESSION['login']."', mittente, destinatario) AS personaggio
FROM messaggi
WHERE 1
AND (
(destinatario = '".$_SESSION['login']."' AND destinatario_del = 0)
||
(mittente = '".$_SESSION['login']."' AND mittente_del = 0)
)
GROUP BY personaggio
) AS ultimo_messaggio_conversazione
ON (
conversazioni.spedito = ultimo_messaggio_conversazione.spedito
AND
conversazioni.personaggio = ultimo_messaggio_conversazione.personaggio
)
WHERE 1
AND (
(conversazioni.destinatario = '".$_SESSION['login']."' AND conversazioni.destinatario_del = 0)
||
(conversazioni.mittente = '".$_SESSION['login']."' AND conversazioni.mittente_del = 0)
)
GROUP BY personaggio_conversazione
ORDER BY conversazioni.spedito DESC
che mi ha permesso di utilizzare effettivamente la variabile destinatario per ottenere ciò che volevo, in questo modo:
if($row['destinatario'] != $_SESSION['login'] && $row['letto'] == 0) {?>
<img src="imgs/icons/mail_sent.png" class="colonna_elengo_messaggi_icon">
<?php } elseif ($row['destinatario'] == $_SESSION['login'] && $row['letto'] == 0) { ?>
<img src="imgs/icons/mail_new.gif" class="colonna_elengo_messaggi_icon">
<?php } elseif ($row['letto'] == 1) { ?>
<img src="imgs/icons/mail_read.png" class="colonna_elengo_messaggi_icon">
<?php
} ?>
Il risultato quindi è:
- icona x quando l'utente loggato ha inviato il messaggio (ed è dunque il mittente), ma il destinatario non ha ancora letto (le classiche spuntine blu!)
- icona y quando l'utente loggato ha ricevuto il messaggio e non l'ha ancora letto, ed è dunque il destinatario
- icona z quando il messaggio è stato letto dal destinatario (chiunque esso sia).
Non so se fosse un problema solo mio, ma in ogni caso, se mai dovesse servire, ecco qui!
13/02/2022 08:59:58
Ottimo!
Appena ho qualche minuto la provo e, nel caso, aggiorniamo il pacchetto.
Mi dispiace non averti potuto seguire, ma purtroppo è un periodo intenso per il sottoscritto.
Grazie piuttosto per la condivisione, sempre utili e di grande aiuto alla community!
Kasa.
Discussione seguita da
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Sea of Conquest ↗
World of the Sea Battle ↗
Raja Dunia ↗
Neverness to Everness ↗