前提・実現したいこと
PHPでユーザーログインシステムを作っています。
ユーザー情報更新の機能を実装中に以下のエラーが発生しました。
ユニークキー設定を解除せずに同一ユーザーの場合には更新できるようにしたい。
発生している問題・エラーメッセージ
エラーメッセージ SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'テスト田中' for key 'name'
エラーメッセージを解読するとnameが重複していると警告してことが判明している。
しかしログインしているユーザーが自身のアカウント情報を更新を行っているが
DBのusersテーブルでnameとemailにユニークキーを設定しているため
バリデーションが働きエラーが表示されていると判明。
該当のソースコード
PHP
//DB接続用 require_once ROOT_PATH.'/config/env.php'; class Db { protected $dbh; protected function __construct($dbh = null) { $host = DB_HOST; $dbname = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8"; if (!$dbh) { try { $this->dbh = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); } catch (PDOException $e) { echo '接続失敗'.$e->getMessage(); exit(); } } else { $this->dbh = $dbh; } } } //ユーザー情報更新用 public function updateUser($post) { try { $sth = $this->dbh; $sql = 'UPDATE users SET name = :name, email = :email, updated_at = :updated_at WHERE id = :id'; $stmt = $sth->prepare($sql); $stmt->bindValue(':name', $post['name'], PDO::PARAM_STR); $stmt->bindValue(':updated_at', $post['updated_at'], PDO::PARAM_STR); $stmt->bindValue(':email', $post['email'], PDO::PARAM_STR); $stmt->bindValue(':id', $post['id'], PDO::PARAM_STR); $stmt->execute(); } catch (PDOException $e) { exit($e->getMessage()); } }
試したこと
Laravelにはユニークキーを除外して更新する手段があるみたいなのですが
今回の環境ではLaravelを使用していないので参考にできない。
色々調査してみたが解決策が見つからないため
ご助言いただけないでしょうか。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
PHP 7.4.21
phpMyAdmin バージョン情報: 5.1.0
MAMP
まだ回答がついていません
会員登録して回答してみよう