使用json和php添加到购物车的问题

时间:2018-04-01 00:09:37

标签: php json

enter image description here

我正在尝试制作一个简单的购物车,并通过使用onclick添加到购物车功能提交值来将我的模态中的产品添加到其中

在我的详细信息模式中,我有一个带有选项值属性的表单

 <form action="add_cart.php" method="post" id="add_product_form">
         <input type="hidden" name ="product_id" value ="<?=$id;?>">
         <input type="hidden" name="available" id="available" value ="">
        <div class="form-group">
         <div class="large-3 columns">
          <label for="quantity">Quantity:</label>
          <input type="number" class="form-control" id="quantity" name="quantity">
         </div>
        </div>
        <div class="large-3 columns">
         <label for="size">Size:</label>
         <select name="size" id="size" class="form-control">
          <option value=""></option>
          <?php foreach($size_array as $string) {
           $string_array = explode(':', $string);
           $size = $string_array[0];
           $available = $string_array[1];
           echo '<option value="'.$size.'" data‐available="'.$available.'">'.$size.' ('.$available.'Available)</option>';
          }?>

我发送了来自我的模态的用户输入,其中Ajax Function add_to_cart带有方法帖子进行处理,ajax将我重定向回产品页面。

我从add_cart.php

获得“已添加到卡片中”

代码行:

$_SESSION['success_launch'] = $product['title']. 'was added to your cart.';

但我的数据库表购物车中只插入空字符串

enter image description here

在我的浏览器中的开发人员工具中我收到提示:第6行的add_cart.php中的未定义索引:product_id,也是大小,可用和数量也是未定义的。我找不到解决方案。

这是我在add_cart.php中尝试的:

<?php

require_once $_SERVER['DOCUMENT_ROOT'].'/EcomApp/konfiguracija.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/EcomApp/config.php';

$product_id = sanitize($_POST['product_id']);
$size = sanitize($_POST['size']);
$available = sanitize($_POST['available']);
$quantity = sanitize($_POST['quantity']);
$item = array();
$item[] = array (
   'id'      => $product_id,
   'size'    => $size,
   'quantity'   => $quantity,

);

$domain = ($_SERVER['HTTP_HOST'] != 'localhost')?'.'.$_SERVER['HTTP_HOST']:false;
$query = $veza->prepare("SELECT * FROM products WHERE id = '{$product_id}'");
$query ->execute();
$product = $query->fetch(PDO::FETCH_ASSOC);
$_SESSION['success_launch'] = $product['title']. 'was added to your cart.';

//check does cookie cart exist
if($cart_id != ''){
  $cartQ= $veza->prepare("SELECT * FROM cart WHERE id = '{$cart_id}'");
  $cart = $cartQ->fetch(PDO::FETCH_ASSOC);
  $previous_items = json_decode($cart['items'],true);
  $item_match = 0;
  $new_items = array();
  foreach ($prevous_items as $pitem){
     if($item[0]['id']==$pitem['id'] && $item[0]['size'] == $pitem['size']){
       $pitem ['quantity']= $pitem['quantity']+$item[0]['quantity'];
       if ($pitem['quantity']>$available){
         $pitem['quantity'] = $available;

       }
       $item_match = 1;
     }
     $new_items[] = $pitem;
  }
  if($item_match != 1){
    $new_items = array_merge($item,$previous_items);
  }

  $items_json = json_encode($new_items);
  $cart_expire = date("Y-m-d H:i:s", strtotime("+30 days"));
  $something=$veza->prepare("UPDATE cart SET items = '{$items_json}',expire_date= '{$cart_expire}'WHERE id ='{$cart_id}'");
  $something ->execute();
  setcookie(CART_COOKIE,'',1,'/',$domain,false);
  setcookie(CART_COOKIE,$cart_id,CART_COOKIE_EXPIRE,'/',$domain,false);

}else {

  //add cart inside database
  $items_json = json_encode($item);
  $cart_expire = date("Y-m-d H:i:s",strtotime("+30 days"));
  $smth=$veza->prepare("INSERT INTO cart (items,expire_date) VALUES ('{$items_json}','{$cart_expire}')");
  $smth->execute();
  $cart_id = $veza>lastInsertId();
  setcookie(CART_COOKIE,$cart_id,CART_COOKIE_EXPIRE,'/',$domain,false);
}

?>

1 个答案:

答案 0 :(得分:1)

该警告消息表示尝试访问阵列中不存在的键。

要查看$ _POST数组的内容,请尝试执行以下操作:

<?php
var_dump($_POST);

如果它是空的,很可能您使用了错误的表单方法或错误的HTTP方法。试试这个:

<?php
var_dump($_GET);

您也可以使用浏览器开发工具或Insomnia等来调试HTTP消息。

无论如何,在尝试使用密钥之前,请务必检查密钥是否存在:

<?php
$requiredKeys = ['product_id', 'size', 'available', 'quantity'];
foreach ($requiredKeys as $key) {
    if (!isset($_POST[$key])) {
        // handle error here
    }
}

<强>增加:

进行此更改:

<?php

$requiredKeys = ['product_id', 'size', 'available', 'quantity'];
foreach ($requiredKeys as $key) {
    if (!isset($_POST[$key])) {
        http_response_code(400);
        header('Content-Type: application/json');
        echo json_encode(
            [
                 'errorMsg'     => "Missing key: $key",
                 'missingKey'   => $key,
                 'receivedPost' => $_POST, 
            ]
        );
        die();
    }
}

require_once $_SERVER['DOCUMENT_ROOT'].'/EcomApp/konfiguracija.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/EcomApp/config.php';

$product_id = sanitize($_POST['product_id']);
// The rest of the code

保留添加的验证码。永远不要认为$ _POST不是空的。

我也注意到这里出了点问题:

var data = jQuery('add_product_from').serialize();

应该是这样的:

var data = jQuery('#add_product_from').serialize();

请注意我添加了&#34;#&#34;。你发送了一个空的POST数据。

我认为最好将属性&#34; id&#34;在所有&#34;输入&#34;字段,获取它们的每个值,检查已成功完成并使用这些值构建可由jQuery.ajax函数使用的对象。如果你已经这样做,验证一切,很可能你很容易发现错误。

<强> ADDED

此外,如果您阅读jQuery.ajax documentation,您会注意到success功能可以包含参数。至少添加第一个以接收响应数据。用它来检查是否有意外的响应和调试。