php mysql查询在更新xampp 1.8.3-4后没有完成

时间:2014-05-19 08:16:09

标签: php mysql macos xampp

我不确定如何搜索此问题,因为在更新之前一切正常。我在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个条目......

2 个答案:

答案 0 :(得分:1)

AUTO COMMIT

因此,如果您有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上查找文档。