Я делаю вставки через цикл, к сожалению, кажется, что вставляются только некоторые данные и игнорируются некоторые.
Я читаю содержимое файла и вставляю его в базу данных postgres с помощью PHP.
Смотрите мой код ниже.
$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';}
?>
Я не понимаю, как это будет вставлять что-нибудь!
Эта строка неверна
$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();
}
Это работало, проблема была из-за неэкранированных символов в вставляемых строках, поэтому pg_escape_string помог очистить строку перед вставкой