Разбор строки запроса для отправки в виде массива в тихом сообщении (php)

0

У меня есть тихий пост, сделанный при заполнении платежного потока PayPal. Он возвращает длинную строку, например:

& AVSZIP = Х & TYPE = 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";
}

?>
Теги:
arrays
parsing
paypal
silent-post

2 ответа

0
Лучший ответ

Похоже, что мне действительно нужно было изменить одну строку:

$req .= "&$key=$value";

чтобы:

$req .= "$key = $value\n";

и сохраняйте $ req как $ mail_Body:

$mail_Body = $req;

И вообще не использовать функцию NVPToArray. Возможно, я объяснял это неправильно или не предоставлял контекст раньше (из-за моего собственного незнания скриптов), но это тот ответ, который я искал.

Теперь у меня другой вопрос, но это будет совсем другое дело.

0

В этом скрипте, похоже, много чего не так.

Прежде всего, вы не вызываете свою новую функцию NVPToArray(), поэтому ни один из этих кодов не выполняется.

Во-вторых, даже если вы вызывали эту функцию, она не возвращает proArray, так что данные будут потеряны.

В-третьих, вы пытаетесь назначить $ proArray (который не определен в контексте, который вы используете, и даже если это так, вы не вызываете функцию NVPToArray(), чтобы заполнить ее) в $ mail_body, но почта() принимает String, а $ proArray будет массивом. Поэтому, даже если все остальное работает, когда $ proArray исполняется в виде строки, все, что вы получили бы в своем теле письма, будет словом "Массив". Вы должны взять ключи и значения в $ 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));
  • 0
    Спасибо Марк. Я внес эти изменения, но он все еще просто возвращает пустое письмо. Должно быть, я что-то упускаю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню