0

在用于电子商务的 wordpress 主题插件中,我有两个 ajax/php 脚本设置 cookie(都在同一个目录中) ajax 调用是从同一个“cart.js”设置的 第一个脚本设置/更新匿名购物车 cookie创建或更新购物车。第二个检查客户/用户是否存在,或者重新创建一个 - 在任何一种情况下 - 如果还没有 - 在购物车传递给 PayPal 之前将它们登录。因此,在从贝宝返回时,客户/用户(现在已登录)会看到他们的订单状态(新的和旧的)的概述/审查。

在我的 WAMP 开发堆栈上,这完美无缺,而在托管(Linux)安装上,cart_cookie 脚本按预期工作,而 checkout/customer_cookie 抛出......

[14-May-2013 02:08:50]
PHP Warning:  session_start()
    [<a href='function.session-start'>function.session-start</a>]:
        Cannot send session cache limiter - headers already sent
            (output started at /home2/alternam/public_html/demo/wp-content/themes/AM_Wallaby_Kids/checkout.php:2)
                in /home2/alternam/public_html/demo/wp-content/plugins/cat-man/catalog-manager.php on line 23

随后,用户未登录,购物车未转换使用相关客户数据更新)。希望我能找到一种将其减少到最低限度的方法,但由于我不知道为什么这两个脚本在平台上的行为如此不同,我会提前为这篇冗长的帖子道歉,并将它们全部包含在下面,并询问如果有人能看出这种差异的一些明显原因吗?谢谢你的耐心。

PS 运行 php 5.2 的 WAMP 和 LAMP 堆栈

cart_add.php(适用于 WAMP && LAMP)

<?php
ob_start();
require_once(preg_replace("/wp-content.*/","wp-load.php",__FILE__));
ob_end_clean();
$ud_cart = $product_name = $product_url = $reset = "";
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);# Sanitize Post Input
foreach ($_POST as $key => $val)
{    if(!is_array($val)) $$key = html_entity_decode($val,ENT_QUOTES);
    else $$key = $val;
}
if($ud_cart)
{    $reset =1;
    $amt_cart[0] = $cart_id;
    if(@$items) foreach($items as $key => $item )$amt_cart[] = $item;
    $amt_cart = serialize($amt_cart);
}

if($reset)
{    //    Initiated from the cart (tpl_cart.php on page load) to remove out-of-stock items
    //    from OLD CARTS -- where items have gone out-of-stock since cart created -- OR
    //    to simply update/remove cart items upon user request (user clicks Update|Remove)
    if($amt_cart)
    {    $amt_cart = stripslashes($amt_cart);
        setcookie(AMART_CART, $amt_cart, time()+60*60*24*90, COOKIEPATH, COOKIE_DOMAIN);
    }
    exit;
}

// Create Cart, and add, update, or remove Cart-Items from within the catalog gallery && product detail pages
$add = array("product_id" => $product_id, "product_name" => $product_name, "product_type" => $product_type,"product_url" => $product_url,"qty" => $qty);
$update = "";
if( isset( $_COOKIE[AMART_CART] ) )
{    $amt_cart = stripslashes($_COOKIE[AMART_CART]);
    $amt_cart = unserialize($amt_cart);
    foreach($amt_cart as $key => $item)
    {    if($key == 0 ) $amt_cart_id = $item;
        else
        {    foreach($item as $attr => $value)
            {    if($product_id != $value) continue;
                else
                {    $update = 1;
                    if($qty == 0 )
                    {    unset($amt_cart[$key]);
                         break;
                    } else     $amt_cart[$key]['qty'] = $qty;
                }
            }
        }
    }
    if(!$update) $amt_cart[] = $add;
    setcookie(AMART_CART,  serialize($amt_cart), time()+60*60*24*90, COOKIEPATH, COOKIE_DOMAIN);
}
else
{    unset($_SESSION[STORE_ID]['dest_zip'], $_SESSION[STORE_ID]['dest_ctry']);
    $amt_cart[0] = uniqid(AMART_CART);
    $amt_cart[] = $add;
    setcookie(AMART_CART, serialize($amt_cart), time()+60*60*24*90, COOKIEPATH, COOKIE_DOMAIN);
}
?>

checkout.php(在 WAMP 上工作,在 LAMP 上失败)

    <?php
// TPL CART POSTS VIA AJAX CALL IN cart.js
ob_start();
require_once(preg_replace("/wp-content.*/","wp-load.php",__FILE__));
ob_end_clean();

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
global $current_user, $wpfx;
$buyer_address1 = $buyer_address2 = $buyer_city = $buyer_region = $buyer_postal_code = $buyer_country = $buyer_ctry_code ="";

foreach ($_POST as $key => $val) $$key = $val;
foreach($buyer as $key => $val) $$key = $val;

