[php + js] frame verversen tijdens proces voor status

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat is de bedoeling:

Frame 1:
Overzicht van de openstaande mailings
Per mailing wordt een status bijhouden.
Standaard: 0 = geen actie
In dit frame kan men d.m.v. checkboxes de mailings selecteren die verzonden moeten worden.
De actie wordt gesubmit naar frame 2.

Frame 2:
In dit frame wordt het volgende uitgevoerd na het ontvangen van de POST variabelen.
Alle geselecteerde mailings worden afgelopen:

Eerst worden in een aparte mysql-tabel alle e-mail adressen geplaatst waaraan de mailing verstuurd moet worden.
Hierna wordt de status van de mailing op 1 gezet: berichten verzameld

Daarna worden per mailing alle berichten verstuurd.
Dit gebeurt in loops van 75 met een tussenpauze van een bepaalde tijd om de mailserver te kunnen laten verwerken (dit op aanraden van de provider overigens, die bcc afraadt i.v.m. spamfilters etc.).
Tussentijds wordt de status van de mailing op 2 gezet: aan het versturen

Als alles verstuurd is wordt de status op 3 gezet: alle berichten verstuurd.


Nu heb ik ieder keer als de status wordt aangepast, dat het script in frame 2 de inhoud van frame 1 moet verversen (met een javascript). Dit gebeurt allemaal wel, maar helaas pas als het hele php-script is uitgevoerd: dus je ziet in frame 1 niet de status veranderen tussentijds.

Heeft iemand enig idee hoe ik dit wel voor elkaar kan krijgen?!

Frame 2 ziet er momenteel als volgt uit (ik heb het nu alleen nog maar even bij het verzamelen van de berichten gelaten om te testen).

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?
set_time_limit(0);
ignore_user_abort(true);
require_once("config.php");
if(!defined("configLoaded") || !configLoaded) die('Configuration file failure!');
require_once(RSECDIR . "secure.php");
require_once(DR . "/functions/function.messages.php");
if(isset($_POST['btnMailingVersturen'])){
    $numMailings = (isset($_POST['chkMailing']) && is_array($_POST['chkMailing'])) ? sizeof($_POST['chkMailing']) : 0;
    if($numMailings != 0){
        for($i=0; $i<$numMailings; $i++){
            /*
            ** Per klant moeten eerst alle te versturen berichten in de queue worden geplaatst
            */
            $sql->execute('INSERT INTO 
                                `tblMailing_Wachtrij` 
                           (`lngW_MailingID`,
                            `txtW_Titel`,
                            `txtW_Bericht`,
                            `txtW_Naam`,
                            `txtW_Email`) 
                           SELECT 
                                M.`lngMailingID`, 
                                M.`txtM_Titel`, 
                                M.`txtM_Bericht`, 
                                I.`txtI_Naam`, 
                                I.`txtI_Email` 
                           FROM 
                                `tblMailing`        M, 
                                `tblInschrijvingen` I 
                           WHERE 
                                (M.`lngM_KlantID`   = I.`lngI_KlantID`) AND 
                                (I.`blnI_Blacklist` = 0)                AND 
                                (M.`lngM_KlantID`   = ' . $_POST['chkMailing'][$i] . ')');
            if($sql->result){
                /*
                ** Als de berichten van de betreffende klant in de queue zijn geplaatst
                ** moet de status worden aangepast (1) van de mailing in het overzicht bovenaan het scherm
                */
                $sql->flush();
                $sql->execute('UPDATE `tblMailing` SET `blnM_InBehandeling`=1 WHERE `lngMailingID`=' . $_POST['chkMailing'][$i]);
                if($sql->result && $sql->affectedrows==1){
                    print '<script type="text/javascript" language="javascript">';
                    print "parent.frmPlanning.location = 'planning.php';";
                    print '</script>';
                }
                $sql->flush();
            }
            $sql->flush();
        }
        sleep(1);
    }else{
        print '<p class="errMsg" style="text-align: center;">U heeft geen mailings geselecteerd om te versturen!</p>';
    }
}
?>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je probleem zit erin dat PHP geen output flusht voor een bepaalde buffer vol is. Verder verwerken veel browsers een pagina pas als ze hem volledig binnen hebben, of als ze de sluittag van de betreffende opentag gezien hebben.

Het eerste probleem is op te lossen door de outputbuffer te gebruiken, door ob_start(); boven je script te zetten, en ob_end_flush(); op het moment dat je er zeker van wil zijn dat de uitvoer verstuurd wordt.

Je tweede probleem is echter browserafhankelijk, en daar weet ik persoonlijk geen oplossing voor. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben er inmiddels uit dat ik ob_start, flush en ob_flush moet gebruiken.
Nu wordt netjes in frame 2 'test' weggeschreven iedere keer dat het moet, maar frame 1 wordt nog steeds aan het einde van het script pas gerefreshed!
Iemand enig idee?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?
set_time_limit(0);
ignore_user_abort(true);
require_once("config.php");
if(!defined("configLoaded") || !configLoaded) die('Configuration file failure!');
require_once(RSECDIR . "secure.php");
require_once(DR . "/functions/function.messages.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?=$_SERVER['HTTP_HOST'];?></title>
<link href="/stylesheets/silver.style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="paginaTitel" class="pageTitle">Mailing - voortgang</div>
<?
if(isset($_POST['btnMailingVersturen'])){
    if(ob_get_level()==0) ob_start();
    $numMailings = (isset($_POST['chkMailing']) && is_array($_POST['chkMailing'])) ? sizeof($_POST['chkMailing']) : 0;
    if($numMailings != 0){
        for($i=0; $i<$numMailings; $i++){
            /*
            ** Per klant moeten eerst alle te versturen berichten in de queue worden geplaatst
            */
            $sql->execute('INSERT INTO 
                                `tblMailing_Wachtrij` 
                           (`lngW_MailingID`,
                            `txtW_Titel`,
                            `txtW_Bericht`,
                            `txtW_Naam`,
                            `txtW_Email`) 
                           SELECT 
                                M.`lngMailingID`, 
                                M.`txtM_Titel`, 
                                M.`txtM_Bericht`, 
                                I.`txtI_Naam`, 
                                I.`txtI_Email` 
                           FROM 
                                `tblMailing`        M, 
                                `tblInschrijvingen` I 
                           WHERE 
                                (M.`lngM_KlantID`   = I.`lngI_KlantID`) AND 
                                (I.`blnI_Blacklist` = 0)                AND 
                                (M.`lngM_KlantID`   = ' . $_POST['chkMailing'][$i] . ')');
            if($sql->result){
                /*
                ** Als de berichten van de betreffende klant in de queue zijn geplaatst
                ** moet de status worden aangepast (1) van de mailing in het overzicht bovenaan het scherm
                */
                $sql->flush();
                $sql->execute('UPDATE `tblMailing` SET `blnM_InBehandeling`=1 WHERE `lngMailingID`=' . $_POST['chkMailing'][$i]);
                if($sql->result && $sql->affectedrows==1){
                    print '<script type="text/javascript" language="javascript">';
                    print "parent.frmPlanning.location = 'planning.php';";
                    print '</script>';
                    print 'test';
                    flush();
                    ob_flush();
                }
                $sql->flush();
            }
            $sql->flush();
            sleep(1);
        } // end for
    }else{
        print '<p class="errMsg" style="text-align: center;">U heeft geen mailings geselecteerd om te versturen!</p>';
    }
    ob_end_flush();
}
?>
</body>
<? require_once("closure.php"); ?>
</html>