0

データベース設計の大きな欠陥に問題があります。以下は私の4つのテーブルです。

セッションテーブル:

SessionId  SessionName
3           EROEW

質問表:

QuestionId(PK)  QuestionNo  QuestionContent  SessionId (FK)
11              1           Question1        3    
12              2           Question2        3
13              3           Question3        3

Image_Question:

ImageQuestionId (PK) ImageId (FK) SessionId (Fk)  QuestionNo (FK)
1                    1              3               1
2                    2              3               2

画像:

ImageId (PK)  SessionId (Fk)  QuestionNo (FK)
1              3               1
2              3               2

Image_Question表からわかるように、は一意ではない、つまり一意ではないフィールドを参照しQuestionNoますQuestionNo。今、私はこれを悪い習慣にしています。

今、私はあなたがなぜ使用しないのかを言うつもりであることを知っていますQuestionId。問題はQuestionId、質問が送信される前に画像が各質問にアップロードされるため、使用できないことです。独自の質問を行う唯一の方法はQuestionId、ユーザーが質問を送信した後です。

だから私がやろうとしたのはQuestionNo、ページとから取得することによって、アップロードされた画像がどの質問に属するかを判断することでしたSessionId

これは悪いやり方だと聞いたので、に変更QuestionNo (FK)Image_Questionたいと思いQuestionId (FK)ます。ただし、質問を送信して取得した後は、ファイルをアップロードしたり、アップロードの詳細を挿入したりするQuestionIdことはできません。

だから私の質問は、アップロードされた各画像を一時テーブルに保存し、各画像が属する質問番号とセッションIDを取得し、そこから値を見つけてテーブルにQuestionId保存する方法があるということです。QuestionIdImage_Question

以下は、画像がアップロードされた後に値を挿入する現在のphpコードです。

誰かが以下のコードを更新できれば非常に素晴らしいですが、どんな答えも役に立ちます:

      move_uploaded_file($_FILES["fileImage"]["tmp_name"],
      "ImageFiles/" . $_FILES["fileImage"]["name"]);
      $result = 1;


    $imagesql = "INSERT INTO Image (ImageFile) 
    VALUES (?)";

    //Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s",$img);

//Assign the variable
$img = 'ImageFiles/'.$_FILES['fileImage']['name'];  //GET THE IMAGE UPLOADED

 $insert->execute();

        $insert->close();


        $lastImageID = $mysqli->insert_id; 

$_SESSION['lastImageID'] = $lastImageID; 
$_SESSION['ImageFile'] = $_FILES["fileImage"]["name"]; 


        $sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : ''); GET THE NAME OF THE SESSION    

$sessionquery = "SELECT SessionId FROM Session WHERE (SessionName = ?)";  //FIND SESSIONID by finding it's SESSIONNAME


// Bind parameter for statement
$sessionstmt->bind_param("s", $sessid);

// Execute the statement
$sessionstmt->execute();

// This is what matters. With MySQLi you have to bind result fields to
// variables before calling fetch()
$sessionstmt->bind_result($sessionid);

// This populates $sessionid
$sessionstmt->fetch();

    $sessionstmt->close();        

 $imagequestionsql = "INSERT INTO Image_Question (ImageId, SessionId, QuestionNo)  //INSERT DETAILS INTO CURRENT IMAGE_QUESTION TABLE
    VALUES (?, ?, ?)"; 

     if (!$insertimagequestion = $mysqli->prepare($imagequestionsql)) { 
      // Handle errors with prepare operation here 
       echo "Prepare statement err imagequestion"; 
    } 

$qnum = (int)$_POST['numimage']; //QUESTION NUMBER IMAGE IS UPLOADED IN

$insertimagequestion->bind_param("iii",$lastImageID, $sessionid, $qnum); 

    $insertimagequestion->execute(); 

                if ($insertimagequestion->errno) { 
          // Handle query error here 
        } 

        $insertimagequestion->close(); 
4

1 に答える 1

1

最大の問題は、スキーマが正規化されていないという事実です。そうすることはあなたにいくらか役立つはずです。
データベースの構造化をお勧めする方法は次のとおりです。

セッション:

SessionId  SessionName
3          EROEW

質問:

QuestionId(PK)  QuestionContent  SessionId (FK)
11              Question1        3    
12              Question2        3
13              Question3        3

画像:

ImageId (PK)
1           
2

Image_Question:

ImageId (FK) QuestionId (FK) -- (Composite primary key)
1            11
2            12

テーブルの挿入順序は次のとおりです。

Session -> Question -
                     \
                      -- Image_Question
                     /
              Image -

潜在的な更新の問題を回避し、そうでない場合はデータの競合を回避します。

于 2013-01-18T01:02:12.230 に答える