Я пытаюсь создать систему заказов / счетов.
У меня есть одна таблица для orders
и одна таблица для позиций: orders_items
.
Я пытаюсь вставить все позиции сразу, используя атрибут PDO::ATTR_EMULATE_PREPARES
.
Я понимаю, о риске безопасности, пользовательский ввод в эту базу данных отсутствует. Это все за кадром.
Когда я анализирую массив $order_item
, я создаю несколько операторов INSERT sql с заполнителями.
Однако, когда я иду связывать параметры, в БД появляется сообщение, что добавляется только последний элемент в массиве $order_item
.
Вот как переменная $data
выглядит для массива $order_item
.
array(2) {
[0]=>
array(4) {
["name"] => string(8) "A red item"
["quantity"]=> int(1)
["price"] => string(1) "1"
["order_id"]=> string(2) "44"
}
[1]=>
array(4) {
["name"] => string(9) "A blue item"
["quantity"]=> int(1)
["price"] => string(1) "2"
["order_id"]=> string(2) "44"
}
}
Операторы Build Insert создадут это:
INSERT INTO orders_items ( name, quantity, price, order_id ) VALUES ( :name, :quantity, :price, :order_id );
INSERT INTO orders_items ( name, quantity, price, order_id ) VALUES ( :name, :quantity, :price, :order_id );
И на этапе привязки значения местозаполнителя я пытаюсь сделать следующее:
:name = "A red item", :quantity = 1, :price = 1, :order_id = 44
:name = "A blue item", :quantity = 1, :price = 2, :order_id = 44
Но только этот вставляется в БД:
:name = "A blue item", :quantity = 1, :price = 2, :order_id = 44
Вот моя функция создания
public static function create ($data = []) {
$order_info = $data['order_info'];
$orderID = //do first insert and get the record ID
$order_item = $data['order_item'];
//Attach the order number to the each item in the $order_item array
//This way during the SQL for each, the order_id, which is a required column, will be added
foreach ($order_item as $key=>$value){
$order_item[$key]["order_id"] = $orderID;
}
//Build the INSERT statements
$sql = "";
foreach ($order_item as $item){
$sql .= "INSERT INTO orders_items ";
$sql .= " ( " . implode(", ", array_keys($item)) . " )";
$sql .= " VALUES ( :" . implode(", :", array_keys($item)) . " ); ";
}
$db = static::getDB();
$db->setAttribute( PDO::ATTR_EMULATE_PREPARES, 1 );
$stmt = $db->prepare( $sql );
//BIND ALL THE ORDER ITEM PLACEHOLDERS TO THEIR VALUES.
foreach ($order_item as $item) {
foreach ($item as $linekey => $linevalue) {
$stmt->bindValue(":" . $linekey, $linevalue, PDO::PARAM_STR);
}
}
return $stmt->execute();
}
Что я делаю не так? Это возможно? Есть ли лучший способ?