$user_is_admin = current_user_can('manage_options');
if(!is_user_logged_in() || $user_is_admin )
{    if($userID = email_exists($email))
    {    $user_info = $user_info = get_userdata($userID);
        $user_login = $user_info->user_login;
        $display_name = $user_info->display_name;
        $welcome = "Welcome Back $display_name!";
    }
    if(@$welcome)
    {    if(!$user_is_admin )
        {    if(!$user_cnfm) die($welcome);
            $auth = get_object_vars(wp_authenticate($user_login, $user_pass));
            if(array_key_exists('errors',$auth)) die("Password Error");
            wp_set_auth_cookie( $userID, true);
            wp_set_current_user($userID, $user_login);
        }
        update_user_meta( $userID, 'customer', 1);
    }
    else
    {    $buyer_name = "$buyer_first $buyer_last";
        $ship_to_name = "$first_name $last_name";
        if($ship_to_self)
        {    foreach ( $ctry_opts as $key=>$value ) if (strcasecmp($country, $value) == 0) $buyer_country = $key;
            $buyer_address1 = $address1;
            $buyer_address2 = $address2;
            $buyer_city = $city;
            $buyer_region = $state;
            $buyer_postal_code = $zip;
            $buyer_ctry_code =strtolower($country);
        }    else foreach ( $ctry_opts as $key=>$value ) if ($buyer_ctry_code == $value) $buyer_country = $key;
        $userdata = $user_cookie = array(
            'user_login' => $email,
            'user_email'=> $email,
            'user_pass'=>$user_pass,
            'first_name'=>$buyer_first,
            'last_name'=>$buyer_last,
            'display_name' =>$buyer_name,
            'address1' => $buyer_address1,//null if not ship to self
            'address2' => $buyer_address2,//null if not ship to self
            'city' => $buyer_city,//google guess if not ship to self
            'region' => $buyer_region,//google guess if not ship to self
            'postal_code' => $buyer_postal_code,//null if not ship to self
            'country' => $buyer_country,//google guess if not ship to self
            'ctry_code' => $buyer_ctry_code,//google guess if not ship to self
            'customer' => '1'
        );
        $userID = wp_insert_user( $userdata );
        if(!$user_is_admin)
        {    wp_set_auth_cookie( $userID, true);
            wp_set_current_user($userID, $email);
        }
        unset($user_cookie['user_login'],$user_cookie['user_pass'],$user_cookie['display_name']);
        setcookie('AMART_CUSTOMER', serialize($user_cookie), time()+60*60*24*180, COOKIEPATH, COOKIE_DOMAIN);
    }
}
if(is_user_logged_in())
{    if(!$user_is_admin) $userID = $current_user->ID;
    $cart_id = $item_name;
    $cart = $wpdb->get_row("SELECT * FROM {$wpfx}amt_carts WHERE cart_id = '$cart_id'", ARRAY_A);
    if( $cart['host_checkout'] && isset($store_options->paypal_live) && $store_options->paypal_live !=='false')
        $host_checkout = true;
    $ship_to = serialize( array('first_name' => $first_name,'last_name' => $last_name,'address1' => $address1,'address2' => $address2,'city' => $city,    'state' => $state,'postal_code' => $zip,'country' =>$country));
    $attributes = array('ship_to' => $ship_to, 'customer_id'=>$userID, 'checkout_date'=>$now);
    $where = array('cart_id' => $cart_id);
    $wpdb->update("{$wpfx}amt_carts", $attributes,$where);
}
?>
4

2 回答 2

1

我相信这是由于 PHP 配置的不同。除了广泛的指导方针之外,如果不知道 POST 变量的完整列表,我无法告诉您更多信息。

这就是我认为导致问题的原因:

  1. 您将 $_POST[key] 分配给 $key。这可以
  2. 然后,您将遍历 $buyers。如果 $_POST["buyers"] 未设置或不是数组,则会发出通知。
  3. 通知是回声。您不在输出缓冲上下文中,因此会导致标头也被发送。如果标头已发送,而您稍后发送了 cookie 或其他标头信息,则会收到您收到的警告。

您的开发环境之一可能将 error_reporting 设置为 E_NONE。在 PHP 信息中检查这一点。如果设置为 E_NONE,您的代码将起作用。如果没有,您将收到该消息。考虑始终检查函数的存在和正确类型。一个简洁的好方法如下:

foreach (((array)$buyers) as $v) {

如果 $buyers 未定义,您将得到一个空数组。如果买家有一个元素,您将拥有一个包含一个元素的数组。否则,您将获得您拥有的数组。

于 2013-05-14T15:49:53.900 回答
0

好的...

尽管 Sébastien 的回答很有意义(在某些方面甚至是正确的),并且感谢他指出通知级别错误本质上是导致发送标头的回声,并展示了一种新方法(我)确保一个数组存在于一个foreach循环中......问题实际上似乎源于Linux和Windows换行符之间的差异,我在打开托管的“ cart_add.php ”(来自FileZilla ftp)进行编辑时发现了这一点记事本++。我很惊讶地发现每一行代码都有额外的换行符。(不是文件的写入方式)。一时兴起,我突出显示了第一个双换行符,并将所有替换为 \n。上传文件(之前在任一堆栈上都有效cart_add.php随后返回一个错误,表明没有这样的函数- phpob_start

啊哈!

在我的 windows 盒子上,在Notepad++中编码并在Beyond Compare中比较文件,托管的(Linux)文件似乎是本地源文件的精确副本,但是文件大小讲述了一个不同的故事(本地/windows 文件总是更大),我怀疑归因于 windows中换行符 ( \n\r ) 和linux 上( \n ) 的不同。

现在,我面临的问题是

  1. 了解为什么用\nLinux 标准)替换(在 Notepad++ 中)所有的换行符都加倍会使脚本中断。
  2. 建立在未来防范此问题的方法

但也许这是一个单独的帖子的问题?

于 2013-05-15T15:06:09.887 回答