CSV while循环不循环

时间:2016-12-06 08:01:51

标签: php mysql csv ubuntu

所以我想循环浏览2个文件(1个csv,1个asc),我想循环两个文件,以便它们都被插入到数据库中,但它不会导入它们。
这是代码:

<?php
    function importdb() {
        $File = 'lijst.csv';
        $File2 = 'preise.asc';
        $handle     = fopen($File, "r");
        $handle2     = fopen($File2, "r");
        $arrResult  = array();
        $arrResult2  = array();
        fgetcsv($handle);
        fgetcsv($handle);
        fgetcsv($handle);
        fgetcsv($handle);
            while(($data = fgetcsv($handle, 1000, ";")) !== FALSE || (($data2 = fgetcsv($handle2, 1000, ";"))) !== FALSE){
                include('db_config.php');
                $artikelnmr = $data[0];
                $barcode = $data[1];
                $omschrijving_nl = $data[2];
                $omschrijving_exp = $data[3];
                $bruto_prs = $data[4];
                $staffel_prs = $data[5];
                $aktie_prs = $data[6];
                $bruto_antl = $data[8];
                $staffel_antl = $data[9];
                $aktie_aantal = $data[10];
                $voorraad = $data[15];
                $leverdatum = $data[16];
                $besteld = $data[17];
                $pallet_antl = $data[19];
                $artikel_groep = $data[22];
                $extra_info = $data[27];
                $stmt = $db->prepare("INSERT INTO `producten`(`id`, `artikelnr`, `barcode`, `omschrijving_nl`, `omschrijving_exp`, `bruto_prijs`, `bruto_aant`, `staffel_prijs`, `staffel_aantal`, `aktie_prijs`, `aktie_aantal`, `voorraad`, `leverdatum`, `besteld`, `pallet_aantal`, `artikel_groep`, `extra`)
                VALUES ('', :artikelnmr,:barcode,:omschrijving_nl,:omschrijving_exp,:bruto_prijs,:bruto_aantal,:staffel_prijs,:staffel_aantal,:aktie_prijs,:aktie_aantal,:voorraad,:leverdatum,:besteld,:pallet_aantal,:artikel_groep,:extra)");
                $stmt->bindParam(":artikelnmr", $artikelnmr);
                $stmt->bindParam(":barcode", $barcode);
                $stmt->bindParam(":omschrijving_nl", $omschrijving_nl);
                $stmt->bindParam(":omschrijving_exp", $omschrijving_exp);
                $stmt->bindParam(":bruto_prijs", $bruto_prs);
                $stmt->bindParam(":bruto_aantal", $bruto_antl);
                $stmt->bindParam(":staffel_aantal", $staffel_antl);
                $stmt->bindParam(":staffel_prijs", $staffel_prs);
                $stmt->bindParam(":aktie_aantal", $aktie_aantal);
                $stmt->bindParam(":aktie_prijs", $aktie_prs);
                $stmt->bindParam(":voorraad", $voorraad);
                $stmt->bindParam(":leverdatum", $leverdatum);
                $stmt->bindParam(":besteld", $besteld);
                $stmt->bindParam(":pallet_aantal", $pallet_antl);
                $stmt->bindParam(":artikel_groep", $artikel_groep);
                $stmt->bindParam(":extra", $extra_info);
                $stmt->execute();
                $stmt2 = $db->prepare("INSERT INTO `prijzen`(`artikelnr`, `prijs_soort`, `prijs1`, `prijs2`, `prijs3`, `prijs4`, `prijs5`) VALUES (:artikelnmr, :soort, :prijs1, :prijs2, :prijs3, :prijs4, :prijs5)");
                $type = $data2[0];
                $artikel = $artikelnmr;
                $prijs1 = $data2[6];
                $prijs2 = $data2[7];
                $prijs3 = $data2[8];
                $prijs4 = $data2[9];
                $prijs5 = $data2[10];
                $stmt2->bindParam("artikelnmr", $artikel);
                $stmt2->bindParam(":soort", $type);
                $stmt2->bindParam(":prijs1", $prijs1);
                $stmt2->bindParam(":prijs2", $prijs2);
                $stmt2->bindParam(":prijs3", $prijs3);
                $stmt2->bindParam(":prijs4", $prijs4);
                $stmt2->bindParam(":prijs5", $prijs5);
                $stmt2->execute();
            }
            fclose($handle);
            fclose($handle2);

    }
    importdb();
?>

当我运行代码时,它会返回此错误:

  
    

致命错误:未捕获的异常&#39; PDOException&#39;消息&#39; SQLSTATE [23000]:完整性约束违规:1048列&#39; prijs_soort&#39;不能为空&#39;在/home/ubuntu/workspace/import.php:65堆栈跟踪:#0 /home/ubuntu/workspace/import.php(65):PDOStatement-&gt; execute()#1 / home / ubuntu / workspace / import。 php(71):importdb()#2 {main}在第65行的/home/ubuntu/workspace/import.php中抛出

  

2 个答案:

答案 0 :(得分:1)

替换'||'与'&amp;&amp;'在条件下。

发生此错误是因为其中一个文件已完成,但另一个文件已完成但条件仍为真,因为其中一个'或 - 条件'为真。要使代码生效,您需要两个条件都是真的。

答案 1 :(得分:0)

这可能对您有用,也可能不对您有用,但在处理PDO语句时,我发现以下函数对于帮助调试很有用。

function debugpdo( $sql, $sqlparams ){
    $a=$b=array();
    foreach( $sqlparams as $key => $value ){
        $a[]="set @".str_replace(':','',$key)."='".$value."';";
        $b[]=str_replace(':','@',$key );
    }
    echo '<pre>';
    echo implode( PHP_EOL, $a ) . str_repeat( PHP_EOL, 1 );
    echo str_replace( array_keys( $sqlparams ), $b, $sql );
    echo '</pre>';
}



$sql='insert into `prijzen`( `artikelnr`, `prijs_soort`, `prijs1`, `prijs2`, `prijs3`, `prijs4`, `prijs5` ) values ( :artikelnmr, :soort, :prijs1, :prijs2, :prijs3, :prijs4, :prijs5 )';
$sqlparams=array(
    ":artikelnmr"   =>  $artikel,
    ":soort"        =>  $type,
    ":prijs1"       =>  $prijs1,
    ":prijs2"       =>  $prijs2,
    ":prijs3"       =>  $prijs3,
    ":prijs4"       =>  $prijs4,
    ":prijs5"       =>  $prijs5
);
/* copy the output and run in gui app */
debugpdo( $sql, $sqlparams );


$sql="insert into `producten`(`id`, `artikelnr`, `barcode`, `omschrijving_nl`, `omschrijving_exp`, `bruto_prijs`, `bruto_aant`, `staffel_prijs`, `staffel_aantal`, `aktie_prijs`, `aktie_aantal`, `voorraad`, `leverdatum`, `besteld`, `pallet_aantal`, `artikel_groep`, `extra`)
values ('', :artikelnmr,:barcode,:omschrijving_nl,:omschrijving_exp,:bruto_prijs,:bruto_aantal,:staffel_prijs,:staffel_aantal,:aktie_prijs,:aktie_aantal,:voorraad,:leverdatum,:besteld,:pallet_aantal,:artikel_groep,:extra)";
$sqlparams=array(
    ':artikelnmr'       => $artikelnmr,
    ':barcode'          => $barcode,
    ':omschrijving_nl'  => $omschrijving_nl,
    ':omschrijving_exp' => $omschrijving_exp,
    ':bruto_prijs'      => $bruto_prs,
    ':bruto_aantal'     => $bruto_antl,
    ':staffel_aantal'   => $staffel_antl,
    ':staffel_prijs'    => $staffel_prs,
    ':aktie_aantal'     => $aktie_aantal,
    ':aktie_prijs'      => $aktie_prs,
    ':voorraad'         => $voorraad,
    ':leverdatum'       => $leverdatum,
    ':besteld'          => $besteld,
    ':pallet_aantal'    => $pallet_antl,
    ':artikel_groep'    => $artikel_groep,
    ':extra'            => $extra_info
);
debugpdo( $sql, $sqlparams );

然后我尝试直接在mysql客户端中运行带有关联变量的sql语句(在我的情况下通常是Heidi

我意识到你没有数组形式的sql参数,但这可能有助于调试。