2016-02-28 4 views
1

Этот вопрос на самом деле является продолжением другого вопроса. Я хотел бы убедиться, что я укажу все подробности в этом.Сессия/проблема с моей корзиной

Я относительно новый программист в подобном Php и у меня есть это задание, где я должен сделать корзины покупок

Я получаю мои данные продукта из базы данных -> затем я нажимаю на продукте - > он переходит на страницу, где он добавляет productid, имя продукта и цену в сеанс с помощью array_push, а затем возвращается на ту же страницу, где находится тележка (тележка находится на той же странице, что и в товарной строке).

cart.class.php -> Это страница, откуда я изначально получаю данные о продукте. Используя my getAllproducts(); Я получаю все данные, которые затем прокручиваю, чтобы отобразить 6 продуктов.

<?php 

class Cart 
{ 
private $con; 
private $productid; 

function __construct(){ 
    $this->con = new PDO('mysql:host=localhost;dbname=#', '#', '#'); 
} 

public function getProductDataById($passedId){ 

    $this->productid = $passedId; 

    $statement = $this->con->prepare("SELECT productname, productdescription, productimage, price FROM producten WHERE productid = :productid"); 
    $statement->execute(array("productId" => $this->productid)); 
    $data = $statement->fetch(); 

    return($data); 
} 
public function getAllproducts(){ 

    $statement = $this->con->prepare("SELECT productid, productname, productdescription, productimage, price FROM producten"); 
    $statement->execute(); 
    $data = $statement->fetchAll(); 

    return($data); 
} 
} 
?> 

Следующая я использую Cart.php, чтобы показать свою продукцию. На этой странице я проходным продуктов, а затем, когда кто-то нажимает на заказ (bestellen) ProductID, PRODUCTNAME и цена будет отправить add_to_cart.php

<?php 
/*errors */ 
error_reporting(E_ALL); 
ini_set("display_errors", 1); 

/*Php classes */ 
require_once("../classes/cart.class.php"); 

$products = new cart(); 
$data = $products->getAllproducts(); 

?> 
<title>Side Cart</title> 
</head> 
<body> 
<header> 
    <div id="cd-cart-trigger"><a class="cd-img-replace" href="#0">Cart</a></div> 

<div class="container productline"> 
    <div class="row"> 
    <?php 
    foreach($data as $value){ 

     echo '<div class="col-md-4 productcage">'; 
     echo '<h2 class="product_name">'.$value["productname"].'</h2>'; 
     echo '<p class="price_tag">€'.$value["price"].' euro</p>'; 
     echo '<p class="#">'.$value["productdescription"].'...</p>'; 
     echo '<a href="/shoppingcart/php/add_to_cart.php?productid='.$value["productid"] . "&productname=" . $value["productname"]. "&price=" . $value["price"].'" class="btn btn_order addcart">Add to cart <span class="glyphicon glyphicon-shopping-cart"></span></a><br/><br/>'; 
     echo '</div>'; 
    } 
    ?> 
    </div> 
</div> 
<div id="cd-shadow-layer"></div> 
// Here's where the shopping cart starts 
<?php 

session_start(); 

if(isset($_SESSION["cart"]) && count($_SESSION["cart"])> 0) 

{

echo '<div id="cd-cart">'; 
echo '<h2>Cart</h2>'; 
echo '<ul class="cd-cart-items">'; 
echo '<li>'; 

foreach($_SESSION['cart'] as $id => $value) 
{ 
    echo 'Product Name ' . $value["productname"] . '<br/>'; 
    echo 'Product ID ' . $value["productid"] . '<br/>'; 
    echo 'Product Price ' . $value["price"] . '<br/>'; 
    echo '<br/>'; 
} 

echo '</li>'; 
echo '</ul>'; 
echo '<div class="cd-cart-total">'; 
echo '<p>Total <span>$39.96</span></p>'; 
echo '</div>'; 

echo '<a href="#0" class="checkout-btn">Checkout</a>'; 
echo '<p class="cd-go-to-cart"><a href="#0">Go to cart page</a></p>'; 
echo '</div>'; 

} 

?> 

Затем я перехожу к add_to_cart.php

Это посылает сессию обратно cart.php где ниже я хочу, чтобы петля продуктов в корзине

<?php 
session_start(); 

if(empty($_SESSION['cart'])){ 
$_SESSION['cart'] = array(); 
} 

array_push($_SESSION['cart'], $_GET['productid'], $_GET['productname'], $_GET['price']); 

?> 

    <p>Het product is toegevoegd aan uw winkelwagen</p> <a href="../cart.php">Naar winkelwagen</a> 

TL; DR, когда я пытаюсь Переберите $ значение [ «PRODUCTNAME»] мой Foreach возвращает предупреждение : Недопустимое смещение строки 'productname'

Я понятия не имею, как сделать все это, потому что я все еще довольно новичок в PHP. Если кто-то хочет потратить время на выяснение моих глупых ошибок, это будет очень удивительно.

Надеюсь, я был достаточно ясен. Приношу извинения за неудобства

foreach($_SESSION['cart'] as $id => $value) 
{ 
    echo ($_SESSION[ 'cart' ][ $id ] . " " . $value); //1 1solexfiets1 solexfiets115.99 15.99 
    var_dump(($_SESSION[ 'cart' ][ $id ] . " " . $value)); // string(3) "1 1" string(23) "solexfiets1 solexfiets1" string(11) "15.99 15.99" 
} 

Я изменил array_push к

array_push($_SESSION['cart'], array('productid' => $_GET['productid'], 'productname' => $_GET['productname'], 'price' => $_GET['price'])); 

