У меня есть база данных с 3 таблицами – Author, Study и Casestudy.
У автора есть столбцы AuthorId
(Auto increment, PK
), F_name
, L_name
, Email
, Contact
.
Study
есть столбцы StudyID
(Auto increment, PK
), Title
, Summary
Casestudy
– AuthorId
( FK
, reference Author.AuthorId
), StudyId
( FK
, reference Study.StudyId
), Submitted
(datetime).
У меня есть инструкция, которая вставляет данные в каждую таблицу (получение идентификаторов AuthorId и StudyID) и вставку в casestudy.
Мой вопрос заключается в том, что есть только один автор, как я могу избежать передачи данных для второго автора в базу данных. В противном случае он сохраняет только пустую строку. Пример веб-формы автора 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; ");
Прежде всего, как вы определяете свои переменные, на данный момент 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
.
Далее, оператор SQL, который у вас есть, свяжет второго author
с study
в casestudy
потому что LAST_INSERT_ID()
вернет идентификатор последней вставленной записи, даже если на самом деле было несколько записей, вставленных одним утверждением.
И, наконец, в MySQL есть оператор IF :
$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; ");