[英]SQL queries in php foreach
我有一段代碼。 在foreach中有SQL查詢,我知道這不好,但是我無法提供有關如何優化這段代碼的線索。 我必須檢查是否存在名稱為$ item ['product_name']的行 ,如果不是-插入表中,依此類推,請幫幫我
$sqlData = "";
foreach ($data as $item) {
$item['product_name'] = str_replace('"', '', $item['product_name']);
$productData = $this->_conn->prepare("SELECT id FROM product WHERE `name` = '" . $item['product_name'] . "'");
$warehouseData = $this->_conn->prepare("SELECT id FROM warehouse WHERE `name` = '" . $item['warehouse'] . "'");
$productData->execute();
$warehouseData->execute();
if ($row = $productData->fetch(PDO::FETCH_ASSOC)) {
$productID = $row['id'];
} else {
$this->_conn->prepare("INSERT INTO product (`name`) VALUES ('" . $item['product_name'] . "')")->execute();
$productID = $this->_conn->lastInsertId();
}
if ($row = $warehouseData->fetch(PDO::FETCH_ASSOC)) {
$warehouseID = $row['id'];
} else {
$this->_conn->prepare("INSERT INTO warehouse (`name`) VALUES ('" . $item['warehouse'] . "')")->execute();
$warehouseID = $this->_conn->lastInsertId();
}
$tmpItem = implode(',', [$productID, $warehouseID, $item['quantity'], time()]);
$sqlData .= '(' . $tmpItem . ')';
if (next($data))
$sqlData .= ',';
}
$sql = "INSERT INTO wh_quantity (product_id, wh_id, quantity, created_at) VALUES " . $sqlData;
$this->_conn->prepare($sql)->execute();
如果您樂觀地表示“不是在循環中運行一百萬條選擇/插入語句”以便將大量數據加載到數據庫中,那么另一種方法是將大量數據加載到數據庫中(使用數據庫使用的任何批量加載工具),然后運行一條SQL語句,該語句將批量加載表中的數據與目標表中的數據進行比較
可以使用諸如MERGE查詢之類的數據將數據從一個表轉移到另一個表,更新存在匹配項的某些行,插入不存在匹配項的其他行
在操作結束時,您轉儲加載的批量數據
您應該檢查您的If語句
你有這個:
if ($row = $productData->fetch(PDO::FETCH_ASSOC)) {
$productID = $row['id'];
}
應該是這樣
if ($row == $productData->fetch(PDO::FETCH_ASSOC)) {
$productID = $row['id'];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.