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?