前提・実現したいこと
MySQLでユーザー登録システムを作りました。これにユーザー削除機能を付け足したく、tb1から$mailを含む行を削除する際、ウェブから複数テーブルから同一の値($mail)が含まれる行を全て削除できるようにしたいです。
$mailはtb1においてはUNIQUEですがテーブルによってはそのデータが存在しない場合もあり、逆に複数存在する場合もあります。
該当のソースコード
纏めてDELETEするためにMySQLリファレンスの文言を試したり、検索したものを試したりしてみましたが浅学なもので上手くいかず、500エラーでcatchさえできませんでした。
そこでPHPのforeach文で無理やり回そうとしたのですがエラーが出てしまいます。DBへの接続は出来ています。
プレースホルダをWHERE句の前に使うことが駄目なのか、foreachがいけないのか、または別の要因かのどれかと考えているのですがこれ以上どうすれば良いのか見当もつかず手詰まりになってしまったので皆様の意見をお聞きしたく思います。
PHP
1$tables = array(tb1, tb2, tb3, tb4); 2foreach($tables as $table){ 3 $sql = "DELETE FROM :table WHERE mail = :mail"; 4 $stmt = $dbh->prepare($sql); 5 $stmt->bindValue(":table", $table, PDO::PARAM_STR); 6 $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); 7 $stmt -> execute(); 8}
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tb1', WHERE mail = 'sample@mail.com',' at line 1
当然ですが全部記述すると動きました。
PHP
1try { 2 $sql = 'DELETE FROM tb1 WHERE mail =?'; 3 $stmt = $dbh->prepare($sql); 4 $stmt->bindParam(1, $mail, PDO::PARAM_STR); 5 $stmt -> execute(); 6 $sql = 'DELETE FROM tb2 WHERE mail =?'; 7 $stmt = $dbh->prepare($sql); 8 $stmt->bindParam(1, $mail, PDO::PARAM_STR); 9 $stmt -> execute(); 10 $sql = 'DELETE FROM tb3 WHERE mail =?'; 11 $stmt = $dbh->prepare($sql); 12 $stmt->bindParam(1, $mail, PDO::PARAM_STR); 13 $stmt -> execute(); 14 $sql = 'DELETE FROM tb4 WHERE mail =?'; 15 $stmt = $dbh->prepare($sql); 16 $stmt->bindParam(1, $mail, PDO::PARAM_STR); 17 $stmt -> execute(); 18 } catch (Exception $e) { 19 echo '捕捉した例外: ', $e->getMessage(),"\n"; 20}
補足情報(FW/ツールのバージョンなど)
PHPとMySQLです。FWは使用していません。
どうぞよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/11 17:01