Php mySQL:具有外键关系的2个表的UPDATE语句

Php mySQL:具有外键关系的2个表的UPDATE语句,php,mysql,sql,foreign-keys,Php,Mysql,Sql,Foreign Keys,我创建了两个具有以下结构的表: mitarbeiter ================== maID (PK, AUTO_INCREMENT, NOT NULL) maAnrede maName maVname maDurchwahl maEmail maMobilfunkNr maKartenanzahl maFirma mobilfunkkarten ============================== mfkID (PK, AUTO_INCREMENT, NOT NULL) m

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

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”):

我认为这不会起作用,因为这两个表都与外键相关,如果我更新两个表时都没有这个关系,则该语句将导致错误或覆盖不相关的内容。我的假设正确吗

有什么解决办法吗?我想不出任何方法来确保用户在表单字段中键入的任何内容都将作为一个数据集保存到这两个表中,即子表“mobilfunkkarten”中的更新数据将与父表“mitarbeiter”中的主键号相关


mitarbeiter=workers 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
    }

可能重复的否,它不是重复的,因为这是关于更新现有值的。以前的文章是关于在表单字段中插入新值并将这些条目添加到mysql数据库中。感谢您的帮助。显然,我的陈述是不正确的,因为当我单击“保存”时,只有表“mitarbeiter”中的ma值会正确更新。但是,表“mobilfunkkarten”中编辑的mfk值将应用于所有行,而不仅仅是一行(我正在编辑的那一行)。例如,如果我通过在表单字段“LTE 3 GB”中键入来编辑mfkTarif,该值将不仅应用于一个ID,而且应用于表“MobileFunkkarten”中的所有ID。我怎样才能解决这个问题?那是因为当你使用
where
子句来更新特定行。否则,它将用新值更新所有行。@您在询问更好的方法时添加了另一个答案。通过查看您的表结构,我了解到,一个工人可以拥有多张SIM卡。因此,如果使用前面提到的查询更新相应表中的元组,它将更新特定工作者拥有的所有SIM卡的详细信息。相反,使用
mitarbeiter.maID
mobilfunkkarten.mfkID
仅更新从属表(mobilfunkkarten)中所需的记录。
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
    }