[英]More than one instance of str_replace breaks php code
I am using phpmailer, and have customised it for my needs. 我正在使用phpmailer,并已根据我的需要对其进行了自定义。 Inside $templatemessage is the message to the customer with the fields {name} and {fuel}.
在$ templatemessage内是带有{name}和{fuel}字段的给客户的消息。
These two fields are replaced with the str_replace function. 这两个字段被替换为str_replace函数。
Before this problem appeared I just had the str_replace replace the {name} and this worked fine, with the name of the person being imported into that place. 在出现此问题之前,我只是用str_replace替换了{name},并且工作正常,使用了导入该地点的人员的姓名。 The problem arose when I added the extra str_replace function to replace the {fuel} with the $templatemessage value.
当我添加额外的str_replace函数以用$ templatemessage值替换{fuel}时出现了问题。 What happens now is the {fuel} value is imported, but it seems to be doing something to the {name} function as it no longer imports the name and instead displays only {name} in the emails, where as before I added the {fuel} it worked.
现在发生的是导入了{fuel}值,但是它似乎对{name}函数起了作用,因为它不再导入名称,而是在电子邮件中仅显示{name},就像我之前添加{加油}。 How can I get the two to play nicely with each other ?.
我怎样才能使两者彼此打得很好?
<?php
$formid = mysql_real_escape_string($_GET[token]);
$templatequery = mysql_query("SELECT * FROM hqfjt_chronoforms_data_addmailinglistmessage WHERE cf_id = '$formid'") or die(mysql_error());
$templateData = mysql_fetch_object($templatequery);
$gasoiluserTemplate = $templateData->gasoilusers;
$dervuserTemplate = $templateData->dervusers;
$kerouserTemplate = $templateData->kerousers;
$templateMessage = $templateData->mailinglistgroupmessage;
$templatename = $templateData->mailinglistgroupname;
require_once('./send/class.phpmailer.php');
$mailer= new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch
// Grab the FreakMailer class
require_once('./send/MailClass.inc');
// Grab our config settings
require_once('./send/config.php');
// Setup body
$htmlBody = '<!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=utf-8" />
<style>#title {text-align:center;font-family:"Times New Roman", Times, serif; font-size:130% !important; font-weight:bold; color:#fff;} .address {color:#fff; font-size:60%; font-family:Verdana, Geneva, sans-serif;}</style>
</head>
<body>
<div style="background:
none repeat scroll 0% 0% rgb(6, 38,
97); width:650px; height:auto;">
<img id="_x0000_i1030" style="padding-left:5%;padding-right:5%"
src="http://www.chandlersoil.com/images/newsletter/header.gif"
alt="Chandlers Oil and Gas"
border="0" height="112"
width="580">
<div id="title">' . $templateMessage . '</div>
<div style="background:#344ea2; width:501px; height:65px; margin-left:70px;"></div>
<div style="background:#13155C; height:30px; width:501px; margin-left:70px;"></div>
<div style="background:#fff; width:501px; height:365px; margin-left:70px;"></div>
<div style="background:
none repeat scroll 0% 0% rgb(6, 38,
97); height:60px; width:501px; margin-left:70px;"></div>
<div style="background:#000139;height:100px; width:580px; margin-left:35px;" >
<table cellspacing="0" cellpadding="0" class="address" style="margin-left:5px;">
<tr>
<td valign="top" width="21%"><p><strong>Chandlers Depots</strong></p>
<table class="address" border="0" cellpadding="0" cellspacing="0" width="87%">
<tbody>
<tr>
<td width="57%"><p>Grantham</p></td>
<td width="43%"><p>Spalding</p></td>
</tr>
<tr>
<td><p>Lincoln</p></td>
<td><p>Corby</p></td>
</tr>
<tr>
<td><p> Spilsby</p></td>
<td><p>Retford</p></td>
</tr>
</tbody>
</table></td>
<td valign="top" width="79%"><p><strong>Address<br />
<br />
</strong>Chandlers Oil & Gas, Warren Way, Alma Park, Grantham, Lincolnshire, NG31 9SE<br />
<br />
<strong>TEL: </strong>08456 202010 <strong>FAX:</strong> 01476 568147 <strong>E-Mail: </strong><a href="mailto:websitesales@chandlersoil.com">websitesales@chandlersoil.com</a></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><p align="right"> </p></td>
</tr>
</tbody>
</table></td>
</tr>
</table>
</div>
</div>
</body>
</html>
';
$textBody = "$templateData->mailinglistgroupmessage";
// instantiate the class
$mailer = new FreakMailer();
// Get the user's Email
$sql = mysql_query("SELECT leadname,businessname,email,mailtype FROM hqfjt_chronoforms_data_addupdatelead WHERE keromailinglist='$kerouserTemplate' AND dervmailinglist='$dervuserTemplate' AND gasoilmailinglist='$gasoiluserTemplate'");
while($row = mysql_fetch_object($sql))
{
// Send the emails in this loop.
$name = $row->leadname;
$businessname = $row->businessname;
$to_email = $row->email;
$mailtype = $row->mailtype;
if(!empty($row->businessname))
{
$name .= ' '.$row->leadname;
}
$to_name = $name;
if($row->mailtype == 'html')
{
$mailer->Body = str_replace('{name}', $name, $htmlBody);
// the line below is the new one I have added
$mailer->Body = str_replace('{fuel}', $templatename, $htmlBody);
$mailer->isHTML(true);
$mailer->AltBody = str_replace('{name}', $name, $textBody);
$mailer->AddAddress($to_email, $name);
$mailer->Subject = "Your Fuel Prices From Chandlers Oil & Gas";
$mailer->FromName = "Chandlers Oil & Gas";
}
else
{
$mailer->Body = str_replace('{name}', $name, $textBody);
// the line below is the new one I have added
$mailer->Body = str_replace('{fuel}', $templatename, $textBody);
$mailer->isHTML(false);
$mailer->Subject = "Your Fuel Prices From Chandlers Oil & Gas";
$mailer->FromName = "Chandlers Oil & Gas";
$mailer->AddAddress($to_email, $name);
}
$mailer->Send();
$mailer->ClearAddresses();
$mailer->ClearAttachments();
$mailer->IsHTML(false);
echo "Mail sent to: $name - $to_email<br />";
}
?>
I would start by trying this: 我将从尝试此开始:
$mailer->Body = str_replace(array('{name}', '{fuel}'), array($name, $templatename), $textBody);
If search and replace are arrays, then str_replace() takes a value from each array and uses them to search and replace on subject.
如果search和replace是数组,则str_replace()从每个数组中获取一个值,并使用它们对主题进行搜索和替换。 If replace has fewer values than search, then an empty string is used for the rest of replacement values.
如果replace的值少于搜索的值,则将空字符串用于其余的替换值。 If search is an array and replace is a string, then this replacement string is used for every value of search.
如果search是一个数组,而replace是一个字符串,那么此替换字符串将用于search的每个值。 The converse would not make sense, though.
但是,相反没有道理。
If search or replace are arrays, their elements are processed first to last.
如果search或replace是数组,则它们的元素将首先处理。
The problem is your code: 问题是您的代码:
//Here you set $mailer->Body = $htmlBody (while replacing {name})
$mailer->Body = str_replace('{name}', $name, $htmlBody);
// the line below is the new one I have added
//Here you set $mailer->Body = $htmlBody (while replacing {fuel})
$mailer->Body = str_replace('{fuel}', $templatename, $htmlBody);
The problem is you are overriding $mailer->Body in the second str_replace()
what you need to do is use $mailer->Body instead of $htmlBody 问题是您要在第二个
str_replace()
中覆盖$ mailer-> Body,您需要做的是使用$ mailer-> Body而不是$ htmlBody
$mailer->Body = str_replace('{fuel}', $templatename,$mailer->Body);
A better solution would be that as posted above (using an array with str_replace()) but I wanted to point out the actual bug in your code. 更好的解决方案是如上所述(使用带有str_replace()的数组),但是我想指出代码中的实际错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.