2017-01-28 11 views
0

複数のテーブルから行を削除しようとしています。私は以下の質問を見てきましたが、どれも私の問題を解決していないようです。どんなに私は、私は次のようなエラーになっ維持しようとするもの:ここでPHPでSQLを使用して複数のテーブルを削除する

Fatal error: Call to a member function bind_param() on a non-object

を私は新しい質問をする前に、私は私を助けしようとするを見てきたいくつかの質問ではありません。

Delete with Join in MySQL

Deleting using LEFT JOIN

Deleting rows from multiple tables in MySQL

MySQL delete row from multiple tables

基本的にはどのような私が作るしようとしていることは、ユーザーが自分のアカウントを削除することを可能にする機能です。彼らのアカウントは4つの異なるテーブルに情報を持ち、各テーブルは共通の「ID」を持っていますが、名前は異なっています。

私が続行する前に、ユーザーがテーブルのいずれかに情報を保存していない場合があります。

table users 

user_id | firstname | surname 
------------------------------- 
10  | Joe  | Bloggs 
16  | Jane  | Doe 


table pets 

pet_id | pet_user_id | pet_name 
------------------------------- 
1  | 10   | Rover 
2  | 16   | Jess 

table report 

report_id | rep_user_id | rep_content 
------------------------------- 
1  | 10   | Hello World 
2  | 16   | Goodbye World 

table user_files 

file_id | file_user_id| file 
------------------------------- 
1  | 10   | agreement.pdf 
2  | 16   | cv.docx 

だから私はこれらのテーブルのそれぞれからの16のIDを持つユーザーを削除すると言う:これがある場合、エラーがここ

を投げている理由を知ってはいけないことは、私のテーブル構造です。これまでに私が試したことは次のとおりです。

まず:

$stmt = $conn->prepare('DELETE * FROM users, pets, report, user_files WHERE user_id = ?, pet_user_id = ?, rep_user_id = ?, file_user_id = ? '); 

第二:

$stmt = $conn->prepare('DELETE users.*, pets.*, reports.*, user_files.* FROM users LEFT JOIN pets ON pets.pet_user_id=users.user_id LEFT JOIN report ON report.rep_user_id=users.user_id LEFT JOIN user_files ON user_files.user_id=users.user_id WHERE user_id = ?'); 

サード:

$stmt = $conn->prepare('DELETE users, pets, report, user_files FROM 
    table1 as users 
    INNER JOIN table2 as pets on users.user_id = pets.pet_user_id 
    INNER JOIN table3 as report on users.user_id=report.rep_user_id 
    INNER JOIN table4 as user_files on users.user_id=user_files.user_id 
    WHERE users.user_id= ?'); 

セッション変数から$user_idが定義されています。

+0

関連するテーブルの関連項目を削除するためにdb内にトリガーを設定する方が簡単ではないでしょうか? – Jeff

+0

@ Jeff以前はトリガーについて聞いたことがありませんでしたが、Googleで検索したところ、この記事のhttps://www.sitepoint.com/database-triggers-events/には、外部キー制約を使用する必要があります。 –

+0

クエリが失敗したため、理由を調べて実際のエラーを確認する必要があります。あなたが掲示したものは十分なコードではなく、どのコードが実行され、どのように実行されるのでしょうか?ここでは複数のクエリを実行したいと思うようです。あなたが投稿したものを与えてください。エラー報告と 'mysqli_error($ conn)'をここで使うことができます。 –

答えて

0

私はあなたの3番目のステートメントはうまくいくはずだと思うが、私はそれを左の結合で構築するだろう。あなたのMySQLのコンソール上(「USER_ID」などのパラメータ「16」で)この文を実行し、それが動作するかどうかをチェックしてみてください

DELETE users, pets, report, user_files 
FROM users 
LEFT JOIN pets ON (pets.pet_user_id=users.user_id) 
LEFT JOIN report ON (report.rep_user_id=users.user_id) 
LEFT JOIN user_files ON (user_files.file_user_id=users.user_id) 
WHERE users.user_id=?; 

次のSQLの更新をしてみてください。

もしそうでなければ、バインドされた変数$user_idに問題があると思います。 var_dump($user_id)の出力を教えてください。

+0

LEFT JOINに変更し、変数ではなくuser_idを直接挿入したときに期待通りにクエリを実行しました。 私はのvar_dump($ USER_ID)の 内容のint(30) –

+0

でエラー「『節は』内に不明な列 『$のUSER_ID』を」受け取るの$ user_idを変数にしようと、実際に私は浮気されたものを、知っていますパラメタをバインドするのではなく、クエリ内に変数$ user_idがあります。それを今変更し、これは動作します。 INNER JOINからLEFTに変更しました。ありがとう。 –

関連する問題