php foreach中的SQL查询

时间:2017-08-02 08:32:36

标签: php sql

我有那段代码。 在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();

2 个答案:

答案 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'];
        }
  • Single =将分配给变量,但Double =将运行检查