Php CSV PDO插入循环?
我最近问过如何将CSV插入MySQL数据库。有人建议我使用LOAD DATA LOCAL Infle,但事实证明,这在我的主机上是禁用的,因此不再是一个选项。回到PHP循环 我在循环临时上传的结果时遇到了一个问题,因为我在插入时将值映射到一个数组。因此,在多行上,这会导致同一条目输入两次(第一行的值),因为数组值是显式定义的 插入1,2,3,4,然后插入1,2,3,4。我想插入数组的1,2,3,4,然后是5,6,7,8 解决方案是什么(除了hacky for和row++) 提前谢谢Php CSV PDO插入循环?,php,loops,csv,upload,pdo,Php,Loops,Csv,Upload,Pdo,我最近问过如何将CSV插入MySQL数据库。有人建议我使用LOAD DATA LOCAL Infle,但事实证明,这在我的主机上是禁用的,因此不再是一个选项。回到PHP循环 我在循环临时上传的结果时遇到了一个问题,因为我在插入时将值映射到一个数组。因此,在多行上,这会导致同一条目输入两次(第一行的值),因为数组值是显式定义的 插入1,2,3,4,然后插入1,2,3,4。我想插入数组的1,2,3,4,然后是5,6,7,8 解决方案是什么(除了hacky for和row++) 提前谢谢 $handl
$handle = fopen($_FILES['csv']['tmp_name'], "r");
$sql = "INSERT INTO tbl (col1, col2, col3, col4) VALUES (?, ?, ?, ?)";
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$query = $db->prepare($sql);
if ($query->execute(array($data[0],$data[1],$data[2],$data[3]))) return true;
else return false;
}
首先,您只需要准备一次查询(这是使用prepared语句的两个主要优点之一,注入预防是另一个优点),因此将对
prepare()
的调用放在while
循环之前,而不是放在循环内部
除此之外,我看不出你发布的代码会像你声称的那样运行的原因,除非你的数据在你的CSV文件中重复。我唯一能想到的是你的循环只执行了一次,但你运行了两次循环。(循环中有一个“return”语句。) 以下方面应起作用:
function loadCsv($db, $filename){
$fp = fopen($filename, 'rb');
$sql = 'INSERT INTO tbl (col1, col2, col3, col4) VALUES (?,?,?,?)';
$pstmt = $db->prepare($sql);
while (FALSE !== ($data = fgetcsv($fp, 1000))) {
$cols = array_slice($data, 0, 4);
$query->execute($cols);
}
$pstmt->closeCursor();
fclose($fp);
}
为了获得最大的兼容性和性能,我建议使用类似的函数连接到PDO。问题在于返回语句。删除返回立即修复了问题 不幸的是,发布此答案的用户已将其删除
谢谢大家的建议和帮助 这个循环如何运行多次?这里有一个返回语句。