我最近问过如何将CSV插入MySQL数据库。有人建议我使用LOAD DATA LOCAL INFILE,但事实证明这在我的主机上是禁用的,因此不再是一个选项。回到PHP循环..
我在循环上传临时上传的结果时出现问题,因为我正在将值映射到插入数组。因此,在多行上,这会导致相同的条目输入两次(第一行的值),因为显式定义了数组值。
它插入1,2,3,4然后是1,2,3,4。我想插入数组的1,2,3,4和5,6,7,8。
解决方案是什么(除了hacky for和row ++)?
提前致谢。
$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;
}
答案 0 :(得分:1)
我唯一能想到的是你的循环只执行一次,但你运行循环两次。 (循环中有一个“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);
}
为了获得最大的兼容性和性能,我建议使用this connect_PDO
function等功能连接到PDO。
答案 1 :(得分:0)
首先,您只需要准备一次查询(这是使用预准备语句的两个主要优点之一,注入防护是另一个),因此在prepare()
之前调用while
{1}}循环,不在其中。
除此之外,我认为您发布的代码没有理由按照您声明的方式行事,除非您的数据在CSV文件中重复。
答案 2 :(得分:0)
问题在于return语句。立即删除回报修复了问题。
不幸的是,发布此答案的用户已将其删除。
感谢大家的建议和帮助!