Avatar billede blach Nybegynder
11. august 2004 - 20:46 Der er 18 kommentarer og
1 løsning

Nyhedsmail - sleep + database spørgsmål

Min nyhedsmail skal sende mails ud hurtigere. Kan jeg gøre det med sleep funktionen?
Og hvad gør jeg, når nogen har tilmeldt sin mail flere gange i databasen, men den kun skal sende 1 gang til hver mail adresse?

--code--
$query = mysql_query("SELECT * ...") or die(mysql_error());
while($brev = mysql_fetch_array($query)){

$recipient = "$brev[mail]";

$subject = "$_POST[emne]";

$message = "Hej $brev[navn]<br>";

$message .= "$_POST[msgbox] <br>";

$headers .= "from: $afsender \n";

$headers .= "Content-type: text/html";

mail($recipient, $subject, $message, $headers);

echo "<BR><i>Mail afsendt: $brev[mail]</i>";
}

--cut--
Avatar billede coderdk Praktikant
11. august 2004 - 20:55 #1
Hurtigere? Det kan vel ikke gøres med sleep, da den laver pauser ;)
Du kan lade være med at sende til personerne personligt, men sætte dem på BCC, og så sende til f.eks. 10-20 ad gangen. Altså sæt dig selv eller en "bogus" adresse som recipient, og tilføj folk til headerne:

  $headers .= "BCC: email1@example.dk; email2@example.dk; email3@example.dk\r\n";

Du burde lave dit tilmeldingsscript så de ikke KAN tilmelde sig flere gange, men du kan hive unikke ud sådan:

SELECT DISTINCT( emailfeltet ) FROM nyhedsbrevstabellen;

:)
Avatar billede blach Nybegynder
11. august 2004 - 21:11 #2
fik bare at vide at hvis man satte
sleep '1'; så ville den kun bruge et sekund pr. mails - i stedet for at gå i stå ved hver enkelt (pga. noget firewall/spam kontrol på serveren)
Avatar billede blach Nybegynder
11. august 2004 - 21:12 #3
coderdk --> du kan garanteret også svare på hvordan jeg sender et billede med sådan en mail?
http://www.eksperten.dk/spm/528406
Avatar billede blach Nybegynder
11. august 2004 - 21:31 #4
Er dette her rigtigt? (der er både navn & mail)
"SELECT navn,DISTINCT(mail) FROM "...
Avatar billede coderdk Praktikant
11. august 2004 - 21:53 #5
Nej, syntaksen er SELECT DISTINCT felt1, felt2, felt3 - Her er vil felt1+felt2+felt3 tilsammen være unikke.
Altså:

SELECT DISTINCT navn, mail FROM ....

Du vil få dubletter de har skrevet forskellige navne med den samme email ;)

Alternativt lav din løkke sådan:

$mails = array();
while($brev = mysql_fetch_array($query)){
$mail = strtolower( trim( $brev['mail'] ) );
if ( !in_array( $mail, $mails ) )
{
  $mails[] = $mail;

$recipient = $mail;

$subject = "$_POST[emne]";

$message = "Hej $brev[navn]<br>";

$message .= "$_POST[msgbox] <br>";

$headers .= "from: $afsender \n";

$headers .= "Content-type: text/html";

mail($recipient, $subject, $message, $headers);

echo "<BR><i>Mail afsendt: $brev[mail]</i>";
}
}
Avatar billede coderdk Praktikant
11. august 2004 - 21:56 #6
Mig der forvirrede dig med DISTINCT( felt ), det hedder DISTINCT felt ;)
Avatar billede blach Nybegynder
11. august 2004 - 22:04 #7
yup.. tak! jeg prøver lige at køre det en tur senere...
Avatar billede blach Nybegynder
11. august 2004 - 22:47 #8
Virker vist meget godt..

men hvorfor skriver den disse fejlmeddelser (skulle sende til 600)
Warning: mail(): SMTP server response: 452 Message for <webmaster@wsy.dk> would exceed mailbox quota in d:\webroot\...\nyhedsbrev.php on line 88

Warning: mail(): SMTP server response: 452 Message for <webmaster@wsy.dk> would exceed mailbox quota in d:\webroot\...\nyhedsbrev.php on line 88
Avatar billede coderdk Praktikant
12. august 2004 - 00:28 #9
Fordi webmaster@wsy.dk's postkasse er fyldt :) Det er kun en warning, du kan undertrykke den ved at smide et @ foran mail()
Avatar billede blach Nybegynder
12. august 2004 - 08:49 #10
OK, det prøver jeg lige...

og tak for hjælpen!
Avatar billede blach Nybegynder
12. august 2004 - 16:00 #11
CoderDK --> Har lige et lille spørgsmål som jeg håber du vil hjælpe med.. Det er omkring det du sagde med at man ikke må kunne oprette en profil 2 gange.. Men hvad gør man hvis de har klikket på knappen "opret" og så kliker på F5 bagefter??
Kan man lave et eller andet smart hvor den hopper et andet sted hen eller melder fejl?

Min kode er således:

if ($submit) {
  //indsætter i database og skriver profil oprettet
} else {
  //her er forms mv. (knap med $submit)
}
Avatar billede coderdk Praktikant
13. august 2004 - 01:32 #12
F.eks. kunne du i din oprettelsesformular smide en:

echo "<input type='hidden' name='submit_id' value='" . md5( microtime() ) . "'>";

