Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    invio email a blocchi di un certo numero per evitare il timeout

    CIao a tutti, spero possiate essermi d'aiuto,

    Lo script serve per inviare delle fatture commerciali tramite mail, siccome potrebbero essere un discreto numero per volta, ho pensato di fare un invio "paginato".

    Partendo da un esempio di codice trovato qui su html.it e che utilizzo di solito per paginare i dati provenienti da mysql ho pensato qualcosa del genere:

    (il codice è scorporato da cose inessenziali e commentato)

    Codice PHP:
    $numfatt $_GET['numfatt']; // questa variabile è passata via GET da un form e serve a far partire la numerazione delle fatture, andrà passata anche alle pagine successive
    // esecuzione prima query
    $count mysql_query("SELECT COUNT(ID) FROM transazioni WHERE fattura = 0");
    $res_count mysql_fetch_row($count);
    // numero totale di records
    $tot_records $res_count[0];
    // risultati per pagina(secondo parametro di LIMIT)
    $per_page 3// questo valore è molto basso perchè per testare tutto ho solo 15 record in tabella, diciamo che va portato a 50
    // numero totale di pagine
    $tot_pages ceil($tot_records $per_page);
    // pagina corrente
    $current_page = (!$_GET['pagemail']) ? : (int)$_GET['pagemail'];
    // primo parametro di LIMIT
    $primo = ($current_page 1) * $per_page;
    // esecuzione seconda query con LIMIT
    $query_limit mysql_query("SELECT * FROM transazioni WHERE fattura = 0 LIMIT $primo$per_page");
    // includo la classe per la stampa in PDF
    (OMISSIS)
    // includo la funzione per l' invio mail
    // data da mettere in fattura
    $data_odierna date('d M Y');

    // INIZIO CON IL WHILE della query limitata
    while($results mysql_fetch_array($query_limit)) {
    // prelevo i dati che mi servono dalla query
    (OMISSIS)
    // creo il numero di fattura
    $numero_da_stampare $numfatt 1;
        
    // dalla spesa mi ricavo imponibile ed iva
    (OMISSIS)

    // includo la funzione di stampa della fattura
    (OMISSIS)

    // compongo la mail
    (OMISSIS)

    // invio la mail
    SE LA MAIL NON VIENE INVIATA{
    // non faccio niente
    }ELSE{

    FACCIO L' UPDATE DELLA TABELLA SCRIVENDO CHE LA FATTURA E' STATA INVIATA


    }
    // incremento il numero di fattura
    $numero_da_stampare $numero_da_stampare 1;

    // chiudo ciclo while che si dovrebbe essere ripetuto per $per_page volte ( in questo caso 3)

    // al termine devo attendere 10 secondi e fare il redirect alla pagina successiva
    if ($current_page != $tot_pages){
        
    $next_page = ($current_page 1);
        
    $qstring "?h=".$h."&ifatt=".$ifatt."&id=".$id."&pagemail=".$next_page."numfatt=".$numero_da_stampare// non tenere conto delle altre variabili passate via GET che servono ad altro ma solo di &numfatt=$numero_da_stampare
        
    $redirect $_SERVER['PHP_SELF'].$qstring;
        echo 
    $current_page."di".$tot_pages.
    Attendi senza chiudere il browser!"
    ;
        
    header("refresh:10;url=$redirect");    
    }else{
    // se invece la pagina è l'ultima
        
    echo "Le fatture sono state inviate";

    // faccio qualcosaltro

    purtroppo non funziona: infatti al primo passaggio va tutto bene, al secondo la query dei risultati senza invio diminuisce e di conseguenza diminuisce anche il numero di paginazione... fattosta che i primi 3 li gestisce, i secondi no, i terzi si, i quarti no e così via. Altro problema è che $numero_da_stampare non viene incrementato

    Fermo restando che è un papocchio, come si può portare al funzionamento? avete altri esempi da consultare?

    VI ringrazio in anticipo
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  2. #2

    non si tenga conto del codice precedente

    Ho inteso semplificare le cose, ma ci deve essere qualcosa che non va

    vediamo cosa faccio:

    Codice PHP:
    // recupero la variabile da cui partire per la fatturazione questa viene immessa in un form
    $numfatt $_GET['numfatt'];
    // ci sono altre variabili prese dalla querystring

    // dichiarazioni
    include ('dichiarazione-pdf.php'); // serve per stampare il PDF
    require "phpmailer/class.phpmailer.php"// serve per l'invio
    // data odierna
    $data_odierna date('d M Y');

    // la prima cosa da fare è stabilire quante mail devono essere prelevate
    $numero_di_invii 4// numero basso per i test, ho solo 15 record al momento
    // faccio una query per vedere quanti invii in totale devo fare
    $query "SELECT * FROM transazioni WHERE fattura = 0"// vedo a quali non ho ancora inviato la fattura
    $result mysql_query($query);
    if (!
    $result) {
        die(
    "Errore nella query $query: " mysql_error());
    }
    $quante_mancano mysql_num_rows($result); // numero di coloro che devono ricevere la fattura
    // faccio la query limitata
    $query_limit "SELECT * FROM transazioni WHERE fattura = 0 LIMIT $numero_di_invii";
    $result_limit mysql_query($query_limit);
    if (!
    $result_limit) {
        die(
    "Errore nella query $query_limit: " mysql_error());
    }
    $controllo mysql_num_rows($result_limit); // inutile
    if ($controllo != 0){
        
    // ciclo while per l'invio
        
    while ($row mysql_fetch_array($result_limit)){
            
    // prelevo i dati che mi servono dalla query
            
    $nome_g $row['nome_g'];
            
    $cognome_g $row['cognome_g'];
            
    $email_g =  $row['email_g'];
            
    $causale $row['causale'];
            
    $spesa $row['spesa'];
            
    $convenzione $row['convenzione'];
            
    $data $row['data'];
            
    $password_stud $row['password_studente'];
        
        
            
    $body "Spett.Le $nome_g $cognome_g\n\nIn allegato trovera' la fattura per l' acquisto effettuato sul nostro sito.\n\nCordiali saluti\n\n$recapiti";
        
            
    // dalla spesa mi ricavo imponibile ed iva
            
    $iva round((($spesa 21) / 100), 2);
            
    $importo_imponibile $spesa $iva;
        
            
    // includo la funzione di stampa della fattura
            
    include ("stampa-fattura.php"); // questa stampa il PDF
        
            // INVIO MAIL E UPDATE DEL RECORD RELATIVO
        
            
    $messaggio = new PHPmailer(); // istanzio la classe
            
    $messaggio->IsSMTP();
            
    $messaggio->Host='smtp.miohostsuaruba.it';
            
    $messaggio->Username "postmaster@miohostsuaruba.it";  // SMTP username 
            
    $messaggio->Password "miapassword"// SMTP password  
            
    $messaggio->From="$emailgesti"// il mittente
            
    $messaggio->AddAddress("$email_g"); // il destinatario preso da database
            
    $messaggio->AddReplyTo("$emailgest"); // il mittente ancora 
            
    $messaggio->Subject='Invio Fattura'// oggetto
            
    $messaggio->Body="$body"// corpo del testo

            //percorso all'allegato
            
    $messaggio->AddAttachment('PDF/fatture/'.$password_stud.'.pdf');
            if(!
    $messaggio->Send()){
                  echo 
    $messaggio->ErrorInfo
            }else{ 
                 echo 
    'Email inviata correttamente a '.$email_g
                
    // faccio l'update del relativo record
                
    $query_up_1 "UPDATE transazioni SET fattura = 1, data_fatt = NOW(), numero_fattura = ".$numfatt" WHERE ID = " $row['ID'] . "";
                
    $result_up_1 mysql_query($query_up_1);
                if (!
    $result_up_1) {
                    die(
    "Errore nella query $query_up_1: " mysql_error());
                }
                
    $numfatt $numfatt 1// incremento il numero fattura nel ciclo while in modo da stampare le altre correttamente
            
    }
            
    $messaggio->SmtpClose();
            unset(
    $messaggio); 
            
    // FINE INVIO MAIL
            
            // attendo per non intasare
            // usleep(1000);    
        
    }
    }
    // finito il ciclo while devo fare il refresh di pagina, ma per quante volte? 
    $quante_volte ceil($quante_mancano $numero_di_invii); // è fondamentale usare ceil che arrotonda all' estremo superiore

    for ($i 1;$i <= $quante_volte$i++){
        
    // ricarico la pagina passandogli il numero di fattura
        
    $qstring "?h=".$h."&ifatt=".$ifatt."&id=".$id."&numfatt=".$numfatt;
        
    $redirect $_SERVER['PHP_SELF'].$qstring;
        echo 
    "Attendi senza chiudere il browser!
    "
    ;
        
    header("refresh:10;url=$redirect");
    }

    // fuori dal ciclo for vuol dire che ho finito

    // CREO IL FILE ZIP E CANCELLO I FILE PDF
    // CODICE MANCANTE

    // rimando  con un messaggio di ok
    $msg urlencode("Hai inviato tutte le fatture");
    $qstring2 "?h=".$h."&fatt=1&id=".$id."&msg=".$msg;
    $redirect2 $_SERVER['PHP_SELF'].$qstring2;
    header("location: $redirect2"); 
    Succede che:

    1. PHPMAILER mi ritorna un errore del tipo: Warning: in_array() expects parameter 2 to be array, boolean given

    2. il ciclo WHILE viene eseguito una volta sola ovvero vengono stampate le fatture, (TUTTE CON LO STESSO NUMERO NONOSTANTE IO LO INCREMENTO ALLA FINE DI OGNI CICLO) vengono inviate le mail nonostante l'errore, viene aggiornato il database, per soli 4 record

    Io vorrei invece che dopo il primo ciclo si verificino una serie di refresh della pagina che rieseguano il codice per i record che ancora devono ricevere la fattura....

    Dove sbaglio?
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

  3. #3
    ho sostituito il ciclo FOR che racchiudeva il refresh di pagina con un IF che racchiude un link...
    mi devo accontentare, ma quello che proprio non capisco è il motivo per cui non si incrementa il numero di fattura che è correttamente contenuto nel ciclo while...
    Viviamo tutti in una palude di fango, ma alcuni di noi guardano le Stelle http://www.comunicareoltre.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.