Estoy haciendo inserciones a través de un bucle, desafortunadamente, parece insertar solo algunos de los datos e ignorar algunos.

Estoy leyendo el contenido de un archivo y lo estoy insertando en una base de datos de Postgres usando PHP.

Ver mi código a continuación.

$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';}
?>
0
George Appiah Sarfo 13 dic. 2016 a las 21:48

2 respuestas

La mejor respuesta

Funcionó, el problema se debió a los caracteres sin escape en las cadenas que se insertaron, por lo que pg_escape_string ayudó a limpiar la cadena antes de insertar

0
George Appiah Sarfo 19 dic. 2016 a las 21:24

¡No veo cómo sería insertar algo!

Esta línea es incorrecta

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

Corrígelo a

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

Además, su transacción no tiene mucho sentido, ya que compromete todas las actualizaciones, que es lo que sucedería si no iniciara una transacción. Entonces, tal vez esto sea sensato y logre un senario de todo o nada.

Además, una preparación se puede reutilizar muchas veces, así que sáquela del bucle y verá que su script se ejecuta más rápido también.

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
RiggsFolly 13 dic. 2016 a las 18:59