簡體   English   中英

mySQL:2個具有外鍵關系的表的UPDATE語句

[英]mySQL: UPDATE statement for 2 tables with a foreign key relation

我創建了具有以下結構的2個表:

mitarbeiter
==================
maID (PK, AUTO_INCREMENT, NOT NULL)
maAnrede
maName
maVname
maDurchwahl
maEmail
maMobilfunkNr
maKartenanzahl
maFirma

mobilfunkkarten
==============================
mfkID (PK, AUTO_INCREMENT, NOT NULL)
mfkTarif
mfkStatus
mfkKartennr
mfkPin
mfkSuperpin
maID(FK)

現在,我希望網絡用戶在表單字段中輸入值。 (我讓他在那里編輯他/她的條目,這些條目將保存在mysql數據庫中。因此這些條目不是新的!)單擊“保存”按鈕后,數據將保存到相應的2個表中。 我的mySQL查詢看起來像這樣(我正在使用symfony的php模板引擎“ twig”):

DatabaseLink::getInstance()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if(isset($_POST["btnSaveMfk"]))
{
$stmt = DatabaseLink::getInstance()->prepare("UPDATE mitarbeiter SET 
maAnrede = :maAnrede, 
maVname = :maVname, 
maName = :maName, 
maMobilfunkNr = :maMobilfunkNr,
maKartenanzahl = :maKartenanzahl,
maEmail = :maEmail,
maFirma = :maFirma
WHERE mitarbeiter.maID = :maid;
UPDATE mobilfunkkarten SET mfkTarif = :mfkTarif,
mfkStatus = :mfkStatus, 
mfkPin = :mfkPin,
mfkSuperpin = :mfkSuperpin");

$status = $stmt->execute(array(

":maid" => $_POST["txtMaId"],
":maAnrede" => $_POST["txtAnrede"],
..................,
..................,
..................
)); 
header("Location: Mobilfunkdaten"); //back to the PHP table that shows all entries
}

我認為這將不起作用,因為2個表都與外鍵相關,如果我在沒有此關系的情況下更新兩個表,則該語句將導致錯誤或將覆蓋不相關的內容。 這個假設對嗎?

有什么解決辦法嗎? 我只是想不出辦法確保將用戶在表單字段中鍵入的任何內容保存為這2個表中的1個數據集,即子表“ mobilfunkkarten”中的UPDATED數據將與父表“ mitarbeiter”中的主鍵號。

mitarbeiter =工人mobilfunkkarten =手機卡(SIM卡)

使用update語句時, auto_increment值不會更改。 而且,從查詢中可以看到,您沒有更新maID值,因此它沒有理由讓MySQL解析器拋出錯誤。 據我所知,您的查詢是正確的。

只是一件小事。 定義不帶:符號的關聯數組的鍵。 您可以使用該符號來表示此位置是為以下名稱存儲在變量中的值保留的。 例如,使用

$stmt = DatabaseLink::getInstance()->prepare("update table_name set name=:name where id=:id");

$status = $stmt->execute(array("name" => "test", "id" => 2));

向解析器指示必須更新ID 2對應的名稱以進行test

但是,您已經在使用:和鍵名了。 因此,在您的示例中,查詢在腳本中名為maAnrede的鍵中查找值,但是您定義的鍵為:maAnrede ,因此查詢無法正常工作。

試試這個變化。 它肯定會工作。

DatabaseLink::getInstance()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if(isset($_POST["btnSaveMfk"]))
{
$stmt = DatabaseLink::getInstance()->prepare("UPDATE mitarbeiter SET 
maAnrede = :maAnrede, 
maVname = :maVname, 
maName = :maName, 
maMobilfunkNr = :maMobilfunkNr,
maKartenanzahl = :maKartenanzahl,
maEmail = :maEmail,
maFirma = :maFirma
WHERE mitarbeiter.maID = :maid;
UPDATE mobilfunkkarten SET mfkTarif = :mfkTarif,
mfkStatus = :mfkStatus, 
mfkPin = :mfkPin,
mfkSuperpin = :mfkSuperpin");

$status = $stmt->execute(array(

"maid" => $_POST["txtMaId"],
"maAnrede" => $_POST["txtAnrede"],
..................,
..................,
..................
)); 
header("Location: Mobilfunkdaten"); //back to the PHP table that shows all entries
}

這種情況也發生在我身上,這是對我有用的解決方案!

我相信我已經解決了。 您需要在第二條SQL語句中添加以下行:

WHERE mobilfunkkarten.maID = :maid");

請參閱下面我包含它的位置。 為我解決了這個問題,但我不完全確定這個方法有多安全...對此方法是否有任何批評? 還有其他建議嗎?

DatabaseLink::getInstance()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    if(isset($_POST["btnSaveMfk"]))
    {
    $stmt = DatabaseLink::getInstance()->prepare("UPDATE mitarbeiter SET 
    maAnrede = :maAnrede, 
    maVname = :maVname, 
    maName = :maName, 
    maMobilfunkNr = :maMobilfunkNr,
    maKartenanzahl = :maKartenanzahl,
    maEmail = :maEmail,
    maFirma = :maFirma
    WHERE mitarbeiter.maID = :maid;
    UPDATE mobilfunkkarten SET mfkTarif = :mfkTarif,
    mfkStatus = :mfkStatus, 
    mfkPin = :mfkPin,
    mfkSuperpin = :mfkSuperpin
    WHERE mobilfunkkarten.maID = :maid");

    $status = $stmt->execute(array(

    "maid" => $_POST["txtMaId"],
    "maAnrede" => $_POST["txtAnrede"],
    ..................,
    ..................,
    ..................
    )); 
    header("Location: Mobilfunkdaten"); //back to the PHP table that shows all entries
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM