这个非常简单的方法是从 Flash Actionscript 应用程序中调用的,旨在仅删除一条记录。这是一个非常大的应用程序,包含 1,000 多个脚本,其中许多成功地使用了相同的模式......但是这个拒绝像其他人一样行事。
为了简单起见,我清理了部分代码,对此毫无意义正如我之前所说,它非常简单(正如您在代码中看到的那样):
- 检查记录是否存在。
- 启动一个 MySql 事务(START TRANSACTION)
- 删除所需的记录
- 删除/更新一些其他相关信息(在此代码中省略)
- 如果一切正常,提交交易
那么问题如下:
- 如果我按照代码所示运行脚本,在第一个 SELECT 语句 ($query1) 之后,mysqli_num_rows($result1) 返回 0(零)条记录,尽管我可以在数据库中看到该记录存在。既然如此,显然不能删除,跳到脚本的末尾。但是,(这是最奇怪的行为!!!)记录实际上被删除了。
- 如果我注释 COMMIT 语句 ($query5),mysqli_num_rows($result1) 返回 1(一)。这应该没问题,DELETE 语句运行正常($query4),但由于 COMMIT 已被注释,事务没有正确完成,所需的记录当然保留在数据库中。
- 如果我注释 SELECT 语句 ($query1) 并直接执行 DELETE 语句 ($query4),而不检查记录是否存在,则记录被正确删除,最后一个 COMMIT 语句 ($query5) 确认数据库更改。
我已经逐步跟踪了几个小时,但到目前为止,找不到此代码无法正常运行的原因我还用 mysqli_affected_rows 替换了 mysqli_num_rows(即,对于 SELECT 语句的目的是相同的)但奇怪的行为仍然存在。
<?php
function f_ROLLBACK() {
global $messages;
global $conexion;
$query = "";
$query .= "ROLLBACK";
$result = mysqli_query( $conexion, $query);
if (!$result === true) {
$messages .= "\nInvalid Query\n".mysqli_error( $conexion )."\nQUERY:".$query;
} else {
$messages .= "\nTransaction successful ROLLBACK";
}//if (!$result === true)
return;
}//function f_ROLLBACK
include ("../config/DBconfig.inc.php");
$recID = isset($_POST["recID"]) ? $_POST["recID"] : "5";
$returnVars = array();
$messages = "";
$n = 0;
$now = gmdate("YmdHis");
//check if exists
$query1 = "";
$query1 .= "SELECT recID ";
$query1 .= " FROM records ";
$query1 .= " WHERE recID = ".$recID." ";
$result1 = mysqli_query( $conexion, $query1);
if (!$result1 === true) {
$messages .= "\nInvalid Query\n".mysqli_error( $conexion )."\nQUERY1:".$query1;
} else {
$rows1 = mysqli_num_rows($result1);
if ($rows1 < 1) {
$messages .= "\nSelected Record could not be found.";
} else {
$query2 = "";
$query2 .= "START TRANSACTION";
$result2 = mysqli_query( $conexion, $query2);
if (!$result2 === true) {
$messages .= "\nInvalid Query\n".mysqli_error( $conexion )."\nQUERY2:".$query2;
} else {
$query3 = "";
$query3 .= "SET autocommit = 0 ";
$result3 = mysqli_query( $conexion, $query3);
if (!$result3 === true) {
$messages .= "\nInvalid Query\n".mysqli_error( $conexion )."\nQUERY3:".$query3;
f_RollBack();
} else {
$query4 = "";
$query4 .= "DELETE FROM records ";
$query4 .= " WHERE recID = ".$recID." ";
$result4 = mysqli_query( $conexion, $query4);
if (!$result4 === true) {
$messages .= "\nInvalid Query\n".mysqli_error( $conexion )."\nQUERY4:".$query4;
f_RollBack();
} else {
$rows4 = mysqli_affected_rows($GLOBALS["___mysqli_ston"]);
if ($rows4 < 1) {
$messages .= "\nSelected Record could not be DELETED.\nQUERY4:".$query4;;
f_RollBack();
} else {
$query5 = "";
$query5 .= " COMMIT ";
$result5 = mysqli_query( $conexion, $query5);
if (!$result5 === true) {
$messages .= "\nInvalid Query\n".mysqli_error( $conexion )."\nTransaction has not been COMITTED."."\nQUERY5:".$query5;
}//if (!$result5 === true) COMMIT
}//if ($rows4 == -1)
}//if (!$result4 === true)
}//if ($rows3 < 1)
}//if (!$result3 === true)
}//if (!$result2 === true)
}//if (!$result1 === true)
mysqli_close($GLOBALS["___mysqli_ston"]);
if ($messages != "") {
$returnVars["retorno"] = "Error";
$returnVars["extra"] = $messages;
} else {
$returnVars["retorno"] = "OK";
$returnVars["extra"] = "";
}//if ($messages != "")
$returnString = http_build_query($returnVars);
//send variables back to Flash
echo $returnString;
?>
如果有人能找出我做错了什么,我将不胜感激。