У меня есть молчаливое сообщение при заполнении PayPal. Возвращает длинную строку вроде:
&AVSZIP = Х&ТИП = S&BILLTOEMAIL = нет% 40one.com
Я вставил жирную часть следующего сценария, который, как я нашел, искал вокруг и подумал, что это поможет. Возможно, я совершенно не понимаю, как это работает, но я подумал, что он определит $ proArray, а затем отправит его мне по электронной почте в немом посте. Он отправляет молчаливую почту, но внутри ничего нет.
Скажите, пожалуйста, нужна ли дополнительная информация или я просто идиот? Я также попробовал команду parse_str, но, полагаю, я тоже не знаю, как правильно это использовать.
<?php
//PLACE EMAIL BELOW:
$email="[email protected]";
$req = "";
if ($_POST)
{
// iterate through each name value pair
foreach ($_POST as $key => $value)
{
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
**// Function to convert NTP string to an array
function NVPToArray($req)
{
$proArray = array();
while(strlen($req))
{
// name
$keypos= strpos($req,'=');
$keyval = substr($req,0,$keypos);
// value
$valuepos = strpos($req,'&') ? strpos($req,'&'): strlen($req);
$valueval = substr($req,$keypos+1,$valuepos-$keypos-1);
// decoding the respose
$proArray[$keyval] = urldecode($valueval);
$req = substr($req,$valuepos+1,strlen($req));
}
}**
//write to file
$fh = fopen("logpost.txt", 'a');//open file and create if does not exist
fwrite($fh, "\r\n/////////////////////////////////////////\r\n");//Just for spacing in log file
fwrite($fh, $req);//write data
fclose($fh);//close file
//Email
$mail_From = "From: [email protected]";
$mail_To = $email;
$mail_Subject = "POST EXISTS";
$mail_Body = $proArray;
mail($mail_To, $mail_Subject, $mail_Body, $mail_From);
//
//if posted return echo response
echo $req;
}
// No post data received
if (empty($_POST))
{
//write to file
$fh = fopen("logpost.txt", 'a');//open file and create if does not exist
fwrite($fh, "\r\n/////////////////////////////////////////\r\n");//Just for spacing in log file
fwrite($fh, "Empty Post");//write data
fclose($fh);//close file
//Email
$mail_From = "From: [email protected]";
$mail_To = $email;
$mail_Subject = "Empty Post";
$mail_Body = "";
mail($mail_To, $mail_Subject, $mail_Body, $mail_From);
//if posted return echo response
echo "Empty Post";
}
?>
Там, кажется, много не так с этим сценарием.
Прежде всего, вы не вызываете свою новую функцию NVPToArray (), поэтому ни один из этого кода не будет выполнен.
Во-вторых, даже если вы вызывали эту функцию, она не возвращает proArray, поэтому данные будут потеряны.
В-третьих, вы пытаетесь присвоить $ proArray (который не определен в контексте, в котором вы его используете, и даже если бы это было так, вы вызываете не функцию NVPToArray () для ее заполнения) в $ mail_body, а в mail () функция принимает строку, а $ proArray будет массивом. Таким образом, даже если бы все остальное работало, когда $ proArray приведен как строка, все, что вы получите в своем почтовом теле, это слово «Array». Вы должны взять ключи и значения в $ proArray и сделать из него строку. Самый простой способ, вероятно, будет:
implode("\n", array_map(function($k, $v) { return $k . ' = ' . $v; }, array_keys($proArray), $proArray));
Который, учитывая массив:
array('AVSZIP' => 'X', 'TYPE' => 'S', 'BILLTOEMAIL' => '[email protected]')
вернется
AVSZIP = X
TYPE = S
BILLTOEMAIL = [email protected]
Чтобы ваш скрипт работал, я бы предложил вам внести следующие изменения:
1) Добавьте в конец функцию NVPToArray ().
return $proArray;
2) Затем замените строку
$mail_Body = $proArray;
с
$proArray = NVPToArray($req);
$mail_body = implode("\n", array_map(function($k, $v) { return $k . ' = ' . $v; }, array_keys($proArray), $proArray));
Похоже, все, что мне действительно нужно было сделать, это изменить одну строку:
$req .= "&$key=$value";
чтобы:
$req .= "$key = $value\n";
и оставьте $ req как $ mail_Body:
$mail_Body = $req;
И не использовать функцию NVPToArray вообще. Может быть, я объяснял это неправильно или не предоставлял контекст раньше (из-за собственного незнания сценариев), но это ответ, который я искал.
Теперь у меня другой вопрос по этому поводу, но это будет совсем другой пост.