繁体   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