mysql:两个具有外键关系的表的update语句

i86rm4rw  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(392)

我创建了两个具有以下结构的表:

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)

现在我希望web用户在表单字段中键入值(我会让他在那里编辑他/她的条目,这些条目会保存在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
}

我认为这样做是行不通的,因为这两个表都与外键相关,如果我更新两个表时都没有这个关系,则该语句将导致错误或覆盖不相关的内容。我的假设正确吗?
有什么解决办法吗?我只是想不出任何方法来确保用户在表单字段中键入的任何内容都将作为一个数据集保存到这两个表中,即子表“mobilefunkkarten”中的更新数据将与父表“mitarbeiter”中的主键号相关。
mitarbeiter=workers MobileFunkkarten=手机卡(sim卡)

z4iuyo4d

z4iuyo4d1#

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
}

这种情况也发生在我身上,这是对我有效的解决办法!

zphenhs4

zphenhs42#

我想我修好了。您需要在第二条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
    }

相关问题