[PHP] Ereg replace werkt maar één keer in for loop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb eens scriptje gemaakt dat nieuwsberichten rondstuurt naar een ieder die is ingeschreven. Gezien ik een persoonlijke aanhef wil beginnen de mails met Geachte {naam}. Het werkt allemaal perfect totdat ik meerdere mails verstuur (dus wanneer er meer dan één persoon op de lijst staat). De mails komen allemaal goed aan, maar de naam blijft altijd hetzelfde, namelijk de naam uit de eerst verstuurde email, daarnaast wordt een extra enter toegevoegd.

De kern is:
PHP:
1
2
3
4
5
6
7
8
9
10
$sql = mysql_query("SELECT * FROM newsletter");  
$ammount = mysql_num_rows($sql);  
for ($i=0; $i<$ammount; $i++)  
{  
  $row = mysql_fetch_array($sql);  
  $receiver = $row["receiver"];  
  $fullname = $row["fullname"];  
  $content = ereg_replace("{name}",$fullname,$content);  
  mail($receiver, $subject, $content, "From: $mail");  
}


Ik heb het ook met een while loop geprobeerd en een assoc array.

PHP:
1
2
3
4
5
6
$sql = mysql_query("SELECT * FROM newsletter");  
while($row = mysql_fetch_assoc($sql)) 
{ 
  $content = ereg_replace("{name}",$row['fullname'],$content);  
  mail($row['receiver'], $subject, $content, "From: $mail");  
}


Ook heb ik een str_replace gedaan en andere mogelijkheden, maar ik kom er niet uit. Alles lijkt goed te zijn, de mails komen ook allemaal aan alleen dan niet met de juiste naam.

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:01

Reinier

\o/

De eerste keer replace je een stukje van de string $content, de tweede keer komt "{name}" daar niet meer in voor (is in je eerste iteratie immers vervangen) :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat krijg je dus als je er té lang over aan het kijken bent, je ziet het niet meer.. Ik heb dit samen met een vriend (tevens beginnend PHP-prutser) uren beken en de oplossing is zo simpel.. Niets anders dan $content = ereg_replace(fullname,"{name}",$content); na de mailfunctie zetten.

Bedankt voor je hulp, het werkt eindelijk! Nou maar eens phpmailer integreren.

[ Voor 15% gewijzigd door Verwijderd op 11-12-2006 01:06 ]


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:01

Reinier

\o/

Leuk dat je het snapt en dat het werkt :) Maareh:
Niets anders dan $content = ereg_replace(fullname,"{name}",$content); na de mailfunctie zetten.
Dát snap ik dan weer niet. Dat kan volgens mij je probleem niet oplossen ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Reinier schreef op maandag 11 december 2006 @ 01:10:
Leuk dat je het snapt en dat het werkt :) Maareh:

[...]

Dát snap ik dan weer niet. Dat kan volgens mij je probleem niet oplossen ;)
Typo :)

Ik bedoelde
$content = ereg_replace($fullname,{name},$content);

Dus de variabel $fullname wordt weer vervagen door {name}

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 19:01

Reinier

\o/

Dat is gevaarlijk, stel dat $fullname toevallig in $content voorkomt, dan ga je hier gruwelijk de mist in.

Wat veiliger is:

PHP:
1
2
3
$content = "Hoi {name}, dit is een bijzonder stoer nieuwsbericht" ;
$content_replaced = ereg_replace( "{name}" , $fullname , $content ) ;  
mail( $receiver, $subject, $content_replaced , "From: $mail" ) ;


Zoiets :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat ziet er inderdaad beter uit ja, thanks!

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Waarom ereg_replace?

Het kan ook zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$contentAanhef = "Beste heer/mevrouw ";
$contentBody = "de rest van je content";

$sql = mysql_query("SELECT * FROM newsletter");  
$ammount = mysql_num_rows($sql);  
for ($i=0; $i<$ammount; $i++)  
{  
  $row = mysql_fetch_array($sql);  
  $receiver = $row["receiver"];  
  $fullname = $row["fullname"];   

  $content = $contentAanhef
  $content .= $fullname;
  $content .= $contentBody;

  mail( $receiver, $subject, $content , "From: $mail" ) ; 
}


Dit geeft je wat meer controle over de plaatsing van de naam. Op deze manier kan je de naam ook eenvoudig in de voet van het bericht zetten.

[ Voor 24% gewijzigd door EnsconcE op 11-12-2006 09:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb ook aan jouw mogelijkheid gedacht, alleen de scriptsels die ik fabriceer zijn puur voor mezelf om er iets van te leren, vandaar dat ik voor ereg_replace heb gekozen.

Ik heb wel nog een kleine andere vraag mbt hetzelfde script. Ik heb nu addslashes($content), simpelweg om ' en " toe te staan. Als ik $content uit een database zou halen verwijder ik die slashes weer. Met mail() is dit iets anders? Iemand een suggestie hoe ik wel ' en " kan toestaan maar geen \' in het mailtje krijg? Ik heb gedacht aan str_replace en dan &quote; of iets dergelijks, maar ik wil de mails plat versturen, dus zonder html.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 11 december 2006 @ 15:34:
Ik heb ook aan jouw mogelijkheid gedacht, alleen de scriptsels die ik fabriceer zijn puur voor mezelf om er iets van te leren, vandaar dat ik voor ereg_replace heb gekozen.

Ik heb wel nog een kleine andere vraag mbt hetzelfde script. Ik heb nu addslashes($content), simpelweg om ' en " toe te staan. Als ik $content uit een database zou halen verwijder ik die slashes weer. Met mail() is dit iets anders? Iemand een suggestie hoe ik wel ' en " kan toestaan maar geen \' in het mailtje krijg? Ik heb gedacht aan str_replace en dan &quote; of iets dergelijks, maar ik wil de mails plat versturen, dus zonder html.
als je iets in de database zet kun je beter mysql_real_escape_string() dan addslahes gebruiken, deze plaatst enkel slashes waar nodig om een valide query te maken, zo bouw je veilige queries maar beland er geen rommel in je database die je niet hebt ingetypt
Pagina: 1