我有一个问题,我正在写一个函数,其中我采取一个大的csv文件,并将其输入到一个数组2d数组。
从包含各种记录的数据库表导出的csv文件,
函数执行的步骤如下:
//A. get temporary file path
//B. place file into array as a long string
//C. parse string into array based on rows ('r)
//D. parse row strings into arrays for columns (,)
//1. Query db for price codes
//1.1 Loop through CSV top row to find price code x axis position
//2. Loop through price codes SQL
//2.1 Loop through price codes column from CSV file
//2.1.1 IF match price code
//2.1.2 Check if id match on price list array
//2.1.3 Add record to prices table
//Success
//Failure (this could kill the loop maybe)
//3. Close loops and close sql connection
价格代码是与价格适用的地理区域有关的代码。
函数循环遍历数据库中的所有价格代码
在价格代码循环中,子循环筛选csv数组,查找与当前循环匹配的价格代码的记录。
当找到匹配项时,输入到数据库
代码如下:点击查看代码
我在循环的每一步都输出调试文本,看看是否一切都执行成功。
循环执行正确-然而,由于某些未知的原因,在某个点之后,mysqli查询不再向数据库添加进一步的记录。
怎么会这样?即使它没有给出错误,并且输出到页面的SQL查询字符串看起来完好无损。
考虑运行纯SQL,将所有数据块,csv_array
和onPriceList
上传到MySQL临时表中(如果它们定期更改则定期清理),并运行一个SQL查询,避免嵌套的foreach
循环和if
逻辑。
你可以很容易地上传csv数据到MySQL在一个调用使用LOAD DATA INFILE
(或插入PHP迭代):
LOAD DATA INFILE '/path/to/csv/file.csv'
INTO TABLE csvdata
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ''r'n';
然后,运行一个简单的追加查询(调整下面以与实际的表和字段名称对齐,因为屏幕截图没有显示):
INSERT INTO prices (PriceCode, SellingPrice, StockCode)
SELECT c.priceCodePosition, c.pricePosition, c.model_idPosition
FROM csvdata c
INNER JOIN pricecodes p
ON c.model_idPosition = p.Code
WHERE c.model_idPosition IN (SELECT p.prices FROM onPriceList)
如果您需要捕获与逻辑不匹配的记录(正如您需要使用echo语句一样),请运行对立语句(它将是未追加的记录):
SELECT c.priceCodePosition, c.pricePosition, c.model_idPosition
FROM csvdata c
LEFT JOIN pricecodes p
ON c.model_idPosition = p.Code
WHERE c.model_idPosition IS NULL
OR c.model_idPosition NOT IN (SELECT p.prices FROM onPriceList)