dongshun5963 2011-04-20 03:00
浏览 87
已采纳

正则表达式和PHP $ _POST

all. I have a problem retrieving certain POST values incoming to a script I have set up. The POST keys are not changeable as they come from a request from PayPal. However I need some way to get these values dynamically.

When a person purchases multiple items, I get POST values returned such as:

item_name=foo
item_name1=bar
item_name2=blah

I was thinking that I'll have to do some sort of Regular Expression to get the values, but I'm not sure about the syntax, or if it's even possible to use RegEx on a superglobal.

maybe something like:

$exp = "/item_name(d+)/";
foreach($_POST as $key => $val)
{
    preg_match($exp,$key,$match);
}

As you can tell, I'm really bad with RegEx's. Any help would be greatly appreciated. :)

--EDIT--

Okay, there's two main POST keys that I need to catch. The problem is there may be any number (positive integer) after the key name:

item_name
item_name1
item_name2

item_number
item_number1
item_number2

But the ending digit can go all the way to 10, depending upon the number of products purchased. What I need to do is grab the values for each one of these, and add each item_number to a string to be inserted into a transaction table in my database. Perhaps something closer to:

$itms = '';
foreach($_POST as $key => $val)
{
    if (strpos($key, 'item_name') === 0)
    {
        if($itms = '')
        {
            $itms = $val;
        }
        else
        {
            $itms .= ','.$val;
        }
    }

    // don't really want to do it like this because i'd have to do it 10 times
    if (strpos($key, 'item_name1') === 0)
    {
        if($itms = '')
        {
            $itms = $val;
        }
        else
        {
            $itms .= ','.$val;
        }
    }
}
// insert into DB after collecting all values

And yes, this is from an IPN.

--EDIT 2 -- This is what I have for my IPN listener script:

     case 'ipnHandle' :
        $header = '';
        $retArray = array();
        $req = 'cmd=_notify-validate';

        foreach ($_POST as $key => $value)
        {
            $value = urlencode(stripslashes($value));
            $req .= "&$key=$value";
        }

        // post back to PayPal system to validate
        $header .= "POST /cgi-bin/webscr HTTP/1.0
";
        $header .= "Content-Type: application/x-www-form-urlencoded
";
        $header .= "Content-Length: " . strlen($req) . "

";
        $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

        // assign posted variables to local variables
        $item_name = $_POST['item_name'];
        $item_number = $_POST['item_number'];
        $payment_status = $_POST['payment_status'];
        $payment_amount = $_POST['mc_gross'];
        $payment_currency = $_POST['mc_currency'];
        $txn_id = $_POST['txn_id'];
        $receiver_email = $_POST['receiver_email'];
        $payer_email = $_POST['payer_email'];

        if (!$fp)
        {
            $err_msg = 'Could not open the Paypal site to Verify Transaction';
        }
        else
        {
            fputs ($fp, $header . $req);
            while (!feof($fp))
            {
                $res = fgets ($fp, 1024);
                if (strcmp ($res, "VERIFIED") == 0)
                {
                    if($_POST['receiver_email'] == "chaoskreator@gmail.com")
                    {
                        if($_POST['payment_status'] == 'Completed')
                        {
                            $sql = 'SELECT transaction_id FROM '.SHOP_TRANS_TABLE.' WHERE transaction_pid = '.$_POST['txn_id'];
                            $result = $db->sql_query($sql);
                            $row = $db->sql_fetchrow($result);
                            if($row != 0 && $row != null)
                            {
                                $id_exp = '/^item_number(\d*)$/';
                                $qty_exp = '/^quantity(\d*)$/';
                                $price_exp = '/^mc_gross(\d*)$/';

                                $items = array();
                                $qtys = array();
                                $prices = array();

                                foreach($_POST as $key => $val)
                                {
                                    $match = Array();
                                    if(preg_match($id_exp, $key, $match))
                                    {
                                        $items[] = $val;
                                    }
                                    if(preg_match($qty_exp, $key, $match))
                                    {
                                        $qtys[] = $val;
                                    }
                                    if(preg_match($price_exp, $key, $match))
                                    {
                                        $prices[] = $val;
                                    }
                                }
                            }
                        }
                    }

                    $itmStr = implode(",", $items);
                    $qtyStr = implode(",", $qtys);
                    $priceStr = implode(",", $prices);

                    $data = '';
                    $file = "verifyLog.txt";
                    $fh = fopen($file, "a+");
                    foreach($_POST as $key => $value)
                    {
                        if($data == '')
                        {
                            $data = '['.$key.']'.$value;
                        }
                        else
                        {
                            $data .= ',['.$key.']'.$value;
                        }
                    }
                    $data .= "
".$itmStr."
".$qtyStr."
".$priceStr;
                    fwrite($fh, $data);
                    fclose($fh);
                }
                else if (strcmp ($res, "INVALID") == 0)
                {
                    $data = '';
                    $file = "failLog.txt";
                    $fh = fopen($file, "a+");
                    foreach($_POST as $value)
                    {
                        if($data == '')
                        {
                            $data = '['.$key.']'.$value;
                        }
                        else
                        {
                            $data .= ',['.$key.']'.$value;
                        }
                    }
                    fwrite($fh, $data);
                    fclose($fh);
                }
            }
            fclose ($fp);
        }
    break;

And this is the response ans logged to verifyLog.txt, with no comma-delimited string appended to the end...:

[test_ipn]1,[payment_type]instant,[payment_date]20:47:04 Apr 19, 2011 PDT,[payment_status]Completed,[payer_status]verified,[first_name]John,[last_name]Smith,[payer_email]buyer@paypalsandbox.com,[payer_id]TESTBUYERID01,[business]seller@paypalsandbox.com,[receiver_email]seller@paypalsandbox.com,[receiver_id]TESTSELLERID1,[residence_country]US,[item_name]something,[item_number]AK-1234,[item_name1]somethingElse,[item_number1]1234346dfg,[quantity]1,[quantity1]1,[shipping]8.50,[tax]2.02,[mc_currency]USD,[mc_fee]0.44,[mc_gross]15.34,[mc_gross_1]12.34,[mc_handling]2.06,[mc_handling1]1.67,[mc_shipping]3.02,[mc_shipping1]1.02,[txn_type]cart,[txn_id]4420347,[notify_version]2.4,[custom]xyz123,[invoice]abc1234,[charset]windows-1252,[verify_sign]XXXXXXXXXXXX

This is drinving me nuts. lol

  • 写回答

4条回答 默认 最新

  • duanjing7459 2011-04-20 03:06
    关注

    If you are just matching a prefix, then regular expressions are arguably overkill. A simple string comparison such as the following would allow you to identify the items

    if (strpos($key, 'item_name') === 0) {
      // $key starts with item_name....
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能