Как получить номер строки при вставке записей из файла в БД с помощью LOAD DATA LOCAL INFILE, транзакции и фиксации?
Тем не менее, только получение true
или false
(в случае неудачи) с var
Утверждение:
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY ' ' ( 'Col1', 'Col2', 'Col3')
Автор сценария:
public function PDO_UL_IUPD($dbUsing, $stmtpre) {
$started = microtime(true);
$DB = [];
$val = [];
$conn = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_PRE . "" . $dbUsing . "",
DB_USERNAME,
DB_PASS,
array(
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
PDO::ATTR_EMULATE_PREPARES => FALSE,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$conn->beginTransaction();
$conn->exec("set names utf8");
$count = 0;
$RowReg = 0;
// our SQL statements
foreach ($stmtpre as $stmt) {
$count++;
$conn->exec($stmt);
}
$RowReg = $conn->commit();
echo var_dump($RowReg);
$DB['SMG'] = "Correct Execution, a csv file has been dumped.<br><br>";
$DB['R'] = true;
} catch (PDOException $e) {
$DB['SMG'] = "Error: " . $e->getMessage();
$DB['R'] = false;
}
return $DB;
}
Скрипт Update1:
Попытка получить номер строки из EXEC
return 0
Автор сценария:
public function PDO_UL_IUPD($dbUsing, $stmtpre) {
$started = microtime(true);
$DB = [];
$val = [];
$conn = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_PRE . "" . $dbUsing . "",
DB_USERNAME,
DB_PASS,
array(
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
PDO::ATTR_EMULATE_PREPARES => FALSE,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->beginTransaction();
try {
$conn->exec("set names utf8");
$count = 0;
$RowReg=0;
$cReg=0;
// our SQL statements
foreach ($stmtpre as $stmt) {
//echo $stmt."<br><br><br>";
$count++;
$cReg=$conn->exec($stmt);
$RowReg=$RowReg+$cReg;
}
$conn->commit();
echo var_dump($RowReg);
$DB['SMG'] = "Correct Execution, a csv file has been dumped.<br><br><br>";
$DB['R'] = true;
} catch (PDOException $e) {
$DB['SMG'] = "Error en Tiempo de Ejecucion: " . $e->getMessage();
$DB['R'] = false;
}
return $DB;
}
Обновление 2:
добавив это Return 1
SET @row=0;
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY ' ' ( 'Col1', 'Col2', 'Col3')
SET file_line_no = @row:=@row+1;
Решено:
Этот скрипт полностью одобрен:
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY ' ' ( 'Col1', 'Col2', 'Col3')
Но я сливаю его с другим в некотором Query Like That:
DELETE FROM tablename WHERE date BETWEEN '$Date1' AND '$Date2';
ALTER TABLE tbalename AUTO_INCREMENT = 1;
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY ' ' ( 'Col1', 'Col2', 'Col3');
это неправильно, потому что $PDO->exec()
Cant возвращает количество затронутых таблиц или строк.
Вместо этого, чтобы решить, мне нужно пройти массив, потому что мой скрипт поддерживает его так:
$stmtpre[1] = "DELETE FROM tablename WHERE date BETWEEN '$Date1' AND '$Date2';";
$stmtpre[2] = "ALTER TABLE tbalename AUTO_INCREMENT = 1;";
$stmtpre[3] = "LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY ' ' ( 'Col1', 'Col2', 'Col3');";
exec
возвращает количество строк, а неcommit
. Попробуйте$RowReg=$conn->exec($stmt);