Når du så submitter første gang, så tilføje følgende kode til modtagende side:

<?php

  session_start();

  if ( isset( $_SESSION['submitArray'] ) && in_array( $_POST['submit_id'], $_SESSION['submitArray'] ) )
  {
    // Gør intet? Denne formular har været submittet.
  }
  else
  {
    $_SESSION['submitArray'][] = $_POST['submit_id'];
    // Resten af din kode her, til at oprette brugeren
  }

?>

Dette princip kan du bruge i alle dine forms. "submit_id" er en MD5-hash af microtime(), og vil derfor være rimelig unik for en bruger ;) Vi opretter så en sessionsvariabel som er et array der så skal indeholde alle de submit_id'er som brugeren har submittet. Dette betyder at brugeren ikke kan gå tilbage og bruge samme formular hvis han vil submitte en ny form. Dette kan dog omgås ved at tvinge browseren til ikke at cache formularsiden, så vil brugeren få en ny ID hver gang.
Avatar billede coderdk Praktikant
13. august 2004 - 01:33 #13
Hmm det burde nok rettes til:

  if ( isset( $_SESSION['submitArray'] ) && in_array( $_POST['submit_id'], $_SESSION['submitArray'] ) )
  {
    // Gør intet? Denne formular har været submittet.
  }
  else
  {
    if ( !isset( $_SESSION['submitArray'] ) )
    {
      $_SESSION['submitArray'] = array();
    }
    $_SESSION['submitArray'][] = $_POST['submit_id'];
    // Resten af din kode her, til at oprette brugeren
  }
Avatar billede blach Nybegynder
13. august 2004 - 10:24 #14
OK.. men se lige mine spørgsmål:

session_start();

  if ( isset( $_SESSION['submitArray'] ) && in_array( $_POST['submit_id'], $_SESSION['submitArray'] ) )
  {
    // Gør intet - dvs. her skal mine <FORM>'s være?
  }
  else
  {
    if ( !isset( $_SESSION['submitArray'] ) )
    {
      $_SESSION['submitArray'] = array();
      //Hvad skal der ske her? Er det her vi indsætter brugeren i databasen?
    }
    $_SESSION['submitArray'][] = $_POST['submit_id'];
    // Resten af din kode her, til at oprette brugeren - dvs. <FORM>'s ?
  }


Og ved mine forms skal jeg bruge denne knap?
echo "<input type='hidden' name='submit_id' value='" . md5( microtime() ) . "'>";
Avatar billede blach Nybegynder
13. august 2004 - 10:25 #15
Ikke knap, men den <input> box skal være sat, ikke?
Avatar billede coderdk Praktikant
13. august 2004 - 10:52 #16
>OK.. men se lige mine spørgsmål:

Ok :)

>session_start();

>  if ( isset( $_SESSION['submitArray'] ) && in_array( $_POST['submit_id'], $_SESSION['submitArray'] ) )
>  {
>    // Gør intet - dvs. her skal mine <FORM>'s være?
// Nej, her behøver du ikke gøre noget som helst :) Dette script skal være på siden som modtager form-data! Altså den du POST'er til!
>  }
>  else
>  {
>    if ( !isset( $_SESSION['submitArray'] ) )
>    {
>      $_SESSION['submitArray'] = array();
>      //Hvad skal der ske her? Er det her vi indsætter brugeren i databasen?
// Nej her skal ikke være andet, her sætter vi bare sessionsvariablen hvis den ikke er sat...
>    }
>    $_SESSION['submitArray'][] = $_POST['submit_id'];
>    // Resten af din kode her, til at oprette brugeren - dvs. <FORM>'s ?
//Nej, her gemmer du data, altså opretter brugeren!
>  }
>
>
>Og ved mine forms skal jeg bruge denne knap?
>echo "<input type='hidden' name='submit_id' value='" . md5( microtime() ) . "'>";

Ja du indsætter blot sådan et hidden felt i din formular :)

Jeg deler altid mine scripts op så der er ét til formen, og ét til at modtage formen - Du kan dog godt skrive dem sammen hvis du vil :)
Avatar billede blach Nybegynder
13. august 2004 - 12:08 #17
jamen hvordan skriver jeg dem så sammen? altså hvis min form er:
<FORM method="POST" action="'.$php_self.'">

Kan du ikke vise et eksempel hvor <FORM>'en forsvinder når man klikker "opret". -og stadig med den session kode du har lavet... (hvor det hele ligger i en fil)
Avatar billede coderdk Praktikant
13. august 2004 - 13:21 #18
<?php

    session_start();

    if ( isset( $_POST['submit_id'] ) )
    {
        if ( isset( $_SESSION['submitArray'] ) && in_array( $_POST['submit_id'], $_SESSION['submitArray'] ) )
        {
            // Gør intet, evt skriv at data allerede er gemt.
        }
        else
        {
            if ( !isset( $_SESSION['submitArray'] ) )
            {
              $_SESSION['submitArray'] = array();
            }
            $_SESSION['submitArray'][] = $_POST['submit_id'];
            $sql = "insert into bruger set brugernavn='$_POST[brugernavn]' osv osv";
            // osv
        }
        echo "Data er gemt.";
    }
    else
    {
        // Vis din form
    }

?>
Avatar billede blach Nybegynder
13. august 2004 - 15:54 #19
Kanon :) Jeg tester det lige senere...
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