如何使用PHP PDO在mySQL中插入多行JSON对象数据?

deyfvvtc  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(121)

我做PHP API插入多行JSON对象数据,我的JSON数据格式如下:

  • (我在REACT中的console.log(this.state.cartItems[]).* 的console日志中收到以下格式)
  1. 0: {SparePartID: "34", qty: 1, Price: "500", OrderID: "14"}
  2. 1: {SparePartID: "35", qty: 1, Price: "250", OrderID: "14"}
  3. 2: {SparePartID: "36", qty: 1, Price: "430", OrderID: "14"}

字符串
我的PHP API代码如下:

  • part_order_details.php

  1. header("Access-Control-Allow-Origin: http://localhost/Auth/");
  2. header("Content-Type: application/json; charset=UTF-8");
  3. header("Access-Control-Allow-Methods: POST");
  4. header("Access-Control-Allow-Origin: *");
  5. header("Access-Control-Max-Age: 3600");
  6. header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
  7. include_once '../config/database.php';
  8. include_once '../objects/order.php';
  9. $database = new Database();
  10. $db = $database->getConnection();
  11. $order = new Order($db);
  12. $a = file_get_contents("php://input");
  13. $data = json_decode($a, true);
  14. if($order->orderDetails($data)){
  15. http_response_code(200);
  16. echo json_encode(array(
  17. "message" => "All rows of Order Details are inserted.",
  18. ));
  19. }
  20. else{
  21. http_response_code(400);
  22. echo json_encode(array("message" => "Sorry! Error while inserting rows of order details"));
  23. }


而----->order.php是:

  1. class Order{
  2. private $conn;
  3. public $SparePartID;
  4. public $OrderID;
  5. public $Price;
  6. public $Quantity;
  7. public function __construct($db){
  8. $this->conn = $db;
  9. }
  10. function orderDetails($arr)
  11. {
  12. $query= "INSERT INTO sparepartorderdetails (SparePartID, OrderID, Quantity, Price) VALUES
  13. (:SparePartID, :OrderID, :qty, :Price) ";
  14. $stmt = $this->conn->prepare($query);
  15. foreach($arr as $item)
  16. {
  17. $stmt->bindValue(':SparePartID', $item[0]);
  18. $stmt->bindValue(':qty', $item[1]);
  19. $stmt->bindValue(':Price', $item[2]);
  20. $stmt->bindValue(':OrderID', $item[3]);
  21. if($stmt->execute()){
  22. return true;
  23. }
  24. else{
  25. $arr = $stmt->errorInfo();
  26. print_r($arr);
  27. }
  28. }
  29. }
  30. }


现在,我尝试用POSTMAN测试PHP API。所以我在Postman body中发送以下数据用于POST请求:

  1. {
  2. "0":
  3. {"SparePartID": "34",
  4. "qty": "1",
  5. "Price": "500",
  6. "OrderID": "14"},
  7. "1":
  8. {"SparePartID": "35",
  9. "qty": "1",
  10. "Price": "250",
  11. "OrderID": "14"}
  12. }


但是POSTMAN显示ERRORStatus:400 Bad Request,并带有msg:{“message”:“Sorry!Error while inserting rows of order details”}
我搜索了很多这个问题,但没有解决方案。我错过了什么或使用错误的方式插入多个JSON行?

l2osamch

l2osamch1#

你的问题主要在这一行:
第一个月
关于数据绑定:

  1. $stmt->bindValue(':SparePartID', $item[0]);
  2. $stmt->bindValue(':qty', $item[1]);
  3. $stmt->bindValue(':Price', $item[2]);
  4. $stmt->bindValue(':OrderID', $item[3]);

字符串
json_decode使用true参数进行关联时,结果数据将是一个数组的数组,其键是字符串,而不是整数。所以你需要将访问每个属性的方式从整数索引改为字符串索引。你可以将bindValue的出现改为这样:

  1. $stmt->bindValue(':SparePartID', $item['SparePartID']);
  2. $stmt->bindValue(':qty', $item['qty']);
  3. $stmt->bindValue(':Price', $item['Price']);
  4. $stmt->bindValue(':OrderID', $item['OrderID']);


上述解决方案的替代方案是更改json_decode的使用方式。删除true并更新bindValue示例以使用对象属性访问(因为现在数据将被解码为Object而不是Arrays):
$data = json_decode($a);

  1. $stmt->bindValue(':SparePartID', $item->SparePartID);
  2. $stmt->bindValue(':qty', $item->qty);
  3. $stmt->bindValue(':Price', $item->Price);
  4. $stmt->bindValue(':OrderID', $item->OrderID);


关于$stmt->execute的最后一个注意事项是,在第一次循环迭代之后,您的函数将return true(如果成功)。它永远不会完成剩余的插入项。您应该删除早期的return语句,并找到更好的方法来返回成功/失败指示符。

展开查看全部

相关问题