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

Posted

技术标签:

【中文标题】如何使用 PHP PDO 在 mySQL 中插入多行 JSON 对象数据?【英文标题】:How do I insert multiple rows of JSON object data in mySQL using PHP PDO? 【发布时间】:2019-09-07 19:59:27 【问题描述】:

我制作 php API 来插入多行 JSON 对象数据。我的JSON数据格式是这样的:

(我在控制台日志中收到以下格式的 console.log(this.state.cartItems[]). 在 REACT)

0: SparePartID: "34", qty: 1, Price: "500", OrderID: "14"
1: SparePartID: "35", qty: 1, Price: "250", OrderID: "14"
2: SparePartID: "36", qty: 1, Price: "430", OrderID: "14"

我的 PHP Api 代码如下:

---> part_order_details.php

<?php

header("Access-Control-Allow-Origin: http://localhost/Auth/");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

include_once '../config/database.php';
include_once '../objects/order.php';


$database = new Database();
$db = $database->getConnection();


$order = new Order($db);

$a = file_get_contents("php://input");
$data = json_decode($a, true);

if($order->orderDetails($data))

    http_response_code(200);
    echo json_encode(array(
        "message" => "All rows of Order Details are inserted.",

    ));

else

    http_response_code(400);
    echo json_encode(array("message" => "Sorry! Error while inserting rows of order details"));

?>

和 -----> order.php 是:

<?php
class Order

    private $conn;

    public $SparePartID;
    public $OrderID;
    public $Price;
    public $Quantity;

    public function __construct($db)
        $this->conn = $db;
    


    function orderDetails($arr)
    
       $query=  "INSERT INTO sparepartorderdetails (SparePartID, OrderID, Quantity, Price) VALUES
      (:SparePartID, :OrderID, :qty, :Price) ";
      
        $stmt = $this->conn->prepare($query);

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

          if($stmt->execute())
            return true;
        
        else
           $arr = $stmt->errorInfo();
            print_r($arr);
        
        
    

目前,我正在尝试使用 POSTMAN 测试 PHP API。 所以我在 Postman 正文中发送此数据以获取 POST 请求:


"0":
"SparePartID": "34",
"qty": "1",
"Price": "500",
"OrderID": "14",

"1":
"SparePartID": "35",
"qty": "1",
"Price": "250",
"OrderID": "14"

但 POSTMAN 显示 ERROR 状态:400 Bad Request 并带有消息: "message": "抱歉!插入订单详情行时出错"

我搜索了很多这个问题,但没有解决方案。 我是否遗漏了什么或使用错误的方式插入多个 JSON 行?请帮我!

【问题讨论】:

你能显示发布的实际原始数据吗?因为您在顶部显示的内容不是有效的 JSON。 @PatrickQ 我在 POSTMAN 中发布的原始数据是我问题最后的数据。 “0”:“SparePartID”:“34”,“数量”:“1”,“价格”:“500”,“订单ID”:“14”,“1”:“SparePartID”:“35 ", "数量": "1", "价格": "250", "OrderID": "14" 好的,所以第一件事,如果你想在一个请求中插入多条记录,不要在你的循环中return。也许跟踪哪些记录插入成功,哪些没有插入,然后在最后报告结果。就您的执行看似返回错误而言,请查看 PDO error handling 以帮助您找出确切的问题。 插入时需要从db类中得到一个更无用的错误。 @RaymondNijland 也许你的意思是一个更有用的错误:) 【参考方案1】:

你的问题主要出在这一行:

$data = json_decode($a, true);

关于数据的绑定:

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

当您 json_decode 使用 true 关联参数时,您的结果数据将是一个数组数组,其键是字符串,而不是整数。因此,您需要将访问每个属性的方式从整数索引更改为字符串索引。您可以将 bindValue 的出现更改为如下所示:

$stmt->bindValue(':SparePartID', $item['SparePartID']);
$stmt->bindValue(':qty', $item['qty']);
$stmt->bindValue(':Price', $item['Price']);
$stmt->bindValue(':OrderID', $item['OrderID']);

上述解决方案的替代方法是更改​​您使用json_decode 的方式。删除 true 并更新您的 bindValue 事件以使用对象属性访问(因为现在数据将被解码为对象而不是数组):

$data = json_decode($a);

$stmt->bindValue(':SparePartID', $item->SparePartID);
$stmt->bindValue(':qty', $item->qty);
$stmt->bindValue(':Price', $item->Price);
$stmt->bindValue(':OrderID', $item->OrderID);

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

【讨论】:

以上是关于如何使用 PHP PDO 在 mySQL 中插入多行 JSON 对象数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库

php PDO 和 mysql:如何插入地理点类型?

在 pdo 准备好的语句中执行多插入或许多不同的插入更好/更快吗?

使用 PDO 从 php 页面将具有更多列的表单数据插入 mysql 数据库

PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]

如果记录已经存在或者在 PDO MySQL 插入查询中不存在,如何生成 javascript 警报?