Вставить значения из 1 формы в 2 таблицы сервера SQL (PHP) (SQL-Server) - PullRequest
0 голосов
/ 13 января 2019

Я хочу использовать одну форму для вставки в две разные таблицы Microsoft SQL. Я пытался использовать 2 вставки, но не сработало.

if (isset($_GET['submit'])) {
                $sth = $connection->prepare("INSERT INTO DB.dbo.Fehler (QualiID, TestaufstellungID, ModulinfoID, failAfter, Datum, Verbleib, DUTNr) VALUES ($QualiID, $TestaufstellungID,$ModulinfoID,'$failAfter','$Datum','$Verbleib','$DUTNr')");
                        echo "INSERT INTO DB.dbo.Fehler (QualiID, TestaufstellungID, ModulinfoID, failAfter, Datum, Verbleib, DUTNr) VALUES ($QualiID, $TestaufstellungID,$ModulinfoID,'$failAfter',$Datum,'$Verbleib','$DUTNr')";
                        $sth->execute();

                    if($sth)
                        {
                            echo "";
                        }
                        else
                        {
                            echo sqlsrv_errors();
                        }

$MID = $connection->prepare("MAX(MID) as MID FROM DB.dbo.Fehler WHERE DB.dbo.Fehler.TestaufstellungID = '". $TestaufstellungID . "'");
$MID->execute();

$sth2 = $connection->prepare("INSERT INTO DB.dbo.Fehlerinfo (MID, Tester, Test, Ausfallbedingungen, Fehlerbeschreibung, Ersteller) VALUES ($MID, '$Tester','$Test','$Ausfallbedingungen','$Fehlerbeschreibung','$Ersteller')");
$sth2->execute();

Для понимания MID является первичным ключом таблицы Fehler и является внешним ключом во второй таблице Fehlerinfo

Вот почему у меня есть выборка, чтобы получить последний MID, и я хочу сохранить его в переменной $ MID, чтобы вставить его во вторую таблицу.

Возможно ли более разумное решение?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Как я уже говорил, ответ, как это работает для меня хорошо, атм.

if (isset($_GET['submit'])) {
$failInsert = ("INSERT INTO DB.dbo.Fehler (QualiID, TestaufstellungID, ModulinfoID, failAfter, Datum, Verbleib, DUTNr) VALUES ($QualiID, $TestaufstellungID,$ModulinfoID,'$failAfter','$Datum','$Verbleib','$DUTNr')");
$failInsert .= ("INSERT INTO DB.dbo.Fehlerinfo (MID, Tester, Test, Ausfallbedingungen, Fehlerbeschreibung, Ersteller) VALUES (NULL, '$Tester','$Test','$Ausfallbedingungen','$Fehlerbeschreibung','$Ersteller')");
$failInsert .= ("UPDATE DB.dbo.Fehlerinfo SET DB.dbo.Fehlerinfo.MID = i.MID FROM (SELECT MAX(MID)as MID FROM DB.dbo.Fehler) i WHERE DB.dbo.Fehlerinfo.TestID = ( SELECT MAX(TestID) as TestID FROM DB.dbo.Fehlerinfo)"); 
$sth = $connection->prepare($failInsert);

$sth->execute();
        }
0 голосов
/ 13 января 2019

Как я уже упоминал в комментариях, как правило, лучший способ сделать вставку в одном пакете. Это очень упрощенно, однако, должно направить вас в правильном направлении. Обычно вы, вероятно, передавали бы значения для внешней таблицы в параметре табличного значения (из-за отношения «многие к одному») и инкапсулировали бы все это в TRY...CATCH и, возможно, хранимую процедуру.

Я не могу написать это на PHP, так как мои знания об этом зачаточны, но это должно привести вас на правильный путь к пониманию:

USE Sandbox;

--Couple of sample tables
CREATE TABLE dbo.PrimaryTable (SomeID int IDENTITY(1,1),
                               SomeString varchar(10),
                               CONSTRAINT PK_PTID PRIMARY KEY NONCLUSTERED (SomeID));

CREATE TABLE dbo.ForeignTable (AnotherID int IDENTITY(1,1),
                               ForeignID int,
                               AnotherString varchar(10),
                               CONSTRAINT PK_FTID PRIMARY KEY NONCLUSTERED(AnotherID),
                               CONSTRAINT FK_FTPT FOREIGN KEY (ForeignID)
                                  REFERENCES dbo.PrimaryTable(SomeID));

GO

--single batch example

--Declare input parameters and give some values
--These would be the values coming from your application
DECLARE @SomeString varchar(10) = 'abc',
        @AnotherString varchar(10) = 'def';

--Create a temp table or variable for the output of the ID
DECLARE @ID table (ID int);

--Insert the data and get the ID at the same time:
INSERT INTO dbo.PrimaryTable (SomeString)
OUTPUT inserted.SomeID
INTO @ID
SELECT @SomeString;

--@ID now has the inserted ID(s)
--Use it to insert into the other table
INSERT INTO dbo.ForeignTable (ForeignID,AnotherString)
SELECT ID,
       @AnotherString
FROM @ID;
GO

--Check the data:

SELECT *
FROM dbo.PrimaryTable PT
     JOIN dbo.ForeignTable FT ON PT.SomeID = FT.ForeignID;
GO

--Clean up
DROP TABLE dbo.ForeignTable;
DROP TABLE dbo.PrimaryTable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...