我需要分別存儲客戶購買的產品,並使用一個名爲order_id
的主鍵來了解產品屬於哪個訂單。
在一張表中,我將訂單存儲在另一張購買的產品中。
我orders
表結構是:將訂單ID分配給其產品
order_id (PRIMARY KEY),
customer_id,
customer_name,
order_price,
order_date
我purchased_products
表結構是:
order_id (FOREIGN KEY with REFERENCES orders(order_id)),
product_name,
product_price,
quantity
它是如何工作
當有人買東西,我運行這段代碼來存儲所有的數據:
try
{
$connection = new PDO("mysql:host={$HOST};dbname={$DB_NAME}", $USERNAME, $PASS);
}
$connection->beginTransaction();
$sql = "INSERT INTO orders (customer_id, customer_name, order_price, order_date)
VALUES (?, ?, ?, ?)";
$query = $connection->prepare($sql);
$query->execute(array
(
$user_id,
$user['user_name'],
$order_price,
$date
));
$id_of_respective_order = $connection->lastInsertId();
$sql = "INSERT INTO purchased_products (order_id, product_name, product_price, quantity)
VALUES (?, ?, ?, ?)";
$query = $connection->prepare($sql);
foreach($_SESSION['cart'] as $product)
{
$query->execute(array
(
$id_of_respective_order,
$product['product_name'],
$product['product_price'],
$product['quantity']
));
}
$connection->commit();
W ith此邏輯我鎖定表格,然後插入訂單,並將正確的訂單ID分配給屬於它的產品我使用PDO lastInsertId
。之後,我可以用做一個查詢:
SELECT * FROM orders c, purchased_products pc WHERE c.customer_id LIKE {$user_id} AND pc.order_id = c.order_id ORDER BY c.order_id DESC
我的問題是:
1.這方法100%安全嗎?如果不是,該怎麼辦?
2.如果有太多客戶同時購買,表格將被鎖定,但是所有數據都將按順序逐一正確插入,等待先前的訂單或者在某人數據爲被插入會收到一個錯誤,並需要嘗試完成他的訂單後?
3.如果有太多客戶同時購買,是否有機會將產品分配錯誤的訂單ID?
我很欣賞這種關注,我非常希望能夠得到一個具體的答案,它可以消除我所有的疑惑,並向我保證我可以無憂無慮地安靜地使用這種方法。
你的代碼是安全的(這是令人耳目一新的PHP代碼在這裏看到:-))。你做的一切都是正確的 - 依靠事務,準備好語句,重用第二條語句而不是在循環中調用prepare(),這些都是好事。產品沒有錯誤關聯的機會,因爲'lastInsertId()'是特定於連接的,並且您正在事務中運行它,所以沒有其他用戶可以獲得相同的值。 –
@MichaelBerkowski謝謝你的解釋! – Dyan
事實上,因爲它是連接特定的,所以它不在交易 – Strawberry