2014-11-19 6 views
0

PHP 스크립트는 강력한 개체를 삭제

내가 설문 테이블의 데이터를 삭제하고 싶어 (I 적어도 10 reptation을 필요로 그 이미지를 게시 할 수 없습니다). 데이터베이스의 ERD를 게시해야하지만 사진을 게시 할 수 없습니다.

CREATE TABLE `account` (
    `accountID` INT(11) NOT NULL AUTO_INCREMENT, 
    `accountName` VARCHAR(255) DEFAULT NULL, 
    `email` VARCHAR(255) DEFAULT NULL, 
    `username` VARCHAR(20) DEFAULT NULL, 
    `pass` VARCHAR(20), 
    `dob` DATE DEFAULT NULL, 
    `imagePath` VARCHAR(225) DEFAULT 'Assets/Profiles/default.jpg', 
    `activated` TINYINT(4) DEFAULT 0, 
    PRIMARY KEY (`accountID`) 
); 

CREATE TABLE questionnaire (
    questionnaireID INT AUTO_INCREMENT NOT NULL, 
    accountID INT, 
    questionnaireTitle VARCHAR(255) DEFAULT 'untitled', 
    questionnaireDate TIMESTAMP NOT NULL, 
    questionnaireExp DATE, 
    answered INT, 
    CONSTRAINT PRIMARY KEY (questionnaireID), 
    CONSTRAINT FOREIGN KEY (accountID) 
     REFERENCES account (accountID) 
); 



CREATE TABLE content (
     contentID INT AUTO_INCREMENT NOT NULL, 
     questionnaireID INT, 
     questionNumber INT, 
     mediaDetailsID INT, 
     question TEXT, 
     required TINYINT DEFAULT '0', 
     questionType INT, 
     CONSTRAINT PRIMARY KEY (contentID), 
     CONSTRAINT FOREIGN KEY (questionnaireID) 
      REFERENCES questionnaire (questionnaireID), 
     CONSTRAINT FOREIGN KEY (mediaDetailsID) 
      REFERENCES mediaDetails (mediaDetailsID) 
    ); 

CREATE TABLE choices (
    choicesID INT AUTO_INCREMENT NOT NULL, 
    choicesText TEXT, 
    choicesValue INT, 
    contentID INT, 
    CONSTRAINT PRIMARY KEY (choicesID), 
    CONSTRAINT FOREIGN KEY (contentID) 
     REFERENCES content (contentID) 
); 

CREATE TABLE mediaDetails (
    mediaDetailsID INT AUTO_INCREMENT NOT NULL, 
    available TINYINT, 
    mediaPath TEXT, 
    CONSTRAINT PRIMARY KEY (mediaDetailsID) 
); 

CREATE TABLE answerEssay (
    answerEssayID INT AUTO_INCREMENT NOT NULL, 
    aswerEssayDate TIMESTAMP, 
    answer TEXT, 
    contentID int, 
    CONSTRAINT PRIMARY KEY (answerEssayID), 
    CONSTRAINT FOREIGN KEY (contentID) REFERENCES content (contentID) 
); 

AJAX를 사용하여 내가 잘, 아무것도 오류를 일하는 xhr.open("GET", "processing/questionnaire.php?do=load", false);
라고 : 그래서, 여기에 SQL이다. 내가
xhr.open("GET", "processing/questionnaire.php?do=delete&id="+id, false); 를 호출 할 때

는하지만 뭔가 미안, 잘못 돌아왔다.

이것은 questionnaire.php

include("includes/database.php"); 
if(isset($_GET["do"])){ 
    if($_GET["do"] == "load"){ 
     foreach ($account->question as $question) 
     { 
      echo "<tr>"; 
      echo "<td><input type=\"radio\" name=\"questID\" value=\"{$question->id}\"></td>"; 
      echo "<td>{$question->title}</td>"; 
      echo "<td>{$question->created}</td>"; 
      echo "<td>{$question->expired}</td>"; 
      echo "<td>{$question->ansewered}</td>"; 
      echo "</tr>"; 
     } 
    }else if($_GET["do"] == "delete"){ 
      /* 
       questionType = 0 --> question type is text 
       questionType = 1 --> checkbox 
       questionType = 2 --> radio 
      */    
      //delete choices data from table choices 
      $query = "select * from content where questionnaireID={$_GET["id"]} and questionType in(1,2)"; 
      $result = execute($query); 
      while($row = mysqli_fetch_assoc($result)){ 
       $query = "delete from choices where contentID={$row["contentID"]}"; 
       execute($query); 
      } 

     //delete answer for text question in answerEssay table 
     $query = "select * from content where questionnaireID={$_GET["id"]} and questionType=0"; 
     $result = execute($query); 
     while($row = mysqli_fetch_assoc($result)){ 
      $query = "delete from answerEssay where contentID={$row["contentID"]}"; 
      execute($query); 
     } 

     //delete all media details for each question in questionnaire 
     $query = "select * from content where questionnaireID={$_GET["id"]}"; 
     $result = execute($query); 
     while($row = mysqli_fetch_assoc($result)){ 
      $query = "delete from mediaDetails where mediaDetailsID={$row["mediaDetailsID"]}"; 
      execute($query); 
     } 

     //delete the questionnaire 
     $query = "delete from questionnaire where questionnaireID={$_GET["id"]}"; 
     $result = execute($query); 
     if($result){ 
      echo "Delete success!"; 
     }else{ 
      echo "Something went wrong, sorry."; 
     } 
    } 

강한 개체를 삭제 (를) 대체 할 수있는 다른 방법이 있나요 ...이 삭제하는 가장 좋은 방법이지만, 작동하지 않는 생각입니까? 내 코드에 무슨 문제가 있습니까?

+0

다른 곳으로 사진을 업로드하고 링크를 여기에 넣을 수 있습니다 .. –

+0

모든 삭제 ('execute ($ query)')에'mysqli_error();' – Saqueib

답변

0

설문지를 삭제하기 전에 먼저 "콘텐츠"표에서 설문지를 삭제해야합니다. 그러나 나는 전문가가 아니다.

그래서 questionnaire 전화에서 삭제를 호출하기 전에 :

'UPDATE `content` SET questionnaireId = NULL where contentId = '.(int)$_GET['contentId']; 
0

을 나는 오류가 무엇인지 확실하지 않다. 하지만 삭제하는 방식이 좋은 방법이 아닌 것 같습니다.

설문지와 관련된 선택 항목, 답변 및 미디어 세부 정보를 수동으로 삭제하려고합니다. 그런 다음 설문지를 삭제하십시오. 나는 그것이 좋은 생각이라고 생각하지 않는다. 스키마에서 설문지를 삭제할 때 ON DELETE CASCADE과 같은 외래 키 제약 조건을 선택하여 선택 항목, 답변 및 미디어 세부 정보를 자동으로 삭제할 수 있습니다. 그런 다음 설문지 만 삭제하면됩니다. 다른 모든 관련 항목은 자동으로 삭제됩니다.

삭제 작업이 기본 작업이 아닙니다. 여러 단계에서 삭제를 수행하면 여러 사용자가 쿼리를 실행하려고 할 때 이러한 쿼리가 겹쳐져 예기치 않은 오류가 발생하여 오류가 발생할 수 있습니다.

또한이 기능을 사용할 경우 사용하는 쿼리의 보안에 대해서도 고려하십시오. 생산. 귀하의 쿼리는 SQL 주입 공격에 취약합니다.

관련 문제