2016-02-24 61 views
2

我有一個數據庫與3表 - 作者,研究和Casestudy。插入數據庫從重複的文本字段,如果不是空php sql

筆者列AuthorId(自動遞增,PK),F_nameL_nameEmailContact

Study具有列StudyID(自動增量,PK),TitleSummary

Casestudy - AuthorIdFK,參考Author.AuthorId),StudyIdFK,參考Study.StudyId),Submitted(日期時間)。

我有一個聲明,它將數據插入每個表(獲取AuthorId和StudyID的ID)並插入casestudy。

我的問題是,如果只有一個作者,我該如何避免將第二作者的數據傳遞到數據庫中。否則它只存儲空行。作者webform https://jsfiddle.net/7un2yf9g/的一個例子。它複製整個容器並創建具有不同名稱的相同副本。

我的代碼如下:

$AuthorTitle = mysqli_real_escape_string($con, ($_POST['AuthorTitle'])); 
$AuthorTitle = mysqli_real_escape_string($con, ($_POST['AuthorTitle_ID2'])); 
$F_Name = mysqli_real_escape_string($con, ($_POST['first_name'])); 
$F_Name = mysqli_real_escape_string($con, ($_POST['first_name_ID2'])); 
$L_Name = mysqli_real_escape_string($con, ($_POST['last_name'])); 
$L_Name = mysqli_real_escape_string($con, ($_POST['last_name_ID2'])); 
$Email = mysqli_real_escape_string($con, ($_POST['email'])); 
$Email = mysqli_real_escape_string($con, ($_POST['email_ID2'])); 
$Contactauthor = mysqli_real_escape_string($con, ($_POST['contact'])); 
$Contactauthor = mysqli_real_escape_string($con, ($_POST['contact_ID2'])); 
$Title = mysqli_real_escape_string($con, ($_POST['Title'])); 
$Summary = mysqli_real_escape_string($con, ($_POST['Summary'])); 

mysqli_multi_query($con," 
START TRANSACTION; 
    INSERT INTO author(AuthorTitle, F_Name, L_Name, Email, Contact) 
    VALUES('$AuthorTitle','$F_Name','$L_Name','$Email','$Contactauthor'), ('$AuthorTitle_ID2','$F_Name_ID2','$L_Name_ID2','$Email_ID2','$Contactauthor_ID2'); 
    SET @AuthorId = LAST_INSERT_ID(); 
    INSERT INTO study(Title, Summary) VALUES('$Title','$Summary'); 
    SET @StudyId = LAST_INSERT_ID(); 
    INSERT INTO casestudy(AuthorId, StudyId, Submitted) VALUES(@AuthorId, @StudyId, NOW()); 
COMMIT; 
"); 

回答

1

的是從來沒有定義Author_ID2你有你的變量在目前定義的一路首先:

$AuthorTitle = mysqli_real_escape_string($con, ($_POST['AuthorTitle'])); 
$AuthorTitle = mysqli_real_escape_string($con, ($_POST['AuthorTitle_ID2'])); 

在這裏,你只需要重寫$AuthorTitle與價值從$_POST['AuthorTitle_ID2'],並且根本不定義$AuthorTitle_ID2

接下來,因爲你只會在casestudystudy鏈接第二author因爲LAST_INSERT_ID()將返回最後插入記錄的ID唯一,即使實際上有一個語句插入多條記錄的SQL語句。

最後,有IF statement in MySQL

$AuthorTitle  = mysqli_real_escape_string($con, ($_POST['AuthorTitle'])); 
$AuthorTitle_ID2 = mysqli_real_escape_string($con, ($_POST['AuthorTitle_ID2'])); 
$F_Name   = mysqli_real_escape_string($con, ($_POST['first_name'])); 
$F_Name_ID2  = mysqli_real_escape_string($con, ($_POST['first_name_ID2'])); 
$L_Name   = mysqli_real_escape_string($con, ($_POST['last_name'])); 
$L_Name_ID2  = mysqli_real_escape_string($con, ($_POST['last_name_ID2'])); 
$Email    = mysqli_real_escape_string($con, ($_POST['email'])); 
$Email_ID2   = mysqli_real_escape_string($con, ($_POST['email_ID2'])); 
$Contactauthor  = mysqli_real_escape_string($con, ($_POST['contact'])); 
$Contactauthor_ID2 = mysqli_real_escape_string($con, ($_POST['contact_ID2'])); 
$Title    = mysqli_real_escape_string($con, ($_POST['Title'])); 
$Summary   = mysqli_real_escape_string($con, ($_POST['Summary'])); 

mysqli_multi_query($con," 
START TRANSACTION; 
    INSERT INTO study(Title, Summary) 
    VALUES('$Title','$Summary'); 
    SET @StudyId = LAST_INSERT_ID(); 

    INSERT INTO author(AuthorTitle, F_Name, L_Name, Email, Contact) 
    VALUES('$AuthorTitle','$F_Name','$L_Name','$Email','$Contactauthor'); 
    SET @AuthorId = LAST_INSERT_ID(); 

    INSERT INTO casestudy(AuthorId, StudyId, Submitted) 
    VALUES(@AuthorId, @StudyId, NOW()); 

    IF ('$AuthorTitle_ID2' <> '' OR '$F_Name_ID2' <> '' OR '$L_Name_ID2' <> '' OR '$Email_ID2' <> '' OR '$Contactauthor_ID2' <> '') THEN 
     INSERT INTO author(AuthorTitle, F_Name, L_Name, Email, Contact) 
     VALUES('$AuthorTitle_ID2','$F_Name_ID2','$L_Name_ID2','$Email_ID2','$Contactauthor_ID2'); 
     SET @AuthorId = LAST_INSERT_ID(); 

     INSERT INTO casestudy(AuthorId, StudyId, Submitted) 
     VALUES(@AuthorId, @StudyId, NOW()); 
    END IF; 
COMMIT; 
"); 
+0

感謝你的幫助,但我已經使用PHP的if/else。報表要長得多,但它適用於我所需要的。再次感謝您的貢獻 – Vlad

+0

@Vlad完全沒有。我同意這裏的邏輯不應該在SQL文本中。 [Transaction](http://php.net/manual/en/mysqli.begin-transaction.php)可以通過mysqli輕鬆實現,從而在PHP代碼中保留所有邏輯。 –

相關問題