在一个PHP中在不同的数据库中插入和更新

时间:2019-02-18 13:56:21

标签: php html mysql database

我如何更新和插入在一起

        require_once ('database.php'); 

$name = mysql_real_escape_string ($_REQUEST["name"]);
$course = mysql_real_escape_string ($_REQUEST["course"]);
$email = mysql_real_escape_string ($_REQUEST["email"]);
$contact = mysql_real_escape_string ($_REQUEST["contact"]);
$Date = mysql_real_escape_string ($_REQUEST["Date"]);

$sql = "SELECT * FROM registerlist WHERE name = '" . $name . "'";
$result = mysql_query ($sql, $dbconn); 

if (mysql_num_rows ($result) > 0) {
    $resultStr = header("Location:blog.php");

} else {

    $result = "SELECT * FROM courselist WHERE cname = '" . $course 
    . "'";
    $row=mysql_fetch_row($result);

    $sql = "INSERT INTO registerlist (name, Course, Email, Contact, 
  Date) VALUES ('" . $name . "', '" . $course . "', '" . $email . "', '" . 
   $contact . "','" . $date . "')";

    $result1= mysql_query($sql, $dbconn);
 $result =mysql_query("UPDATE courselist SET $Row['slot'] = 
           '$Row['slot'] - 1 '");
    if ($result1) {
    $resultStr = header("Location:blog.php");

    } 

  }

  echo json_encode($resultStr);

如果该人注册了该课程,则该课程的位将减1,并将学生文档插入到注册清单数据库中。

1 个答案:

答案 0 :(得分:0)

我希望我确实理解正确:您想在将记录插入courselist表的同时更新registerlist表吗?可以使用触发器(https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html,如果两个数据库都在同一台SQL服务器上运行)和/或表锁(https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html)来完成:

  1. 没有触发器

    • 锁定表courselist
    • 将记录插入registerlist
    • 更新表courselist
    • 发布表courselist
  2. 带触发器 您需要一个在写入courselist表之前锁定表registerlist的触发器,以及一个在写入courselist之后更新registerlist并释放该锁的触发器。 在这种情况下,您只需将记录从PHP代码插入registerlist中,并且表锁定和courselist更新是由SQL Server中的触发器完成的。

无论如何,您不能同时写入两个表,没有SQL语句可以这样做。但是使用锁可以模拟这种行为。

在定义SQL语句的目标表时,如果Connection的每个Default使用不同的数据库,则可以在表的数据库名称前加上databaseName.tableName

但是评论中的aynber绝对正确-您应尽快远离mysql_*

编辑:此SQL示例应显示表锁定的工作方式(有关所有信息,请参见上面链接的MySQL文档):

LOCK TABLES courselist WRITE;
INSERT INTO registerlist …;
UPDATE courselist …;
UNLOCK TABLES;

您将需要WRITE锁,因为您将要写入表。在释放锁定之前,其他会话中的其他读取,写入或锁定语句将被阻止。

READ锁将防止任何会话修改该表。除非您释放该锁,并且其他会话中的所有其他READ锁也被释放,否则写(和写锁定)尝试将被阻止。