如何将不同的值发送到db中的两个表中?

时间:2015-08-21 13:34:04

标签: java mysql

我有两个名为addstudentparent的表,它们分别与sidSid具有相同的主键(学生ID)。我使用phpmyadmin。

我正在为单个表单输入值,但值应分别插入这两个表中。这意味着学生将addstudent表和监护人详细信息详细记录到parent表中。

我找到了一些带有事务处理的PHP代码:

String sql = "INSERT INTO addstudent (sid, first_name, last_name) VALUES 
(no, fname, lname) ";
String q = "INSERT INTO parent (Sid, fathername,mothername)
VALUES (Sid,fn,mn)";

$result = mysqli_multi_query($conn, $sql);
if ($result) {
   $verify=1;
}
else{
  $verify=0;
}
echo $verify;

mysqli_close($conn);

我需要知道的是:代码$verify部分的目的是什么?

我使用Java编程语言。我需要一个交易来处理这个问题吗?或者我该如何处理?

2 个答案:

答案 0 :(得分:0)

如果第一个语句失败,则mysqli_multi_query返回false。因此,在这种情况下,$ result将为false,因此$ verify = 0,并显示出现错误。

交易的使用: 如果您有多个查询,其中一个查询失败(无论原因),那么您可以将数据库回滚到以前的状态。

例如: 你有一个包含一行数据的表。您想要插入另外两行。您成功插入第一个,但第二个插入失败。现在,如果您使用事务,您可以回滚数据库(现在是神奇的部分 - >),这样您就可以再次使用一行。

答案 1 :(得分:-1)

在您的示例中,$ verify仅用于显示第一个查询是否成功。

查看PDO和事务的PHP文档。这个例子与你的用例非常匹配。

http://php.net/manual/en/pdo.transactions.php

链接页面的示例:

   <?php
    try {
      $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 
          array(PDO::ATTR_PERSISTENT => true));
      echo "Connected\n";
    } catch (Exception $e) {
      die("Unable to connect: " . $e->getMessage());
    }

    try {  
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $dbh->beginTransaction();
      $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
      $dbh->exec("insert into salarychange (id, amount, changedate) 
          values (23, 50000, NOW())");
      $dbh->commit();

    } catch (Exception $e) {
      $dbh->rollBack();
      echo "Failed: " . $e->getMessage();
    }
    ?>

JDBC事务的Java文档: https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

Java code example from the linked site:

public void updateCoffeeSales(HashMap<String, Integer> salesForWeek)
    throws SQLException {

    PreparedStatement updateSales = null;
    PreparedStatement updateTotal = null;

    String updateString =
        "update " + dbName + ".COFFEES " +
        "set SALES = ? where COF_NAME = ?";

    String updateStatement =
        "update " + dbName + ".COFFEES " +
        "set TOTAL = TOTAL + ? " +
        "where COF_NAME = ?";

    try {
        con.setAutoCommit(false);
        updateSales = con.prepareStatement(updateString);
        updateTotal = con.prepareStatement(updateStatement);

        for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) {
            updateSales.setInt(1, e.getValue().intValue());
            updateSales.setString(2, e.getKey());
            updateSales.executeUpdate();
            updateTotal.setInt(1, e.getValue().intValue());
            updateTotal.setString(2, e.getKey());
            updateTotal.executeUpdate();
            con.commit();
        }
    } catch (SQLException e ) {
        JDBCTutorialUtilities.printSQLException(e);
        if (con != null) {
            try {
                System.err.print("Transaction is being rolled back");
                con.rollback();
            } catch(SQLException excep) {
                JDBCTutorialUtilities.printSQLException(excep);
            }
        }
    } finally {
        if (updateSales != null) {
            updateSales.close();
        }
        if (updateTotal != null) {
            updateTotal.close();
        }
        con.setAutoCommit(true);
    }
}