[PHP] Dubbio controllo IF

miagy

Utente Attivo
2 Nov 2014
69
0
6
Buongiorno ragazzi,
avrei un problema con un controllo IF che funziona solo parzialmente.
Sostanzialmente ho creato un calendario, che funziona perfettamente, il cui obiettivo è quello di ricordare ai diversi utenti determinate cose. Fin qui, come ho già detto, tutto benissimo: il calendario si illumina in caso di giorno pieno e si svuota superato quel giorno.

Ultimamente, però, ho voluto ampliare questa funzionalità e ho cercato di creare uno script che potesse inviare anche un promemoria all'utente tramite email. Il codice funge solo a metà, nel senso che l'email viene inoltrata MA:

1) Continua anche nei giorni successivi
2) La invia praticamente a tutti.

Posto qui di seguito:

PHP:
      //RICHIAMO TABELLA//
      $sql = "SELECT * FROM appuntamenti";
      $result = mysql_query($sql) or die (mysql_error());
      if(mysql_num_rows($result) > 0)
      {
        while($fetch = mysql_fetch_array($result))
        {
          $id = stripslashes($fetch['id']);
          $titolo = stripslashes($fetch['titolo']);
          $testo = stripslashes($fetch['testo']);
          $autore = stripslashes($fetch['autore']);
          $str_data = $fetch['str_data'];

        // CONTROLLO SE E' GIA' STATA INVIATA EMAIL //

        $query = mysql_num_rows(mysql_query("SELECT * FROM Messaggi WHERE Mittente = 'Calendario' AND Destinatario = '".addslashes($Login)."' AND DATE_ADD(Spedito, INTERVAL 24 HOUR)  >= NOW()"));
        if($query == '0' && $data == $oggi && $_SESSION['Login'] == $autore)
      {
      // INVIO EMAIL //
       }
        }
            }
Io penso che il problema sia nell'IF finale, ma boh!
Devo forse invertire $autore con la login SESSION?
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
In questo caso "$data" , "$oggi", "$Login" non le vedo dichiarate, probabilmente le hai dimenticate....
Tornando al tuo codice, sappi che potresti risolvere il dilemma semplicemente effettuando una query un pò più giusta.... ossia... Ipotizza di avere 10000 record, così come hai scritto effettueresti 10000 query di controllo....
Sarebbe più semplice effettuare una query con subquery così eviti anche codice inutile...

