2012-06-28 48 views
0

我在会话中遇到了一个小问题。我在一个网站上建立了一个小型的购物车式的部分,几乎完成了我想要的工作。一个问题是,当我访问我的并在它没有任何项目,它抛出了一个错误:如果购物车中没有物品,则会出现警告

Warning: Invalid argument supplied for foreach() in /home/andydownham/site.com/wp-content/themes/theme/basket.php on line 28 

我想这需要像'if items are in cart' > use normal code > else display 'sorry there are no items in your cart'这只是我不知道究竟如何实施这个。

这里是我使用的东西存储到会话

<?php 
session_start(); 
//var_dump($_POST); 
//print_r($_SESSION); 
$_SESSION['event_orders'][] = $_POST['event_id']; 
?> 

的代码,这是我现在用的篮子网页上的代码:

<?php 
session_start(); 

foreach($_SESSION['event_orders'] AS $event_id){ 
    echo '<div class="grad basket">'; 

    echo '<div class="thumb">'; 
    $EM_Event = em_get_event($event_id); 
    echo $EM_Event->output('#_EVENTIMAGE{72,72}'); 
    echo '</div>'; 
    echo '<div class="basket-title"><h2>'; 
    echo '<a href="'; 
    $EM_Event = em_get_event($event_id); 
    echo $EM_Event->output('#_EVENTURL'); 
    echo '">'; 
    $EM_Event = em_get_event($event_id); 
    echo $EM_Event->output('#_EVENTNAME'); 
    echo '</a>'; 
    echo '</h2>'; 
    echo '<div class="basket-dates"> Dates:'; 
    $EM_Event = em_get_event($event_id); 
    echo $EM_Event->output('#_EVENTDATES'); 
    echo '</div></div>'; 
    echo '<div class="klear"></div>'; 
    echo '<input type="submit" class="remove" value="remove" />'; 
    echo '</div>'; 
    echo '<br/>'; 
} 
?> 
+0

我建议你看看从HTML分离你的逻辑,并尽可能输出你的HTML,而不用PHP。你会发现将两者分开会使你的程序更具可读性,编辑布局变得更容易。 – halfer

+0

感谢您的推荐,我同意,我不知道如何做到这一点(我对PHP非常陌生,并且具有基本知识),如果您手头有链接并提供关于如何完成此操作的一些信息,我将不胜感激 – user1370288

+1

[This](http://fabien.potencier.org/article/34/templating-engine-in-php)是关于模板引擎的一个很好的理论讨论(虽然它有点高级,但还是有一定的帮助)。搜索“Zend_View”,“Twig”或“Smarty”以更多地了解各种方法。 – halfer

回答

2

你需要确保$_SESSION['event_orders']存在(即使它是一个空数组)。您可以检查与empty功能(这将赶上空数组以及):

if (empty($_SESSION['event_orders'])) { 
    // Cart is empty 
} else { 
    foreach(...) { 
    ... 
    } 
} 

你必须要小心empty,虽然。这些东西也被认为是“空”(从手动):

* "" (an empty string) 
* 0 (0 as an integer) 
* 0.0 (0 as a float) 
* "0" (0 as a string) 
* NULL 
* FALSE 
* array() (an empty array) 
* var $var; (a variable declared, but without a value in a class) 

特别注意,含有“0”字符串被认为是空!这意味着,如果你将来某处有一个HTML表单,用户可以输入值并且用户输入号码0,则该字段将被该功能视为“空”。这并不总是你想要的。不过,在这种情况下,检查数组的“空白”很有用。

+0

这工作的魅力,感谢您的额外信息 – user1370288

+0

我倾向于使用'array_key_exists('event_orders',$ _SESSION)',以避免任何问题'empty()'。 – halfer

+0

halfer,那么你需要实现一个检查空数组* *以及*。我会使用'isset($ _ SESSION ['event_orders'])'(因为它比'array_key_exists'短),但它有相同的缺点。我认为这里是空的,因为数据不是来自外部,所以我们可以控制数据类型。 –

0

你只需要添加一个条件,以检查是否在您的会话varaible存在任何篮中的物品:

if(!empty($_SESSION['event_orders'])){ 
    foreach($_SESSION['event_orders'] AS $event_id){ 
     ... 
    } 
} 
0

你传入空会话foreach循环,所以它抛出一个错误,因为它需要阵列。 所以你可以检查会话是否是数组(PHP函数:is_array($ array)),检查数组是否为空(php函数:空($ array))。 其他变体不好,但它可以做到。

相关问题