我有两个名为addstudent
和parent
的表,它们分别与sid
和Sid
具有相同的主键(学生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编程语言。我需要一个交易来处理这个问题吗?或者我该如何处理?
答案 0 :(得分: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);
}
}