バルクアップサート

 こうやれば一発で入るし、記述もシンプル。
 アップサートしたいデータをarrayに積み上げて、最後に一発UPSERT。すでにキーがあればUPDATE、なければINSERTされる。

<?php
try 
{
    $pdo = new PDO(
        'mysql:dbname=experiment;host=localhost;charset=utf8mb4',
        'root',
        '',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );

    $file = new SplFileObject("test.csv");
    $file -> setFlags(SplFileObject::READ_CSV);

    $placeHolder = "";
    $values = [];
    $isFirst = true;
    foreach ($file as $row) 
    {
        if ($isFirst == true) {
            $placeHolder = "(?, ?)";
            $isFirst = false;
        }
        else
        {
            $placeHolder .= ",(?, ?)";
        }
        list($name, $body) = $row;
        $values[] = $name;
        $values[] = $body;
    }
    $sql = "INSERT INTO `exp` (`name`, `body`) VALUES " . $placeHolder . " ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `body` = VALUES(`body`) ";
    $stmt = $pdo -> prepare($sql);
    $stmt -> execute($values);
} 
catch (Exception $e) 
{
    echo $e->getMessage(); 
}