2012-06-28 46 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))。 其他變體不好,但它可以做到。

相關問題