Ciao ragazzi,
scrivo perché vorrei cercare una soluzione riguardo una questione che mi sta attanagliando e da cui non riesco a uscirne.
Ho due tabelle, la prima chiamata chat, la seconda chiamata chat_master.
Nel dettaglio, la tabella chat è così formata:
La seconda, chat_master, invece così:
Nello specifico, l'obiettivo è quello di dare i permessi di scrivere solo in determinate circostanze.
Questo è il primo passaggio che faccio, e funziona tutto alla perfezione.
All'interno dell'if, qualora mi restituisse un risultato, inizio a porre le condizioni:
1) Passaggio 1.1: Devo selezionare l'ultimo id di chat.mittente ($_SESSION'login']) all'interno di chat.id_id_chat e, se il nome è diverso da chat_master.user, verifico che chat.tipo=P e chat.ora sia > chat_on.date_start MA chat.ora < chat_on.date_end.
Fatto questo, stabilisco anche un ulteroriore condizione, ossia vedere se date_end sia abbia generato una scadenza oppure no (se date_end è settato alle 17:00 e mittente scrive alle 17:01, non può farlo).
A questo punto genero 3 condizioni:
I: Mittente non ha scritto nulla, ma date_end è ormai scaduto:
II: C'è un risultato e mittente ha scritto tra date_start e date_end
III: Non c'è nessun risultato, ma il date_end non è scaduto e per questo si può scrivere
Il codice posto così funziona, salvo in una cosa.
Se io che sono online sono != da chat_master.user, il primo if mi viene riconosciuto (non c'è neanche risultato, ma il tempo è scaduto e dunque non si può scrivere), ma il secondo e il terzo no.
Quindi se ci sono le condizioni per cui O "C'è un risultato tra date_start e date_end" O "non c'è nessun risultato, il date_end non è scaduto e per questo si può scrivere", come risultato mi dà sempre il primo (non c'è neanche risultato, ma il tempo è scaduto e dunque non si può scrivere).
Sapete come mai e dove sbaglio?
Qui il codice intero:
scrivo perché vorrei cercare una soluzione riguardo una questione che mi sta attanagliando e da cui non riesco a uscirne.
Ho due tabelle, la prima chiamata chat, la seconda chiamata chat_master.
Nel dettaglio, la tabella chat è così formata:
id_mex | id_chat | mittente | ora (datetime) | tipo |
id_chat | user | date_start (datetime) | date_end (datetime) |
Nello specifico, l'obiettivo è quello di dare i permessi di scrivere solo in determinate circostanze.
PHP:
//vedo se è una chat è attiva oppure no
$check = gdrcd_query("SELECT * FROM chat WHERE id_chat = ".$_SESSION['luogo']."", 'result');
if(gdrcd_query($check, 'num_rows') > 0) {
//c'è una chat attiva (vedi codice sotto)
} else {
//non c'è una chat attiva
}
Questo è il primo passaggio che faccio, e funziona tutto alla perfezione.
All'interno dell'if, qualora mi restituisse un risultato, inizio a porre le condizioni:
1) Passaggio 1.1: Devo selezionare l'ultimo id di chat.mittente ($_SESSION'login']) all'interno di chat.id_id_chat e, se il nome è diverso da chat_master.user, verifico che chat.tipo=P e chat.ora sia > chat_on.date_start MA chat.ora < chat_on.date_end.
PHP:
$info = gdrcd_query("SELECT * FROM chat
LEFT JOIN chat_master ON chat_master.id_chat = chat.id_chat
WHERE (SELECT max(chat.id)
FROM chat WHERE mittente = '".$_SESSION['login']."' &&
chat_master.id_chat = chat.id_chat)
&& chat.ora > chat_master.date_start && chat.ora < chat_master.date_end && chat.mittente != chat_master.user && chat.tipo='P'", 'result');
Fatto questo, stabilisco anche un ulteroriore condizione, ossia vedere se date_end sia abbia generato una scadenza oppure no (se date_end è settato alle 17:00 e mittente scrive alle 17:01, non può farlo).
PHP:
$check_ora = gdrcd_query("SELECT date_end FROM chat_master WHERE luogo = ".$_SESSION['luogo']."");
A questo punto genero 3 condizioni:
I: Mittente non ha scritto nulla, ma date_end è ormai scaduto:
PHP:
if ((gdrcd_query($info, 'num_rows') < 1) && ($check_ora['date_end'] < 'NOW()')) {
//non c'è neanche risultato, ma il tempo è scaduto e dunque non si può scrivere
}
II: C'è un risultato e mittente ha scritto tra date_start e date_end
PHP:
else if ((gdrcd_query($info, 'num_rows') > 0) && ($check_ora['date_end'] > 'NOW()')) {
//C'è un risultato tra date_start e date_end
}
III: Non c'è nessun risultato, ma il date_end non è scaduto e per questo si può scrivere
PHP:
else {
//puoi scrivere
}
Il codice posto così funziona, salvo in una cosa.
Se io che sono online sono != da chat_master.user, il primo if mi viene riconosciuto (non c'è neanche risultato, ma il tempo è scaduto e dunque non si può scrivere), ma il secondo e il terzo no.
Quindi se ci sono le condizioni per cui O "C'è un risultato tra date_start e date_end" O "non c'è nessun risultato, il date_end non è scaduto e per questo si può scrivere", come risultato mi dà sempre il primo (non c'è neanche risultato, ma il tempo è scaduto e dunque non si può scrivere).
Sapete come mai e dove sbaglio?
Qui il codice intero:
PHP:
$check = gdrcd_query("SELECT * FROM chat_master WHERE id_chat = ".$_SESSION['luogo']."", 'result');
if(gdrcd_query($check, 'num_rows') > 0) {
//c'è una chat attiva
//Passaggio 1.1: Seleziono l'ultimo id di chat.mittente e, se il nome è diverso da chat_on.user, verifico che chat.tipo=P e chat.ora sia > chat_on.date_start MA chat.ora < chat_on.date_end.
$info = gdrcd_query("SELECT * FROM chat
LEFT JOIN chat_master ON chat_master.id_chat = chat.id_chat
WHERE (SELECT max(chat.id)
FROM chat WHERE chat.mittente = '".$_SESSION['login']."' &&
chat_master.id_chat = chat.id_chat)
&& chat.ora > chat_master.date_start && chat.ora < chat_master.date_end &&
chat.mittente != chat_master.user && chat.tipo='P'", 'result');
//passaggio 1.1: oltre questo, verifico se NOW() abbia superato l'ora di chat_on.date_end. Se il tempo è scaduto, dunque NOW() è superiore a date_end, blocco qualsiasi azione:
$check_ora = gdrcd_query("SELECT * FROM chat_master WHERE luogo = ".$_SESSION['luogo']."");
//valorizzo
if ((gdrcd_query($info, 'num_rows') < 1) && ($check_ora['date_end'] < 'NOW()')) {
//non c'è neanche risultato, ma il tempo è scaduto e dunque non si può scrivere
} else if ((gdrcd_query($info, 'num_rows') > 0) && ($check_ora['date_end'] > 'NOW()')) {
//C'è un risultato tra date_start e date_end
} else {
//non c'è nessun risultato, il date_end non è scaduto e per questo si può scrivere
}
} else {
//non c'è nessuna chat attiva
}