PHP помощь, возможно, ошибка сеанса? - PullRequest
1 голос
/ 28 апреля 2011

Я работаю на сайте электронной коммерции, и когда пользователь впервые добавляет продукт в корзину, я получаю следующую ошибку:

Обнаружена ошибка PHP

Важность: Уведомление

Сообщение: неопределенный индекс: orderDetails

Имя файла: library / MY_Cart.php

Номер строки: 59 Ошибка PHP

Серьезность: Предупреждение

Сообщение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с /var/www/vhosts/akulaliving.com/httpdocs/CI-1.7.3/libraries/Exceptions.php:166)

Имя файла: library / Session.php

Номер строки: 662

Добавляет продукт в корзину сследующий код,

if ($this->input->post('btnAddToBag'))
        {

            $derivativeId = $this->input->post('selDerivative-1');
            $quantity = $this->input->post('selQuantity');
            $derivative = $this->Product_model->GetProducts(array('pdId' => $derivativeId), 'small');

            // Add item to shopping bag.
            $attributes = $this->Product_model->GetProductDerivatives(array('pdId' => $derivativeId));
            $this->Checkout_model->AddProduct($derivative, $attributes, $quantity);
            $this->data['message'] = 'Item added to Shopping Bag.';

            // Update Delivery Price
            $this->Checkout_model->updateDelivery(49);

            //get the bag details
            $this->data['items'] = $this->Checkout_model->GetProducts();        
        }

Вызываемая функция модели выглядит следующим образом:

function AddProduct($derivative, $attributes, $quantity)
{
    $data = array(
       'id'         => $derivative->pdId,
       'qty'        => $quantity,
       'price'      => ($derivative->productSavingType == 'none' ? $derivative->productPrice : $derivative->productSavingPrice),
       'name'       => $derivative->productTitle,
       'attributes' => $attributes['attributeValues'],
       'refNo'      => $derivative->pdRefNo,
       'productId'  => $derivative->productId,
       'set'        => $derivative->productIsSet,
       'hasImage'   => $derivative->hasImage,
       'imageUrl'   => $derivative->imageUrl,
       'imageAlt'   => $derivative->imageAlt,
       'stockLevel' => $derivative->pdStockLevel,
       'leadTime'   => $derivative->pdLeadTime
    );

    $data['nonDiscountedPrice'] = $data['price'];
    if ($derivative->productSavingType == 'end-of-season')
    {
        $data['nonDiscountedPrice'] = $derivative->productPrice;
    }

    $this->cart->insert($data);
}

код, на который жалуется ошибка:

function _insert($items=array())
{
    if (isset($items['options']) AND count($items['options']) > 0)
    {
        $rowid = md5($items['id'].implode('', $items['options']));
    }
    else
    {
        $rowid = md5($items['id']);
    }

    if (isset($this->_cart_contents[$rowid]))
    {
        if (!isset($items['qty']))
        {
            return FALSE;
        }

        // Already Exists, we need to update the total for this item
        $new_qty = $items['qty'];
        $items['qty'] = $items['qty'] + $this->_cart_contents[$rowid]['qty'];

        $items['rowid'] = $rowid;

        if ($this->_update($items))
        {
            return TRUE;
        }
        return FALSE;
    }

    // Doesn't exist, we need to insert this item.
    if (parent::_insert($items))
    {
        // Update our total.
        if (isset($this->_cart_contents[$rowid]))
        {
            $this->real_total_items += $this->_cart_contents[$rowid]['qty'];
            if ($this->_cart_contents['orderDetails']['discount'] > 0)
            {
                $this->_cart_contents[$rowid]['price'] = $this->_cart_contents[$rowid]['nonDiscountedPrice'];
                $this->_save_cart();
            }
        }
        return TRUE;
    }
    return FALSE;
}

Ответы [ 5 ]

1 голос
/ 28 апреля 2011

Могу поспорить, что ваш PHP вывел УВЕДОМЛЕНИЕ и , что вызвало ошибку отправленных заголовков сеанса.

Найдите строку error_reporting в вашем php.ini изамените его на

error_reporting = E_ALL & ~E_NOTICE

Перезапустите экземпляр apache и посмотрите, разрешит ли это проблему.

1 голос
/ 28 апреля 2011

Joomla?Это уведомление о том, что $this->_cart_contents['orderDetails'] не определено до его использования.Вы можете определить его заранее или отключить уведомления, и оно должно исчезнуть.

0 голосов
/ 28 апреля 2011
if (**$this->_cart_contents['orderDetails']['discount'] > 0**)
        {
            $this->_cart_contents[$rowid]['price'] = $this->_cart_contents[$rowid]['nonDiscountedPrice'];
            $this->_save_cart();
        }

CI выдает сообщение Notice, потому что var :: _ cart_contents ['orderDetails'] не существует.

Если вы не хотите изменять настройку ошибки вашего php.ini, вы можетеизмените его, как показано ниже, и попробуйте:

if (isset($this->_cart_contents['orderDetails']['discount'])&& ($this->_cart_contents['orderDetails']['discount']>0))
0 голосов
/ 28 апреля 2011

Вы должны определить значение по умолчанию для ваших переменных, прежде чем использовать его

Устраните это предупреждение.

0 голосов
/ 28 апреля 2011

У вас, вероятно, настроена конфигурация сервера для отображения ошибок PHP в E_NOTICE (что является нормальным для разработки). Поскольку генерируется E_NOTICE (MY_Cart.php), это сначала передается в браузер. А поскольку уже есть выходные данные браузера, это приводит к предупреждению «Невозможно изменить информацию заголовка» (library / Session.php). Возможно, потому что он выполняет функцию header () или что-то подобное.

Вы можете решить эту проблему, исправив причину E_NOTICE (проверка забытого набора на ключе 'orderDetails'?) Или скрыв E_NOTICE, установив error_reporting (E_ALL & ~ E_NOTICE) в начале ваш код.

...