[PHP] Dubbio controllo IF

Discussione in 'PHP' iniziata da miagy, 13 Marzo 2018.

  1. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    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?
     
  2. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    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!
     
  3. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    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.idIS 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.
     
  4. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    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...
     
  5. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    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,
     
  6. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    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.!
     
  7. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    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.
     
  8. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    Codice:
    WHERE (Spedito) = CURDATE()
    senza virgolette
     
  9. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Si si, ho provato entrambe.
    Niente.

    Ho provato a stampare un SELECT di prova e non mi visualizza neanche un risultato.
     
  10. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    ....... WHERE DATE(Spedito) = DATE(CURDATE())
     
  11. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Si, l'avevo provato provato giusto 10' minuti fa per disperazione e... nulla.
    Ho provato pure un mai dimenticato CURRENT_DAY ma niente

    Attualmente ho in BakCaledario questao campo così strutturato:


    5 Spedito int(10) No 0

    e come valore:


    ID id_app Mittente Destinatario Spedito
    [​IMG]4 909 **** @@@@ 1521500400
     
  12. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    ma in spedito hai il timestamp?????
     
  13. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Yes
    E in Inviato il controllo;

    Inviato tinyint(1) Sì 0
     
  14. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    507
    Mi Piace Ricevuti:
    21
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    allora controlla dovrebbe essere WHERE DATE(Spedito) = CURDATE()... strano che non funzioni....
    WHERE DATE(Spedito) = DATE(NOW())?
     
  15. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    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.
     
  16. miagy

    miagy Nuovo Utente

    Registrato:
    2 Novembre 2014
    Messaggi:
    48
    Mi Piace Ricevuti:
    0
    Punteggio:
    6
    Risolto con:

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

Condividi questa Pagina