и когда я print_r на тележке.PHP я получаю следующее назад

Array ([0] => 1 [1] => solexfiets1 [2] => 15.99 [3] => Array ([productid] => 1 [productname] => solexfiets1 [price] => 15.99)) 

Но когда я пытаюсь Переберите через него, как этот

foreach($_SESSION['cart'] as $id => $value) 
{ 
    echo 'Product Name ' . $value["productname"] . '<br/>'; 
    echo 'Product ID ' . $value["productid"] . '<br/>'; 
    echo 'Product Price ' . $value["price"] . '<br/>'; 
    echo '<br/>'; 
} 

Я все еще получаю ту же ошибку

Предупреждение: Illegal строка смещения «PRODUCTNAME»

Так что еще есть что-то, что я делаю неправильно? Теперь я понимаю, что мне нужно отправить коллекцию вещей, а не то, что я делал раньше, но я до сих пор не могу понять, почему ее отказ сейчас

Спасибо, что очень помогли мне! Кажется, я решил проблему. Я принял все советы, и у меня, наконец, появилось рабочее заявление. Теперь товар заказан и появится в корзине

Снова спасибо всем, кто помог мне!

+0

Проблема еще в вашем входе - но я не могу работать, как этот вход стал подогнаны - это 'Array ([0] => 1 [1] => solexfiets1 [2] => 15,99 [ 3] => Array ([productid] => 1 [productname] => solexfiets1 [price] => 15.99)) 'неверно - вот почему ваш цикл завершается неудачно - каким-то образом вы все еще добавляете переменные get в сеанс один на один (это почему $ _SESSION ['cart'] [0], $ _SESSION ['cart'] [1], $ _SESSION ['cart'] [2] и $ _SESSION ['cart'] [3] установлены - можете ли вы полностью очистить сеанс и повторить попытку?'unset ($ _ SESSION ['cart']);' на одноразовой странице. – IaMaCuP

+0

Я просто решил проблему на самом деле! Похоже, что в массиве все еще была некоторая неправильная информация. Извините за все усилия, которые вы должны были сделать, и большое спасибо за всю помощь. Ты меня очень многому научил! –

ответ

1

Извините, я не видел, чтобы у вас был новый вопрос, поэтому я поставил это как комментарий к вашему другому.

Замените свой массив_push этим и сообщите мне, если это сработает для вас.

array_push($_SESSION['cart'], array('productid' => $_GET['productid'], 'productname' => $_GET['productname'], 'price' => $_GET['price'])); 

Ваша проблема заключается в том, что вы толкая соответствующие данные в массив ($ _SESSION [ «телега»]), но не поддерживать эту связь - думать об этом так:

$ _GET представляет собой массив, содержащий куча данных - если вы ссылаетесь на определенную часть этого массива (например, $ _GET ['productname']) вы удаляете его из своей коллекции и делаете что-то с ним - с помощью массива array_push вы просто нажимаете материал на другой массив ($ _SESSION ['cart']), но не поддерживая отношения, поэтому вы снова и снова нажимаете кучу вещей в $ _SESSION ['cart'], и все они теряются - они больше не поддерживают свое отношение к каждому Другие.

Что мы делаем, мы нажимаем массив (коллекцию) вещей, которые вы хотите, поэтому $ _SESSION ['cart'] теперь содержит несколько коллекций вещей, а не только вещи.

Другой способ думать об этом - вы можете просто сделать это:

array_push($_SESSION['cart'], $_GET); 

это будет иметь тот же эффект, как мы подталкивают массив $ _GET в наш другой массив, поэтому отношения поддерживаются - причина, по которой вы не хотите этого делать, заключается в том, что в моем примере выше мы создаем новый массив, содержащий только те данные, которые нам нужны. Если мы просто нажмем весь массив $ _GET, мы получим кучу других вещей, которые нам не нужны (пользователь может поставить & someothervariable = aReallyReallyLongString), а затем это тоже закончится на нашей сессии.

+0

Огромное спасибо за все объяснение, которое стало для меня намного яснее. Тем не менее, я по-прежнему получаю незаконную ошибку смещения строки. Я отредактировал вопрос и поставил все свои выводы там –

+1

Rick, к вашему комментарию «Большое спасибо за все объяснения, которые теперь стали намного яснее. Тем не менее, я по-прежнему получаю незаконную ошибку смещения строки. Я отредактировал вопрос и поместил все мои находки - Рик Спанджерс 49: «Сначала я решил эту ошибку. Добавьте мое решение в laMaCup, и оно должно работать нормально – MikeO

+0

Я не знаю, верно ли это - как это происходит в переменной сеанса: Array ([0] => 1 [1] => solexfiets1 [2] => 15.99 [3] => Array ([productid] => 1 [productname] => solexfiets1 [price] => 15.99)) - то есть есть индексы массива 0, 1, 2 и 3, которые не должны быть там - причиной ошибки - я не могу разобраться, как они попадают на сессию в первую очередь .... – IaMaCuP

0
<?php 
    session_start(); 

    $_SESSION[ 'cart' ] = array(); 

    array_push($_SESSION[ 'cart' ], array('productid' => 1, 'productname' => 'product1', 'productprice' => 15.99)); 
    array_push($_SESSION[ 'cart' ], array('productid' => 2, 'productname' => 'product2', 'productprice' => 4.99)); 
    array_push($_SESSION[ 'cart' ], array('productid' => 3, 'productname' => 'product3', 'productprice' => 17.99)); 

    foreach($_SESSION[ 'cart' ] AS $arr) 
     echo $arr[ 'productname' ] . ' '; 
?> 
Смежные вопросы