Как отловить сбои в пакетной вставке pdo - PullRequest
1 голос
/ 27 мая 2020

У меня есть этот код для вставки данных из CSV-файла в базу данных. Поскольку CSV может содержать тысячи записей, я пытаюсь реализовать пакетную вставку следующим образом.

$this->_connection->beginTransaction();
$sql = "INSERT INTO dbtable (col1,col2) VALUES (:value1,:value2)";
$stmt = $this->_connection->prepare($sql);

foreach ($requestArray['csv'] as $data) {
    $stmt->bindParam(':value1', $data['csvCol1']);
    $stmt->bindParam(':value2', $data['csvCol2']);
    $stmt->execute();
}
$this->_connection->commit();

Переменная $ requestArray ['csv'] содержит все записи запроса CSV post. Кажется, этот код работает так, как должен. Хотя я пытаюсь улучшить это, потому что я хочу, чтобы пользователь знал, сколько записей не удалось вставить в базу данных и можно ли показать, какие записи не удалось. Предположим, что это дублированный ключ, неверные данные или вообще любая ошибка, которая может возникнуть в результате этой процедуры.

1 Ответ

0 голосов
/ 27 мая 2020

PDOStatement :: execute () вернет false в случае ошибки:

$this->_connection->beginTransaction();
$sql = "INSERT INTO dbtable (col1,col2) VALUES (:value1,:value2)";
$stmt = $this->_connection->prepare($sql);

foreach ($requestArray['csv'] as $data) {
    $stmt->bindParam(':value1', $data['csvCol1']);
    $stmt->bindParam(':value2', $data['csvCol2']);
    if (!$stmt->execute()) {
      // error processing goes here.
    }
}
$this->_connection->commit();
...