Как вставить несколько строк данных объекта JSON в mySQL с помощью PHP PDO? - PullRequest
1 голос
/ 17 апреля 2019

Я делаю PHP API для вставки нескольких строк данных объекта JSON .Мой формат данных JSON выглядит следующим образом:

(я получаю следующий формат в журнале консоли для console.log (this.state.cartItems []). inРЕАКТ)

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 is:

<?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);
        }
        }
    }
}

Сейчас я пытаюсь протестировать PHP API с помощью POSTMAN .поэтому я отправляю эти данные в теле почтальона для POST запроса:

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

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

}

Но POSTMAN показывает ОШИБКА Статус: 400 Неверный запрос с сообщением: {"message": "Извините! Ошибка при вставке строк сведений о заказе "}

Я много раз искал эту проблему, но не нашел решения.Я что-то упускаю или использую неправильный способ вставки нескольких строк JSON?Помогите мне, пожалуйста!

1 Ответ

1 голос
/ 17 апреля 2019

Ваша проблема в основном заключается в этой строке:

$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->execute заключается в том, что после первой итерации цикла ваша функция будет return true (в случае успеха). Он никогда не сможет закончить оставшиеся элементы для вставки. Вы должны удалить ранний оператор return и найти лучший способ вернуть индикатор успеха / неудачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...