如果使用新值插入引用的键,如何自动更新外键?

时间:2016-07-31 11:27:11

标签: php mysql pdo

我有2张这样的牌桌 enter image description here

enter image description here

我已将bmatricno作为名为bmatricno_fk的外键的引用键。好了,我想插入一个包含bmatricno和bname的新数据,这是第一张pic。然后我想要更新bmatricno_fk的列,并使用引用键(bmatricno)使用相同的值。但是我失败了。

然后我尝试手动插入2个表插入。然后我有插入多个表的问题。我知道使用事务与提交,因为即时通讯使用PDO。问题是,因为我必须使用像:bmatricno' => $_POST['bmatricno'].这样的代码。因此,我不知道如何使用包含这种事情的事务。

我的代码看起来像这样。 (不,不是吗?)

$ses = $_SESSION['sBorrow'];

        $query = " 
            INSERT INTO borrow ( 
                bmatricno,
                bname,
                bdatetime
            ) VALUES (
                :bmatricno,
                :bname,
                NOW()
            )
            ;
            INSERT INTO thesis(
                bmatricno_fk
            ) VALUES (
                :bmatricno
            )
            SELECT serialno, title
            FROM thesis
            WHERE serialno = :ses
        "; 

        $query_params = array( 
            ':bmatricno' => $_POST['bmatricno'], 
            ':bname' => $_POST['bname'], 
            ':ses' => $_SESSION['sBorrow'] 
        ); 

        try 
        { 
            // Execute the query to create the user 
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
        } 
        catch(PDOException $ex) 
        { 
            // Note: On a production website, you should not output $ex->getMessage(). 
            // It may provide an attacker with helpful information about your code.  
            die("Failed to run query: " . $ex->getMessage()); 
        }

这是我目前的代码。所以我的问题是,一旦引用的密钥获得新值,外键是否可以更新?如果没有,如何使用我之前说过的代码进行交易?请帮助我。我需要完成这件事。

注意:您注意到在第二张图片和列上matricno_fk效果很好,因为我输入了一个值来插入值,这意味着手动。

1 个答案:

答案 0 :(得分:0)

我确实为我的问题找到了解决方案。 frz3993工作,但我刚刚意识到我的一个变量是一个数组。因此我在查询中使用foreach。由于它是一个数组,我不知道如何在事务中使用foreach,因为即时通讯。所以我逐个执行查询。并把这个问题放在我的第二个陈述上。

$ses = $_SESSION['sBorrow'];


        $query = " 
            INSERT INTO borrow ( 
                bmatricno,
                bname,
                bdatetime
            ) VALUES (
                :bmatricno,
                :bname,
                NOW()
            )
        "; 

        $query_params = array( 
            ':bmatricno' => $_POST['bmatricno'], 
            ':bname' => $_POST['bname']
        ); 

        try 
        { 
            // Execute the query to create the user 
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
        } 
        catch(PDOException $ex) 
        { 
            // Note: On a production website, you should not output $ex->getMessage(). 
            // It may provide an attacker with helpful information about your code.  
            die("Failed to run query: " . $ex->getMessage()); 
        }


        //----------------------



        $query = " 
            UPDATE thesis
                SET 
                    bmatricno_fk = :bmatricno,
                    bavailable = 'Unavailable'
                WHERE
                    serialno = :ses
        "; 

        foreach($ses as $s){

            $query_params = array( 
                ':bmatricno' => $_POST['bmatricno'], 
                ':ses' => $s
            ); 

            try 
            { 
                // Execute the query to create the user 
                $stmt = $db->prepare($query); 
                $result = $stmt->execute($query_params); 
            } 
            catch(PDOException $ex) 
            { 
                // Note: On a production website, you should not output $ex->getMessage(). 
                // It may provide an attacker with helpful information about your code.  
                die("Failed to run query: " . $ex->getMessage()); 
            }
        }


        //----------------------

我知道这个解决方案可能不是最实用的,但我需要快速完成它,我只需要在localhost上呈现它。无论如何,谢谢你的帮助:)。