我有那段代码。 在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();
答案 0 :(得分:0)
如果,通过优化,你的意思是“不在循环中运行一百万个select / insert语句”,以便将大量数据加载到数据库中,另一种方法是加载大量数据进入数据库(使用数据库使用的任何批量加载工具),然后运行单个SQL语句,将批量加载表中的数据与目标表中的数据进行比较
像MERGE查询这样的东西可用于将数据从一个表传输到另一个表,更新存在匹配的一些行,插入不存在匹配的其他行
在操作结束时,您将转储您加载的批量数据
答案 1 :(得分:0)
您应该检查您的If语句
你有这个:
if ($row = $productData->fetch(PDO::FETCH_ASSOC)) {
$productID = $row['id'];
}
应该是这种方式
if ($row == $productData->fetch(PDO::FETCH_ASSOC)) {
$productID = $row['id'];
}