Un banale esempio potrebbe essere questo, strutturando in modo differente il DB:
Codice:
CREATE TABLE appuntamenti (
  id int(11) NOT NULL AUTO_INCREMENT,
  titolo varchar(255) DEFAULT NULL,
  testo varchar(255) DEFAULT NULL,
  autore varchar(255) DEFAULT NULL,
  data_ varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB
----
CREATE TABLE messaggi (
  id int(11) NOT NULL AUTO_INCREMENT,
  ref_appuntamenti int(11) DEFAULT NULL,
  mittente varchar(255) DEFAULT NULL,
  destinatario varchar(255) DEFAULT NULL,
  spedito varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB
E la query in questo modo....
Codice:
SELECT
  appuntamenti.*
FROM appuntamenti
WHERE (SELECT
    messaggi.id
  FROM messaggi
  WHERE messaggi.ref_appuntamenti = appuntamenti.id) IS NULL
In questo modo estrai solo i record che devono essere spediti... In questo caso, quando invii una email devi effettuare l'insert nella tabella "messaggi".
Spero si capisca!
 

miagy

Utente Attivo
2 Nov 2014
69
0
6
Prima di tutto vorrei ringraziarti della risposta. Sì, effettivamente saltato di valorizzare, cosa a cui ho provveduto immediatamente:

PHP:
$data = strtotime(date($y."-".$m."-".$d));
$oggi = strtotime(date("Y-m-d"));
Per quanto riguarda il consiglio sulla tabella DB, attualmente è esattamente così (con alcuni nomi diversi, ma fa nulla).

L'unica cosa che non mi è chiara è questa:

PHP:
WHERE (SELECT
    messaggi.id
  FROM messaggi
  WHERE messaggi.ref_appuntamenti = appuntamenti.id) IS NULL
Mi spiego: attualmente il controllo lo faccio partire se nel corso delle ultime 24 ore non è partito un messaggio che, inviato a LOGIN, abbia come mittente calendario.
Con il SELECT inglobato dentro il WHERE non mi è chiara la funzionalità.

Devo ancora testarlo. Lo farò domani.
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Codice:
WHERE (SELECT
    messaggi.id
  FROM messaggi
  WHERE messaggi.ref_appuntamenti = appuntamenti.id) IS NULL
Cosa significa, che prende tutti i valori della tabella appuntamenti che non hanno l'invio della email memorizzato in messaggi....
Praticamente ti fa saltare la tua if...
 

miagy

Utente Attivo
2 Nov 2014
69
0
6
Codice:
WHERE (SELECT
    messaggi.id
  FROM messaggi
  WHERE messaggi.ref_appuntamenti = appuntamenti.id) IS NULL
Cosa significa, che prende tutti i valori della tabella appuntamenti che non hanno l'invio della email memorizzato in messaggi....
Praticamente ti fa saltare la tua if...
Perdonami, mi sono spiegato male io.
Sì sì, il senso lo avevo capito (eliminare la prima IF e check solo del LOGIN).

La cosa che non mi è chiara (e testando, effettivamente, non funziona) è come avviene il controllo.
Attualmente il controllo funziona prendendo come parametro di ricerca MITTENTE (Calendario) a DESTINATARIO (Login) e SPEDITO (nelle ultime 24 ore se $data è oggi).
Con la tua, non capisco il senso dell'ID e di ref_appuntamenti in int11 per effettuare l'INSERT dopo il secondo IF.

E' su questo che volevo avere spiegazioni :)
Scusa la mancata chiarezza del messaggio precedente,
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Con la tua, non capisco il senso dell'ID e di ref_appuntamenti in int11 per effettuare l'INSERT dopo il secondo IF.
Allora nella tabella appuntamenti inserisci tutti gli appuntamenti.... mentre nella tabella messaggi, memorizzi quali email hai inviato con "ref_appuntamenti" che altro non sarebbe l'id della tabella appuntamenti...
A questo punto, prendi solo gli appuntamenti che non hanno email inviate...
Naturalmente devi modificare la query secondo le tue esigenze.!
 

miagy

Utente Attivo
2 Nov 2014
69
0
6
Ah, giusto. E' una soluzione a cui non avevo minimamente pensato onestamente.
Allora, ho dovuto un po' riadattarlo per incompatibilità con il mio codice e mi ritrovo solo un ultimo nodo da sciogliere.
Spiego brevemente i passaggi:

- Ho creato una tabella a parte chiamata BakAppuntamenti (una sorta di archivio) il cui indice di invio email è "Spedito" in int11 (datestamp >y-m-d) (FUNZIONANTE!)
- Giunto il giorno stabilito, procedo con questo:

PHP:
$sql = "SELECT * FROM BakAppuntamenti WHERE Spedito = CURDATE()";
      $result = mysql_query($sql) or die (mysql_error());
      if(mysql_num_rows($result) > 0)
      {
        while($fetch = mysql_fetch_array($result))
        {

RICHIAMO VARIABILI

INSERT IN ESSAGGI
DELETE IN BAKAPPUNTAMENTI

}

}
Credo tuttavia di essere caduto nell'errore del datestamp. Come faccio a convertire lo Spedito nella data attuale? o provato anche con:

PHP:
WHERE DATE('Spedito') = CURDATE()
Ma nulla.
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
allora controlla dovrebbe essere WHERE DATE(Spedito) = CURDATE()... strano che non funzioni....
WHERE DATE(Spedito) = DATE(NOW())?
 

miagy

Utente Attivo
2 Nov 2014
69
0
6
allora controlla dovrebbe essere WHERE DATE(Spedito) = CURDATE()... strano che non funzioni....
WHERE DATE(Spedito) = DATE(NOW())?
No, neanche.
Ma infatti a me sembra troppo strano. Ho sempre usato il CURDATE ed è la prima volta che mi crea un problema simile. Ho provato con il NOW (anche se il mio campo dovrebbe tener conto solo del Y-m-d) e niente.
Se seleziono solo i campi dove "Inviato" è 0, mi stampa tutto. Se seleziono solo quelli con Spedito, neanche uno.

Veramente non so dove possa essere l'errore.
Sto veramente sbroccando.
 

miagy

Utente Attivo
2 Nov 2014
69
0
6
Risolto con:

Codice:
SELECT * FROM BakCalendario WHERE DATE(FROM_UNIXTIME(Spedito)) = CURDATE()
A volte riaprire i libri serve :D