【问题标题】:PHP MySQL - Insert if the value doesn't exist in two tablesPHP MySQL - 如果两个表中不存在该值,则插入
【发布时间】:2015-06-09 19:37:20
【问题描述】:

所以我有 2 张桌子,“rooms”和“scheds”。 我还有一个输入表单,其中的值被插入到这两个表中。

这是输入的样子:
房间号:________________
容量:________________
-[提交按钮]-

程序:
当我输入房间 ID 和容量时,它应该在 rooms 表中插入值,然后在 scheds 表中插入 2 个相同的房间 ID 值在 roomid 列中,并自动将“1st”和“2nd”连续添加到 semester 列中。

我唯一遇到的问题是,我正在考虑两种方法来解决这个问题,但不幸的是,我似乎无法为此获得正确的代码:

1. 如果房间 ID 在 rooms 表中具有相同的确切值,则不应再将其插入两个表中,而是回显房间已存在。

2. 如果 Room ID 在 scheds 表中已经有“1st”和“2nd”学期的值,则回显该房间已经存在。


这是“rooms”表。

+----+--------+----------+
| id | roomid | capacity |
+----+--------+----------+
| 1  | NB201  | 30       |
+----+--------+----------+
| 2  | NB202  | 30       |
+----+--------+----------+

这是“scheds”表。

+----+--------+----------+
| id | roomid | semester |
+----+--------+----------+
| 1  | NB201  | 1st      |
+----+--------+----------+
| 2  | NB201  | 2nd      |
+----+--------+----------+
| 3  | NB202  | 1st      |
+----+--------+----------+
| 4  | NB202  | 2nd      |
+----+--------+----------+

以下是我目前正在处理的代码。

<?php
 if($_POST){  
    try{
        //write query
        $query = "INSERT INTO rooms SET roomid = ?, capacity = ?, roomimage = ?";

        //prepare query for excecution
        $stmt = $con->prepare($query);

        //bind the parameters
        $stmt->bindParam(1, $_POST['roomid']);

        $stmt->bindParam(2, $_POST['capacity']);

        $stmt->bindParam(3, $_POST['roomimage']);

        // Execute the query
        if($stmt->execute()){
            echo "<div class='btn-success'>Room was successfully saved.</div>";
        }else{
            echo "<div class='btn-danger'>Unable to save room.</div>";
        }

    }catch(PDOException $exception){ //to handle error
        echo "<div class='btn-danger'>Error: " . $exception->getMessage() . "</div>";
    }
}
?>

<?php
 if($_POST){ 
    try{        
            //-----2 semesters-----
            if($_POST['semester']=='2'){
            //write query
            $query_roomsched1 = "INSERT INTO sched_2014_2015 SET roomid = ?, semester = ?";

            //prepare query for excecution
            $stmt = $con->prepare($query_roomsched1);

            //bind the parameters
            $stmt->bindParam(1, $_POST['roomid']);

            $stmt->bindValue(2, '1st');

                // Execute the query
                if($stmt->execute()){
                    echo "<div class='btn-success'>Schedule table for 1st semester  was successfully created.</div>";
                }else{
                    echo "<div class='btn-danger'>Unable to create schedule table for 1st semester.</div>";
                }

            //write query
            $query_roomsched2 = "INSERT INTO sched_2014_2015 SET roomid = ?, semester = ?";

            //prepare query for excecution
            $stmt = $con->prepare($query_roomsched2);

            //bind the parameters
            $stmt->bindParam(1, $_POST['roomid']);

            $stmt->bindValue(2, '2nd');

                // Execute the query
                if($stmt->execute()){
                    echo "<div class='btn-success'>Schedule table for 2nd semester was successfully created.</div>";
                }else{
                    echo "<div class='btn-danger'>Unable to create schedule table for 2nd semester.</div>";
                }
             }catch(PDOException $exception){ //to handle error
        echo "<div class='btn-danger'>Error: " . $exception->getMessage() . "</div>";
    }
}
?>

【问题讨论】:

  • 您可以运行SELECT 查询,然后使用count() 检查是否存在相同的行。如果没有,做点什么;别的……做别的事。这是一种方法。
  • 感谢弗雷德的回复。但是我不知道该怎么做。你能告诉我怎么做吗?我目前正在处理的代码都是过去几天研究的结果。我 2 个月前才开始编写 PHP。我仍在尝试边写代码边学习。
  • 不客气。当谷歌搜索“mysql 检查两个表中是否存在行”时,请参阅此 Q&A stackoverflow.com/q/7232704stackoverflow.com/q/11180706 的一些结果。
  • 我已经在下面发布了答案。

标签: php mysql pdo insert


【解决方案1】:

如果您想检查两个表中是否同时存在“id”,您可以使用以下使用 JOIN 和条件语句。您可以根据自己的情况进行插入或不插入。

<?php
$user = 'xxxx';
$pass = 'xxxx';

$con = new PDO("mysql:host=localhost;dbname=your_db", $user, $pass);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $con->prepare("

    SELECT * 
    FROM rooms 
    LEFT JOIN scheds 
        ON rooms.roomid=scheds.roomid 
    WHERE rooms.roomid= 'NB201'

");

$stmt->execute();

if($stmt->rowCount() > 0){
    echo "It exists."; // do NOT INSERT
}

else{
    echo "It does not exist."; // do the INSERT
}

您也可以通过更改尝试 INNER JOIN

LEFT JOIN scheds

INNER JOIN scheds

如果您没有得到您希望使用 LEFT JOIN 获得的结果。

【讨论】:

  • 哈!有效!我刚刚对您所做的查询进行了 1 处更改。我将“WHERE rooms.id”之后的 id 更改为“WHERE rooms.roomid”。谢谢你,先生。现在我所要做的就是修改它并将其与我正在处理的代码结合起来。当然,我会尝试对 LEFT 和 INNER 函数进行更多研究,以便了解它的工作原理。最后一个问题,我可以使用变量替换查询中的 NB201 值,对吗?正如我所说,我有一个带有 post 方法的输入表单,所以我只需声明变量“$roomid=$_POST['roomid']”并替换 NB201?
  • @HtennekNitramAnilro 不客气,很高兴知道它对你有用。访问meta.stackexchange.com/questions/5234/…,然后返回答案并执行相同操作,以正确关闭问题并将其标记为已解决。 ;-)
  • @HtennekNitramAnilro 是的,您可以先将其分配给一个变量,然后使用$roomid 代替它,就像WHERE rooms.roomid= '$roomid' 一样。引号也是必需的,因为它是一个字符串。 干杯
  • 非常感谢!很大的帮助。
  • @HtennekNitramAnilro 不客气,很高兴能帮上忙。这是一个很好的关于 JOINS 的指南codeproject.com/Articles/33052/…
猜你喜欢
  • 2012-09-17
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多