[PHP] Dubbio controllo IF

miagy

Utente Attivo
2 Nov 2014
71
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.333
91
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
71
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.333
91
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
71
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.333
91
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
71
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.333
91
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
71
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
71
0
6
Risolto con:

Codice:
SELECT * FROM BakCalendario WHERE DATE(FROM_UNIXTIME(Spedito)) = CURDATE()

A volte riaprire i libri serve :D
 
Discussioni simili
Autore Titolo Forum Risposte Data
paloppa [PHP] Dubbio print variabile PHP 27
paloppa [PHP] Dubbio valore variabile PHP 16
paloppa [PHP] Invio mail da form dubbio PHP 17
asevenx [PHP] Dubbio teorico sui metodi e costruttore OOP PHP 1
otto9due [PHP] Dubbio esistenzaile: Regex email e stampa valori trovati.. PHP 5
D Dubbio per creare un sito in php PHP 9
neo996sps Dubbio su PHP e scrittura query PHP 2
I dominio aruba versione php server linux Domini 1
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1

Discussioni simili