Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSV PDO插入循环?_Php_Loops_Csv_Upload_Pdo - Fatal编程技术网

Php CSV PDO插入循环?

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

我最近问过如何将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++)

提前谢谢

$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。

问题在于返回语句。删除返回立即修复了问题

不幸的是,发布此答案的用户已将其删除


谢谢大家的建议和帮助

这个循环如何运行多次?这里有一个返回语句。