2009-09-30 136 views
0

我在比較2個數組的內容,基本上我使用的是購物車,我需要檢查提交的表單對數據庫的價格,問題是當我有一個不正確的價格在購物車它給我一個錯誤消息,但當我有1正確的價格和1不正確的繼續與結帳,我不知道我在做什麼錯誤的任何幫助將不勝感激。比較兩個陣列的問題

foreach ($cart->get_contents() as $item) 
    { 
    $item_id = $item['id']; 
    $item_name = $item['name']; 
    $item_price = $item['price']; 
    $item_qty = $item['qty']; 

$connection = mysql_connect($dbhost,$dbuser,$dbpass) or die("Error connecting to mysql"); 
mysql_select_db($dbname); 

$query = "select * from products where product_name = '$item_name'"; 

$result = mysql_query($query); 
if (!$result) { 
    echo mysql_error(); 
} 

while ($row = mysql_fetch_assoc($result)) { 
    $sql_price[] = $row['product_price']; 
    $qty[] = $row['product_qty']; 
    $name = $row['product_name']; 
} 
foreach($sql_price as $price) { 
    $price = $price; 
    if ($price !== $item_price) { 
     $valid_prices = false; 
    }else{ 


     $valid_prices = true; 
    } 
    } 
    } 

    if ($valid_prices !== true) 
    { 
    // KILL THE SCRIPT 
    die($jcart['text']['checkout_error']); 
    } 
+1

爲什麼不直接存儲在用戶的購物車中的物品編號和數量? – strager 2009-09-30 10:21:46

回答

0

問題是你標誌着車入門如果$sql_price最後一個數組元素等於$item_price有效。

重寫環路:

$valid_prices = true; 

foreach($sql_price as $price) { 
     $price = $price; 
     if ($price !== $item_price) { 
       $valid_prices = false; 
     } 
} 

爲了避免額外的迭代,在內部if添加break發現無效的價格後停止循環。

甚至這樣的:

$valid_prices = (array_search($price, $sql_price) !== false); 

你可以擁有的MySQL做所有的工作適合你,即使是:

$query = 'select 1 from products where product_name = "' . mysql_real_escape_string($item_name) . '" and product_price = ' . (int)$item_price; 

$result = mysql_query($query); 
if (!$result) { 
     echo mysql_error(); 
} 

if (mysql_num_rows($result) > 0) { 
     $valid_prices = true; 
     echo 'price is good!'; 
} else { 
     $valid_prices = bad; 
     echo 'price is bad!'; 
} 
+0

嗨,在$ valid_prices退出循環後問題仍然存在,什麼關於第一個foreach循環,是否必須包含所有代碼或僅包含前5行。謝謝 – amir 2009-09-30 10:43:59

+0

我使用的代碼是: $ valid_prices = true; foreach($ sql_price as $ price){ $ price = $ price; if($ price!== $ item_price){ $ valid_prices = false; 休息; } } 問題是,如果第一個項目有不好的價格,第二個是好的,它會去結帳,但如果第一個項目是好的,第二個是壞的,它會給出所需的錯誤,請任何想法。 – amir 2009-09-30 10:59:38

+0

@amir,我想我知道你在說什麼。把'$ valid_prices = true;'換成* both *'for'循環(因此在foreach之前($ cart-> get_contents()爲$ item)'')。 – strager 2009-09-30 17:55:38

0

您在每次循環迭代中將$valid_prices設置爲true或false。所以在循環之後它只對應於循環中的最後一項。

將它設置爲循環外(在循環之前)可能會更好,然後在發現不好的情況時將其設置爲false - 這樣它就不能設置爲true。或者,您可以在發現無效價格時立即將錯誤引入循環中。

+0

嗨,感謝您的答覆,你的意思是在第一個foreach循環或第二個之前, 謝謝 – amir 2009-09-30 10:25:26

+0

它是內部(或第二個) – dave 2009-09-30 10:27:08

0

主要問題似乎是你的內部foreach循環和valid_prices的設置。你的循環繼續通過所有的價格,所以$ valid_prices將取決於最後的價格。只要您檢測到無效價格,您應該立即跳出您的循環。

一些其他的小東西:

  • 你似乎沒有使用$數量或$名稱變量
  • $名稱不使用[]像$ sql_price,$數量
  • 你可以使用!=不!==