

環境  
Centos 6.9  
PHP 7.0  
MySQL 5.1

お世話になります。  
表題の通りPHP(PDO)でMySQLにINSERTする際に重複チェックする方法についてご教示いただきたく書き込ませていただきました。

WEB上からCSVファイルをアップロードし、MySQLにINSERTするという流れです。  
その際に特定のカラム（以下の[filedata]）の内容のみ重複チェックをし、重複している場合はINSERTしない  
（同一ファイル内に重複がある場合も後のものはINSERTしない）  
且つINSERT完了後、重複した内容をWEB上に表示できればと考えております。

他のサイトなどを参考に以下の通り作ってみましたが、[INSERT IGNORE]を使用した形となっており  
これでは他のエラーも無視してしまいますし、重複した内容を確認することができません（私が知らないだけで可能かもしれません）  
※HTML箇所のエラーメッセージ表示やグループ内容などは省略しております。

[code]

    <?php
    $groupname = $_POST["groupname"];
    $importdate = date('Y-m-d H:i:s');
    
        try {
                $pdo = new PDO(
                'mysql:dbname=dbname;host=localhost;charset=utf8',
                'user',
                'passwd',
                array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode='TRADITIONAL'",
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_EMULATE_PREPARES => false,
                )
            );
            } catch (Exception $e) {
            $msg = array('red', $e->getMessage());
        }
    
    if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) {
        try {
            switch ($_FILES['upfile']['error']) {
                case UPLOAD_ERR_OK:
                    break;
                case UPLOAD_ERR_NO_FILE:
                    throw new RuntimeException('File is not selected');
                case UPLOAD_ERR_INI_SIZE:
                case UPLOAD_ERR_FORM_SIZE:
                    throw new RuntimeException('File is too large');
                default:
                    throw new RuntimeException('Unknown error');
            }
    
            $tmp_name = $_FILES['upfile']['tmp_name'];
            $filename = $_FILES["upfile"]["name"];
            $detect_order = 'ASCII,JIS,UTF-8,CP51932,SJIS-win';
            setlocale(LC_ALL, 'ja_JP.UTF-8');
    
            $buffer = file_get_contents($tmp_name);
            if (!$encoding = mb_detect_encoding($buffer, $detect_order, true)) {
                unset($buffer);
                throw new RuntimeException('Character set detection failed');
            }
            file_put_contents($tmp_name, mb_convert_encoding($buffer, 'UTF-8', $encoding));
            unset($buffer);
    
            $stmt = $pdo->prepare("INSERT IGNORE INTO import (filedata,importdate,groupname,filename) VALUES (?,'$importdate','$groupname','$filename')");
    
            $pdo->beginTransaction();
            try {
                $fp = fopen($tmp_name, 'rb');
                while ($row = fgetcsv($fp)) {
                    if ($row === array(null)) {
                        continue;
                    }
                    if (count($row) !== 1) {
                        throw new RuntimeException('Invalid column detected');
                    }
                    $executed = $stmt->execute($row);
                }
                if (!feof($fp)) {
                    throw new RuntimeException('CSV parsing error');
                }
                fclose($fp);
                $pdo->commit();
            } catch (Exception $e) {
                fclose($fp);
                $pdo->rollBack();
                throw $e;
            }
    
            if (isset($executed)) {
                $msg = array('green', 'インポートが完了しました');
            } else {
                $msg = array('black', 'There were nothing to import');
            }
    
        } catch (Exception $e) {
    
            $msg = array('red', $e->getMessage());
    
        }
    
    }
    ?>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
      <form enctype="multipart/form-data" method="post" action="">
    <select name='groupname' required/>
    <option value=''>グループを選択</option>
    </select>
          <input type="file" name="upfile" /><br /><br />
          <input type="submit" value="インポートする" />
        </fieldset>
      </form>
    </body>
    </html>
    
[/code]

以上、お力添えをよろしくお願いいたします。


CC BY-SA 3.0
2018-04-04T04:54:05.640
42924
2018-04-04T07:17:04.427
25016
question
php mysql
PHP(PDO)でMySQLにINSERTする際に重複チェックする方法について


`$stmt->execute($row);`実行後に `$stmt->errorInfo()` でエラー内容を確認できたような。

[code]

    print_r($stmt->errorInfo());
    実行時エラー有り： Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '1' for key 'PRIMARY' )
    正常実行時：　Array ( [0] => 00000 [1] => [2] => )
    
[/code]


CC BY-SA 3.0
2018-04-04T07:17:04.427
42926
2018-04-04T07:17:04.427
22793
42924
answer