我不确定如何搜索此问题,因为在更新之前一切正常。我在MAC上,在更新操作系统后,XAMPP停止连接。所以我也更新了XAMPP。它正在工作但我的脚本在旧版本之前工作时中途停止。这就是我所拥有的:
$test = explode("||", $data);
//Section 1
mysqli_autocommit($link, FALSE);
mysqli_query($link, "INSERT INTO x...");
if (mysqli_commit($link)) {
$success = mysqli_query($link, "SELECT * FROM x...");
$check = mysqli_num_rows($success);
if ($check > 0) {
$c = array();
while ($row = mysqli_fetch_assoc($success)) {
$c = $row;
}
echo json_encode($c);
}
}
//Section 2
foreach ($test as $item) {
if ($item[0] == "#") {
$query = mysqli_query($link, "INSERT INTO y...");
if ($query) {
$q = mysqli_query($link, "SELECT blah FROM z WHERE blah='$item'");
$check = mysqli_num_rows($q);
if ($check > 0) {
$s = mysqli_query($link, "UPDATE z...");
}else{
$s = mysqli_query($link, "INSERT INTO z...");
}
}
}
所以当我运行它时,第一部分被插入,回声起作用然后一切都停止了。如果我注释掉第1部分并且只运行第2部分,则第2部分可以工作并插入。是否有理由停止中途?
PS ......我知道我的代码并不完美,我稍后会切换到PDO。试着让功能现在正常工作。
我尝试做的另一件事......运行完整的脚本,我添加了这个检查:
foreach ($test as $item) {
if ($item[0] == "#") {
$query = mysqli_query($link, "INSERT INTO y...");
$q = mysqli_query($link, "SELECT * FROM y");
$c = mysqli_num_rows($q);
if ($c > 0) {
echo "more then 0";
}
...
当我的桌子仍然是空的时候,它会返回超过0个条目......
答案 0 :(得分:1)
因此,如果您有10个不同的查询,它将在查询中提交10次。 如果你问这个问题是什么,那么看一下这个问题:
1. UPDATE customer SET savings_account = savings_account - 200 WHERE...
2. UPDATE customer SET savings_account = savings_account + 200 WHERE...
那么如果第二个查询失败怎么办?那么200
现金还是会被扣除吗?
将AUTO COMMIT设置为false并进入事务的使用(如果1查询失败,则事务将无效,并且不会提交给db)。
try{
$test = explode("||", $data);
//Section 1
mysqli_autocommit($link, FALSE);
mysqli_query($link, "START TRANSACTION"); //<--- start Transaction
mysqli_query($link, "INSERT INTO x...");
if (mysqli_commit($link)) {
$success = mysqli_query($link, "SELECT * FROM x...");
$check = mysqli_num_rows($success);
if ($check > 0) {
$c = array();
while ($row = mysqli_fetch_assoc($success)) {
$c = $row;
}
echo json_encode($c);
}
}
//Section 2
foreach ($test as $item) {
if ($item[0] == "#") {
$query = mysqli_query($link, "INSERT INTO y...");
if ($query) {
$q = mysqli_query($link, "SELECT blah FROM z WHERE blah='$item'");
$check = mysqli_num_rows($q);
if ($check > 0) {
$s = mysqli_query($link, "UPDATE z...");
}else{
$s = mysqli_query($link, "INSERT INTO z...");
}
}
}
mysqli_query($link, "COMMIT"); //<-- if all queries has been successfully excecuted it will all be saved in the db
}catch($e Exception){
mysqli_query($link, "ROLLBACK"); //<-- rollback queries.
throw new Exception("ERROR MESSAGE");
}
答案 1 :(得分:0)
显然问题是mysqli_autocommit。由于我在第一部分中使用它进行多次查询,因此我不得不将其设置为FALSE。我想这在后来的foreach循环中搞砸了所以在运行它之前我必须将它设置回TRUE。现在一切正常。仍然不知道为什么......需要在mysqli_autocommit上查找文档。