Avatar billede -kenner- Nybegynder
27. februar 2006 - 15:39 Der er 21 kommentarer og
1 løsning

While koerer kun en gang?

Hej eksperter,

Jeg har lavet en kode, som skulle tjekke alle mine nyheder om der er blevet sendt en email, og hvis der ikke er, saa skal mailen sendes til alle i brugerkardoteket.

Problemet er at den ydre while() som koerer igennem nyhederne kun koerer en gang, hvorfor og hvordan kan de loeses?

Kode:
<?php
include("funktioner.php");
db_connect();
select_db("hotml");
$result = mysql_query("select * from nyheder WHERE Mail_sendt != 'T'") or die(mysql_error());
while($nyhed = mysql_fetch_array($result)){
$result = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T'") or die(mysql_error());
            $besked="Der er blevet tilføjet en ny kode, som muligvis har din interresse. <br><br><b>".$nyhed['Titel']."</b><br>".$nyhed['Beskrivelse']."";
            while($bruger = mysql_fetch_array($result)){
            if(Hot_mail($bruger['Brugernavn'], $bruger['Email'], "HoTML.dk - Ny kode - ".$nyhed['Titel']."!", $besked)){
                  $sendt[]="a";
                  }else{
                      $ikke_sendt[]="b";
                      }
                }
                if(isset($sendt)){
                    $antal_sendt = count($sendt);
                    }else{
                    $antal_sendt = 0;
                        }
                if(isset($ikke_sendt)){
                    $antal_ikkesendt = count($ikke_sendt);
                    }else{
                    $antal_ikkesendt = 0;
                        }
mysql_query("update nyheder set Mail_sendt='T', Antal_modtaget='".$antal_sendt."', Antal_umodtaget='".$antal_ikkesendt."' where ID=".$nyhed['ID']."") or die(mysql_error());
echo $nyhed['Titel']."Modtaget: $antal_sendt, Umodtaget: $antal_ikkesendt, Nyhed ID:".$nyhed['ID']."<br>";
}

$result = mysql_query("select * from brugere WHERE Bruger_aktiveret != 'T'") or die(mysql_error());
while($bruger = mysql_fetch_array($result)){
$tid = time() - (60*60*24);
if($bruger['Oprettet_Dato'] < $tid){
    echo $bruger['Brugernavn'].", ID:".$bruger['ID'].", Oprettet:".$bruger['Oprettet_Dato']."<br>";
    mysql_query("DELETE from brugere where ID = ".$bruger['ID']."") or die(mysql_error());
    }
}
?>
Avatar billede Slettet bruger
27. februar 2006 - 15:46 #1
Den kører kun 1 gang, fordi der i tabellen 'nyheder' kun er 1 række for Mail_sendt ikke er præcist = 'T'.
Avatar billede nielle Nybegynder
27. februar 2006 - 20:02 #2
Prøv om dette ikke virker bedre:

<?php
include("funktioner.php");
db_connect();
select_db("hotml");
$result1 = mysql_query("select * from nyheder WHERE Mail_sendt != 'T'") or die(mysql_error());
while ($nyhed = mysql_fetch_array($result1))
{   
    $besked = "Der er blevet tilføjet en ny kode, som muligvis har din interresse.     <br><br><b>" . $nyhed['Titel'] . "</b><br>" . $nyhed['Beskrivelse'];

    $result2 = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T'") or die(mysql_error());
    while ($bruger = mysql_fetch_array($result2))
    {
        if (Hot_mail($bruger['Brugernavn'], $bruger['Email'], "HoTML.dk - Ny kode - " . $nyhed['Titel'] . "!", $besked))
        {
            $sendt[] = "a";
        }
        else
        {
            $ikke_sendt[] = "b";
        }
    }

    $antal_sendt = (isset($sendt)) ? count($sendt) : $antal_sendt = 0;
    $antal_ikkesendt = (isset($ikke_sendt)) ? count($ikke_sendt) : 0;

    mysql_query("update nyheder set Mail_sendt='T', Antal_modtaget='" . $antal_sendt . "', Antal_umodtaget='" . $antal_ikkesendt . "' where ID=" . $nyhed['ID']) or die(mysql_error());
    echo $nyhed['Titel'] . "Modtaget: $antal_sendt, Umodtaget: $antal_ikkesendt, Nyhed ID:" . $nyhed['ID'] . "<br>";
}

