2009-09-30 13 views
0

J'essaie de comparer le contenu de 2 tableaux, fondamentalement, je suis en utilisant un panier et je dois vérifier les prix des formulaires soumis par rapport à une base de données, le problème est quand j'en ai un incorrect prix dans le panier il me donne un message d'erreur mais quand j'ai 1 prix correct et 1 incorrect il continue à la caisse, je ne sais pas ce que je fais mal toute aide serait appréciée.problème de comparer deux tableaux

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

Pourquoi ne pas simplement stocker l'ID de l'article et la quantité dans le panier de l'utilisateur? – strager

Répondre

0

le problème est que vous marquer l'entrée du chariot comme valide si le dernier élément du tableau de $sql_price est égal à $item_price.

Réécrire la boucle comme:

$valid_prices = true; 

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

Pour éviter itérer supplémentaire, ajoutez une break dans la if intérieure pour arrêter la boucle après avoir trouvé un prix non valide.

Ou encore ceci:

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

Vous pouvez avoir MySQL faire votre travail pour vous, même:

$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

salut, après avoir pris les $ valid_prices hors de la boucle le problème existe toujours, ce à propos de la première boucle foreach, doit-elle contenir tout le code ou seulement les 5 premières lignes. merci – amir

+0

le code que j'utilise est: $ valid_prices = true; foreach ($ sql_price comme prix $) { $ prix = $ prix; if ($ price! == $ item_price) { $ valid_prices = false; pause; } } le problème est que si le premier article a un mauvais prix et le second est correct, il va à la caisse mais si le premier article est bon et le second est mauvais, il donne l'erreur désirée, des idées s'il vous plaît. – amir

+0

@amir, je pense que je sais ce que vous dites.Prenez la ligne '$ valid_prices = true; 'sur les deux boucles * for (et donc avant foreach ($ cart-> get_contents() comme $ item)'). – strager

0

Vous définissez $valid_prices true ou false à chaque itération de la boucle. Donc, après la boucle, il ne correspond qu'au dernier élément de la boucle.

Il est peut-être préférable de le définir sur true à l'extérieur (avant) de la boucle, puis de le définir comme faux lorsque vous trouvez un mauvais cas - de cette façon, il ne peut pas être remis à true. Alternativement, vous pouvez simplement lancer l'erreur dans la boucle dès que vous trouvez le prix invalide.

+0

Salut, merci pour la réponse, voulez-vous dire avant la première boucle foreach ou la deuxième, merci – amir

+0

c'est l'intérieur (ou le second) un – dave

0

Le problème principal semble être votre boucle foreach interne et le réglage de valid_prices. Votre boucle continue à travers tous les prix, donc $ valid_prices dépendra du dernier prix seulement. Vous devriez sortir de votre boucle dès que vous détectez un prix invalide.

Quelques autres petites choses:

  • vous ne semblez pas utiliser le nom qté $ ou des variables $ name
  • $ n'utilise pas [] comme sql_price de $, qté $
  • Vous pourrait utiliser! = pas! ==
Questions connexes