2013-01-17 87 views
0

我遇到了數據庫設計的一個主要缺陷。下面是我的四個表:如何在提交詳細信息後檢索ID

會話表:

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表看到,QuestionNoQuestionNo其是非唯一的或換句話說非唯一的字段。現在我認爲這是不好的做法。

現在我知道你打算說爲什麼不使用QuestionId。那麼問題在於我不能使用QuestionId,因爲在提交問題之前圖像會上傳到每個問題,並且我們可以提出問題的唯一方法就是在用戶提交問題之後提供問題QuestionId

所以我試圖做的是通過從頁面獲取QuestionNo以及SessionId來確定上傳圖像屬於哪個問題。

現在,我聽說這是一種不好的方式,我想將QuestionNo (FK)Image_Question更改爲QuestionId (FK)。但是我不能在提交問題後獲得QuestionId上傳文件並插入上傳文件的細節,對我來說這是無法完成的。

所以我的問題是,有沒有辦法我們可以如何將每個上傳的圖像存儲到臨時表中,獲取每個圖像所屬的問題編號和sessionid,然後從那裏能夠找到QuestionId並存儲QuestionId值在Image_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(); 

回答

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 - 

你會閃躲,否則潛在的更新問題,以及數據衝突。

相關問題