循环插入 - PHP Postgres插入

时间:2016-12-13 18:48:59

标签: php postgresql plpgsql php-pgsql

我正在通过循环进行插入,不幸的是,它似乎只插入了一些数据而忽略了一些。

我正在阅读文件的内容,并使用PHP将它们插入到postgres数据库中。

请参阅下面的代码。

$source='/Users/gsarfo/AVEC_ETL/TCCDec052016OSU.DAT';

$lines=file($source);

$len =sizeof($lines);

$connec = new PDO("pgsql:host=$dbhost;dbname=$dbname", $dbuser,    $dbpwd); 

$ins=$connec->query('truncate table tbl_naaccr_staging');

try {

    for ($x = 0; $x < $len; $x++) {
        $a1=substr($lines[$x],146,9);
        $a2=substr($lines[$x],2182,9);
        $a3=substr($lines[$x],192,3);
        $connec->beginTransaction();

        $sql2=$connec->prepare("INSERT INTO tbl_naaccr_staging
                                (addr,name, email) VALUES (?, ?, ?"); 

        $sql2->execute(array($a1,   $a2,    $a3));
        $connec->commit();     
    }
    $res=$connec->query($sql) ;
}

catch (PDOException $e) { 
    echo "Error : " . $e->getMessage() . "<br/>"; 
    die(); 
} 

if ($sql2)
{echo 'success';}
?>

2 个答案:

答案 0 :(得分:1)

我看不出那会插入什么东西!

此行不正确

$sql2=$connec->prepare("INSERT INTO tbl_naaccr_staging
                       (addr,name, email) VALUES (?, ?, ?"); 
                                                         ^ ^ here

纠正

$sql2=$connec->prepare("INSERT INTO tbl_naaccr_staging
                       (addr,name, email) VALUES (?, ?, ?)"); 

此外,您的交易没有多大意义,因为它提交每次更新,如果您没有启动交易会发生这种情况。所以也许这将是明智的,并将实现一个全有或全无的Senario

此外,准备可以多次重复使用,所以也可以将其移出循环,你会发现你的脚本运行得更快。

try {

    $connec->beginTransaction();   

    // move this out of the loop
    $sql2=$connec->prepare("INSERT INTO tbl_naaccr_staging
                            (addr,name, email) VALUES (?, ?, ?)");  

    for ($x = 0; $x < $len; $x++) {
        $a1=substr($lines[$x],146,9);
        $a2=substr($lines[$x],2182,9);
        $a3=substr($lines[$x],192,3);

        $sql2->execute(array($a1,   $a2,    $a3));
    }
    $connec->commit();  

    // I do not see a `$sql` variable so this query seems to have no function
    //$res=$connec->query($sql) ;
}

catch (PDOException $e) { 
    $connec->rollback();     

    echo "Error : " . $e->getMessage() . "<br/>"; 
    die(); 
} 

答案 1 :(得分:0)

它有效,问题是由于插入的字符串中未转义的字符所以pg_escape_string帮助清除字符串之前插入