2017-01-28 1 views
0

그래서 여러 테이블에서 행을 삭제하려고합니다. 다음 질문을 살펴 보았지만 아무도 내 문제를 해결하지 못하는 것 같습니다.PHP에서 SQL을 사용하여 여러 테이블에서 삭제

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

여기 내가 새로운 질문을하기 전에 나를 도와 시도에보고 한 몇 가지 질문 : 내가 노력할 상관없이 내가 다음과 같은 오류가 없습니다 계속.

MySQL delete row from multiple tables

Deleting rows from multiple tables in MySQL

Deleting using LEFT JOIN

Delete with Join in MySQL

기본적으로 내가 무엇을 만들려고 노력하고있어 사용자가 자신의 계정을 삭제할 수있는 기능입니다. 그들의 계정은 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= ?'); 

?$stmt->bind_param('i', $user_id);을 사용하여 바인딩됩니다. 여기서 $user_id은 세션 변수에서 정의됩니다.

+0

관련 테이블의 관련 항목을 삭제하기 위해 DB에서 트리거를 설정하는 것이 더 쉽지는 않습니까? – Jeff

+0

@Jeff 전에는 트리거에 대해 들어 본 적이 없지만 Google에서 찾았을 때 외래 키 제약 조건을 사용해야한다는 https://www.sitepoint.com/database-triggers-events/이 문서가 있습니다. –

+0

쿼리가 실패 했으므로 이유를 찾고 실제 오류를 확인해야합니다. 게시 한 내용은 코드가 충분하지 않으며 어떤 코드가 실행되고 어떻게 수행됩니까? 여기에 다중 쿼리를 수행하려는 것처럼 보입니다. 네가 올린 것을 줘. 에러 리포팅과 mysqli_error ($ conn)가 여기서 사용될 수 있습니다. –

답변

0

세 번째 선언문이 제대로 작동해야한다고 생각하지만 왼쪽 조인으로 작성했습니다.

다음 SQL 업데이트를 시도하십시오 :

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=?; 

당신은 당신의 MySQL의 콘솔 ("USER_ID"등의 매개 변수를 "16"로)이 문을 실행하고 작동하는지 확인하기 위해 시도해야합니다.

그렇지 않은 경우 바인드 된 변수 $user_id에 문제가 있다고 가정합니다. var_dump($user_id)의 출력을 제공 할 수 있습니까?

+0

LEFT JOIN으로 변경했으며 변수 대신 직접 user_id를 삽입했을 때 예상대로 쿼리가 실행되었습니다. 은 $ USER_ID 변수로 시도 나는 위해서 var_dump ($ USER_ID)의 내용은 실제로 당신이 알고 INT (30) –

+0

, 내가 주위에 무엇을 엉망으로했다 " '절은 어디에서 알 수없는 열'$의 USER_ID '"오류가 발생 매개 변수를 바인딩하는 대신 쿼리에서 $ user_id 변수를 사용했습니다. 그것을 지금 바꿨습니다. INNER JOIN에서 LEFT로 변경되었습니다. 감사. –

관련 문제