$result3 = mysql_query("select * from brugere WHERE Bruger_aktiveret != 'T'") or die(mysql_error());
while ($bruger = mysql_fetch_array($result3))
{
    $tid = time() - (60*60*24);
    if ($bruger['Oprettet_Dato'] < $tid)
    {
        echo $bruger['Brugernavn'].", ID:".$bruger['ID'].", Oprettet:".$bruger['Oprettet_Dato']."<br>";
        mysql_query("DELETE from brugere where ID = ".$bruger['ID']."") or die(mysql_error());
    }
}
?>
Avatar billede coderdk Praktikant
27. februar 2006 - 20:04 #3
while($nyhed = mysql_fetch_array($result)){
$result = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T'") or die(mysql_error());

og lidt nede:

$result = mysql_query("select * from brugere WHERE Bruger_aktiveret != 'T'") or die(mysql_error());

Du bruger $result for meget, kald dem noget andet?
Avatar billede coderdk Praktikant
27. februar 2006 - 20:04 #4
hehe nielle :)
Avatar billede nielle Nybegynder
27. februar 2006 - 20:11 #5
coderdk har ret (om end at det var de forkerte $result'er):

$result = mysql_query("select * from nyheder WHERE Mail_sendt != 'T'") or die(mysql_error());
while ($nyhed = mysql_fetch_array($result))
{
    $result = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T'") or die(mysql_error());
    // ...
    while ($bruger = mysql_fetch_array($result))
    {

Når du opretter den "indre $result" får du simpelthen ødelagt den "ydre $result".

Jeg har rettet navnene til $result1 og $result2 (foruden et par andre småting).
Avatar billede -kenner- Nybegynder
01. marts 2006 - 03:25 #6
Jeg har proevet koden, som i har foreslaaet, og der er opstaaet et nyt problem. Det er stadig kun whilen med emailen der bliver koert, og intet der efter. Hvis jeg taker email whilen ud, saa det kun er bruger opdateringerne der koerer bliver de koert. Min teori er at PHP giver en time out da det taget en voldsom lang tid at koerer filen selv om jeg kun har oprettet 27 midlertidige brugere.

Koderne:


<?php
//funktioner.php
function mailme($fromname, $fromaddress, $toname, $toaddress, $subject, $message)
{
  $headers  = "MIME-Version: 1.0\n";
  $headers .= "Content-type: text/html; charset=iso-8859-1\n";
  $headers .= "X-Priority: 3\n";
  $headers .= "X-MSMail-Priority: Normal\n";
  $headers .= "X-Mailer: php\n";
  $headers .= "From: \"".$fromname."\" <".$fromaddress.">\n";
  if(@mail($toaddress, $subject, $message, $headers))
{
return(true);
}
else
{
return(false);
}
}

function get_IP(){
    return $_SERVER['REMOTE_ADDR'];
    }

function Hot_mail($brugernavn, $email, $emne, $besked_HTML){
$besked = "<html>
<head>
<title>HoTML.dk | Det hotteste HTML!</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">
<style type=\"text/css\">
<!--
body{background-color:#E3E3C6;}
.banner_bg { background-image: url(images/Banner_nyhedsbrev.gif)}
.design { border:1px solid black; border-collapse:collapse;}
.design td { border:1px solid black; }
.pad { border:0px;}
.pad td { border:0px;}
.tekst { font-family: Tahoma; font-size: 12px; font-weight: normal; color: #000000; ; font-style: normal; line-height: normal; font-variant: normal}
A { font-family: Tahoma; font-size: 12px; font-weight: normal; font-style: normal; line-height: normal; font-variant: normal;}
A:active { color: #DFACA9; text-decoration: underline; }
A:visited { color: #DFACA9; text-decoration: underline; }
A:link { color: #DFACA9; text-decoration: underline; }
A:hover { color: #DFACA9; text-decoration: none; }
-->
</style>
</head>
<body bgcolor=\"#FFFFFF\" text=\"#000000\">
<center>
  <table width=\"700\" border=\"0\" class=\"design\">
    <tr>
      <td class=\"banner_bg\" height=\"105\"><img src=\"\" width=\"190\" height=\"1\"><img src=\"reklamer/hot_pic.gif\" width=\"468\" height=\"60\"></td>
  </tr>
  <tr>
      <td>
      <table height=\"100%\" width=\"100%\" class=\"pad\"><tr><td class=\"tekst\">
          Hej $brugernavn,<br><br>\n
          ".nl2br($besked_HTML)."
                \n<br><br>Venlig hilsen <a href=\"http://www.hotml.dk\">HoTML.dk</a> </p>
              </td></tr></table>
        </td>
  </tr>
</table>
</center>
</body>
</html>";
    if(mailme( "HoTML.dk | Det hotteste HTML!", "info@hotml.dk", "$brugernavn", "$email", "$emne", $besked)) {
      return true;
    }else{
      return false;
        }
}
//funktioner.php end
?>

<?php
include("funktioner.php");
db_connect();
select_db("hotml");
$result1 = mysql_query("select ID, Titel, Beskrivelse from nyheder WHERE Mail_sendt != 'T'") or die(mysql_error());
while ($nyhed = mysql_fetch_array($result1))
{   
    $besked = "Der er blevet tilføjet en ny kode, som muligvis har din interresse.    <br><br><b>" . $nyhed['Titel'] . "</b><br>" . $nyhed['Beskrivelse'];

    $result2 = mysql_query("select Brugernavn, Email from brugere WHERE Bruger_aktiveret = 'T'") or die(mysql_error());
    while ($bruger = mysql_fetch_array($result2))
    {
        if (Hot_mail($bruger['Brugernavn'], $bruger['Email'], "HoTML.dk - Ny kode - " . $nyhed['Titel'] . "!", $besked))
        {
            $sendt[] = "a";
        }
        else
        {
            $ikke_sendt[] = "b";
        }
    }

    $antal_sendt = (isset($sendt)) ? count($sendt) : $antal_sendt = 0;
    $antal_ikkesendt = (isset($ikke_sendt)) ? count($ikke_sendt) : 0;

    mysql_query("update nyheder set Mail_sendt='T', Antal_modtaget='" . $antal_sendt . "', Antal_umodtaget='" . $antal_ikkesendt . "' where ID=" . $nyhed['ID']) or die(mysql_error());
    echo $nyhed['Titel'] . "Modtaget: $antal_sendt, Umodtaget: $antal_ikkesendt, Nyhed ID:" . $nyhed['ID'] . "<br>";
}

$tid = time() - (86400);
$result3 = mysql_query("select ID, Brugernavn, Oprettet_Dato from brugere WHERE Bruger_aktiveret != 'T' and Sidst_login < '$tid'") or die(mysql_error());
while ($bruger = mysql_fetch_array($result3))
{
        echo $bruger['Brugernavn'].", ID:".$bruger['ID'].", Oprettet:".$bruger['Oprettet_Dato']."<br>";
        mysql_query("DELETE from brugere where ID = ".$bruger['ID']."") or die(mysql_error());
}
//Efter 60 dage inaktiv
$tid = time() - (5184000);
$result4 = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T' and Sidst_login < '$tid' and Advarsel = '0'") or die(mysql_error());
while ($bruger = mysql_fetch_array($result4))
{
        $besked ="Du har nu været inaktiv i 2 måneder og derfor modtager du denne mail, som en på mindelse om at når din bruger har været inaktiv i 3 måneder vil den, samt alle det gejl du har på den, blive slettet. Når din bruger først er slettet er der ingen data der kan genvindes da vi ikke tager back-up af vores bruger database.<br><br>Dette er den eneste advarsel du får, da den næste mail vil være en bekræftelse af at din bruger er blevet slettet. Hvis du logger ind vil advarslen dog blive nulstillet og du vil modtage endnu en påmindelse næstegang du har været inaktiv i to måneder.<br><br>
        <b>Bruger information</b><br>Brugernavn:". $bruger['Brugernavn']."<br>Kodeord:".$bruger['Kodeord']."1. Advarsel<br>";
      if (Hot_mail($bruger['Brugernavn'], $bruger['Email'], "HoTML.dk - Inaktivitet!", $besked))
        {
            mysql_query("update brugere set Advarsel='1' where ID=" . $bruger['ID']) or die(mysql_error());
              echo $bruger['Brugernavn'].", ID:".$bruger['ID'].", Oprettet:".$bruger['Oprettet_Dato']."<br>";
        }
}
//Efter 87 dage inaktiv
$tid = time() - (7516800);
$result5 = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T' and Sidst_login < '$tid' and Advarsel = '1'") or die(mysql_error());
while ($bruger = mysql_fetch_array($result5))
{
        $besked = "Om 3 dage har din bruger været inaktiv i 3 måneder og det betyder at den vil blive slettet fra HoTML.dk, sammen med alt hvad du har oprettet af gejl på siden. Så skynd dig at logge ind på siden, så du undgår fuldkommen slettelse.Dette er den eneste advarsel du får, da den næste mail vil være en bekræftelse af at din bruger er blevet slettet. Hvis du logger ind vil advarslen dog blive nulstillet og du vil modtage endnu en påmindelse næstegang du har været inaktiv i to måneder.<br><br>
        <b>Bruger information</b><br>Brugernavn:". $bruger['Brugernavn']."<br>Kodeord:".$bruger['Kodeord']." 2. Advarsel<br>";
      if (Hot_mail($bruger['Brugernavn'], $bruger['Email'], "HoTML.dk - 3 dage til sletning!", $besked))
        {
            mysql_query("update brugere set Advarsel='2' where ID=" . $bruger['ID']) or die(mysql_error());
            echo $bruger['Brugernavn'].", ID:".$bruger['ID'].", Oprettet:".$bruger['Oprettet_Dato']."<br>";
        }
}
//Efter 90 dage inaktiv
$tid = time() - (7776000);
$result7 = mysql_query("select * from brugere WHERE Bruger_aktiveret = 'T' and Sidst_login < '$tid' and Advarsel = '2'") or die(mysql_error());
while ($bruger = mysql_fetch_array($result7))
{
        $besked = "Din bruger er nu blevet slettet sammen med alt hvad du har oprettet på HoTML.dk, da du nu har været inaktiv i mere end 3 måneder.";
      if (Hot_mail($bruger['Brugernavn'], $bruger['Email'], "HoTML.dk - Bruger slettet!", $besked))
        {
            echo $bruger['Brugernavn'].", ID:".$bruger['ID'].", Oprettet:".$bruger['Oprettet_Dato']." DEL<br>";
            mysql_query("DELETE from brugere where ID=" . $bruger['ID']) or die(mysql_error());
        }
}
?>
Avatar billede nielle Nybegynder
01. marts 2006 - 20:50 #7
Timeout kunne godt være en forklaring på det du observere ... men keg kan nu ikke lige forstå hvorfor at det skulle tage så lang tid? 27 poster er da ingen ting.
Avatar billede -kenner- Nybegynder
01. marts 2006 - 23:59 #8
heller ikke jeg. Er der en anden maade at kode det paa for at undgaa mit problem?
Avatar billede -kenner- Nybegynder
02. marts 2006 - 00:00 #9
Fordi hvis siden giver time out ved 27 poster, saa toer jeg da slet ikke taenke paa hvad der vil ske naar jeg faar de ca. 15.000 brugere ind i databasen.
Avatar billede -kenner- Nybegynder
02. marts 2006 - 00:04 #10
Og den koerer de 30 sekunder det tager for at faa en time out, men den retunere ikke en fejl, men bare de resultater den har laver, men hvad der er underligt er at den stopper naar den har koert den foerste mail omk. nyheder, og alle 27 brugere har faaet den tilsendt, det er ikke saadan at den laver alle til den foerste, og saa 2 til den naeste, sa jeg beder den om at retunere en echo hvis der er blevet sendt bare en mail. Saa jeg tror stadig at der er et eller andet galt med den foerste while.
Avatar billede -kenner- Nybegynder
05. marts 2006 - 19:34 #11
Jeg har lokaliseret problemet. Problemet er min mail funktion, jeg ved dog ikke hvad det er der er galt, da der ikke bliver retuneret en direkte fejl. Det der sker er at der opstaar en time out, som jeg fandt ud af ved at udskrive alle brugere der blev koert igennem loekken, og den stoppede midt i anden nyhed.

Saa er mit spoergsmaal, hvad kan jeg goere for at undgaa denne time out. Jeg proevede at tage mail funktionen ud, og alle nyhederne var koert igennem med en fingerknips hastighed. Jeg har en tori om at det skyldes at jeg arbejder local saa der ikke er adgang til en mailserver, og scriptet venter paa en mail-timeout foer den gaa videre til den naeste bruger, men jeg er ikke sikker, er der nogen af jeg der kan bekraefte min teori?
Avatar billede nielle Nybegynder
05. marts 2006 - 20:49 #12
Er det din egen server, eller hoster du på et webhotel?
Avatar billede -kenner- Nybegynder
06. marts 2006 - 23:53 #13
hoster hos en ven der har sin egen server :)
Avatar billede nielle Nybegynder
07. marts 2006 - 06:53 #14
Spørg ham om hans mailserver er konfigureret til kun at ville udsende et bestemt antal mails pr. tidsenhed. Det er en ikke helt ualmindelig teknik for at modvirke at folk bruger mailserveren til at spamme med - hvis de ikke kan sende 1.000.000 mails ud pr. sekund.
Avatar billede -kenner- Nybegynder
20. marts 2006 - 02:35 #15
ok, det vil ejg tjekke op paa..
Avatar billede nielle Nybegynder
25. marts 2006 - 11:12 #16
Har du fået noget svar på det?
Avatar billede -kenner- Nybegynder
27. marts 2006 - 04:06 #17
Jeg har ikke faaet MySQL online endnu, saa jeg har ikke vaeret i stand til at tjekke det paa hans server online, da jeg, som naevnt tidligere, arbejder localt med easyPHP. jeg kan selvfoelgelig ikke sende emails fra en local server der ikke er connected online, saa min tanke er at den blive ved med at forsoege at sende den samme mail indtil den faar en time out, og saa gaar den videre til den naeste udskrivelse i databasen.

Da jeg er paa Hawaii lige i ojeblikket vil jeg ikke vaere istand til at uploade online i et stykke tid, men jeg vil smide et indlaeg naar jeg er kommet videre.
Avatar billede nielle Nybegynder
27. marts 2006 - 06:56 #18
Ummm, Hawaii :^)
Avatar billede nielle Nybegynder
07. maj 2006 - 15:16 #19
Tilbage endnu?
Avatar billede -kenner- Nybegynder
07. maj 2006 - 16:48 #20
ja, jeg forventer at faa testet mailsystemet idag, men det er ikke 100% sikkert, men jeg skal nok skrive naar jeg har faaet det gjordt :P
Avatar billede -kenner- Nybegynder
24. december 2006 - 17:56 #21
#OPRYDNING I GAMLE TRÅDE#

smid et svar :)
Avatar billede nielle Nybegynder
25. december 2006 - 00:13 #22
Svar smidt :^)

... og god jul!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester