1つのページで登録と更新を作っているのですが、
下記コードの場合、projectTitleをUNIQUEにしているので
projectTitleを変えると変更ではなく追加になってしまいます。
この場合どうやって回避できるでしょうか?
$sql = "INSERT INTO user_vitae( user_id, projectTitle, projectsContents ) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE user_id = ?, projectTitle = ?, projectsContents = ? "; for($i=0;$i<count($_POST['projectTitle']);$i++) { $stmt = $this->pdo->prepare($sql); $stmt->execute([ $_SESSION['id'], $_POST['projectTitle'][$i], $_POST['projectsContents'][$i], $_SESSION['id'], $_POST['projectTitle'][$i], $_POST['projectsContents'][$i] ]); }
案件名をUNIQUEにしているので、例えば
「test1」登録しておいて、
案件名を「test2」に変えたいなぁ~ってなったら、
更新ではなく新規登録になってしまいます。
これはどう防げばよいのでしょうか?
入力(変更)を必要としないカラムは
・id
・created
・user_id
この3つです。
ソースはこうなっております。
全部載せると量が多いので必要なところだけを載せています。
<?php $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $pdo = new PDO($dsn, $user, $password, $option); $sql = "SELECT * FROM user_vitae WHERE user_id=? ORDER BY id ASC"; $stmt = $pdo->prepare($sql); $stmt->execute([$_SESSION['id']]); ?> <form action="" method="post"> <?php foreach ($stmt as $test) { ?> <table border=""> <tbody> <tr> <td>案件名</td> <td> <input type="text" name="projectTitle[]" maxlength="30" size="" placeholder="" value="<?php echo $test['projectTitle'] ?>"> </td> </tr> <tr> <td>案件内容</td> <td> <textarea name="projectsContents[]" rows="2" cols="21"> <?php echo $test['projectsContents'] ?> </textarea> </td> </tr> </tbody> </table> <br /> <br /> <?php } ?> <table id="vitae" class="vitae" border=""> <tbody> <tr> <td>案件名</td> <td> <input type="text" name="projectTitle[]" maxlength="30" size="" placeholder="" > </td> </tr> <tr> <td>案件内容</td> <td> <textarea name="projectsContents[]" rows="2" cols="21"> </textarea> </td> </tr> </tbody> </table> <div id="vitaeAdd"> <input type="button" value="業務経歴を追加する" onClick="vitaeAdd()"> <input type="button" value="業務経歴を削除する" onClick="vitaeDel()" id="vitae_btnDel" disabled="true"> </div> <br /> <input type="submit" name="submit" value="登録する"> </form>
↓登録&更新用の処理です。
$sql = "INSERT INTO user_vitae( user_id, projectTitle, projectsContents ) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE projectTitle = ?, projectsContents = ? "; for($i=0;$i<count($_POST['projectTitle']);$i++) { $stmt = $this->pdo->prepare($sql); $stmt->execute([ $_SESSION['id'], $_POST['projectTitle'][$i], $_POST['projectsContents'][$i], $_POST['projectTitle'][$i], $_POST['projectsContents'][$i] ]); }
困っているところ
・ON DUPLICATE KEY UPDATEで案件名や案件内容をUNIQUEキーにしたら2つとも変更した場合、新規追加扱いになる
・ON DUPLICATE KEY UPDATEでuser_idをUNIQUEキーにしたら1件のレコードしか追加できなくなる
感じているところ
・案件名や案件内容をUNIQUEキーにしたら2つとも変更した場合、新規追加扱いになるのを防ぐために、idをUNIQUEにして、ON DUPLICATE KEY UPDATEに組み込んだらこの質問は解決されると思うが、そのSQLの組み方が分からない。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。