使用mysqli_begin_transaction()时服务器版本错误

时间:2017-03-05 22:18:24

标签: php mysql

我正在使用本地服务器(Xammp)构建应用程序。首先,我在开始这样的事务之前关闭默认的自动发送:

      if($condition == true){
      mysqli_autocommit($mysqli, FALSE);//disabling default autocommit
      // Starting transaction for read and write  
      mysqli_begin_transaction($mysqli, MYSQLI_TRANS_START_READ_WRITE);
      //....Update table
       mysqli_commit($mysqli);//commit records to database
       }else {
         mysqli_rollback($mysqli);}

如果我单击一个按钮,我收到错误消息,告诉我我的服务器版本不支持mysqli_begin_transaction()最低要求是5.6.5。如果我在数据库中检查结果是否符合预期,除非如果用户未被重定向到任何地方,浏览器将显示此错误消息

  

警告:mysqli_begin_transaction():此服务器版本不支持“READ WRITE”和“READ ONLY”。第38行的C:\ xampp \ htdocs \ wezhira \ foo.php需要最低5.6.5

是否有人可以帮助我如何升级我的服务器以测试我的应用程序任何链接博客或文章都会有所帮助,其次,如果我使用实时服务器,这个错误是否会消失。我在Stackoverflow上看到了一些解决方案建议mysqli_begin_transaction()可以替换为mysqli_autocommit($mysqli, FALSE);这个陈述的真实性是什么?

3 个答案:

答案 0 :(得分:1)

我意识到这个错误是由于你的mysql当前正在运行的innodB版本。 Xampp附带MariaDB,其最新版本的innodB为5.6.34-79.1。因此,您可能希望升级数据库或使用autocommit()代替。

在phpmyadmin SQL查询上运行此代码,找出您的Innodb版本

SHOW GLOBAL VARIABLES LIKE '%version%'

如果你的版本真的低于5.6.5那么,考虑用autocommit()重写代码,这与事务非常相似。 要使用自动提交,请参阅此php文档php autocommit documentation

答案 1 :(得分:1)

autocommit()将适用于您当前版本的innodB。将代码从Transaction迁移到autocommit()时,需要进行少量更改。这是一个代码示例。

function failed_to_pay($package, $payer){
    global $sponsor;
    global $payer_id;
    require 'config.php';

    $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); //New connection to the Database

        if ($mysqli->connect_errno) {
            printf("Connect failed: %s\n", $mysqli->connect_error); //Check for Error in connection
            exit();
        }


        try{
            $mysqli->autocommit(FALSE); //Begin Transaction Using Autocommit function set to false
            $flag = true; //Use this to check for error

            $update_sponsor = $mysqli->query("UPDATE $package SET $payer = '' WHERE id = '$sponsor'");
                if(!$update_sponsor){
                    $flag = FALSE;
                }

            $delete_payer = $mysqli->query("DELETE FROM $package WHERE id = '$payer_id'");
                if(!$delete_payer){
                    $flag = FALSE;
                }

            if ($flag){
                $mysqli->commit(); //commit the transaction
                $mysqli->autocommit(TRUE); //set auto commit to true
                $mysqli->close();
                echo '<div class="alert alert-success"> You have been exited from this Package Successfully</div>';

                echo '<script>window.setTimeout(function() {
                window.location.href = "manage_acct.php";
                }, 3000);</script>';
            }
            else{
                $mysqli->rollback();
                $mysqli->autocommit(TRUE);
                $mysqli->close();
                echo '<div class="alert alert-warning"> Oops! We could not exit you from the Package. Please try again Later</div>';

            }

        }

        catch(Exception $e){
            $mysqli->rollback();
            $mysqli->autocommit(TRUE);
            $mysqli->close();
            echo '<div class="alert alert-warning"> Oops! An Error occurred: '. $e . '</div>';
        }
}

答案 2 :(得分:0)

如果MySQL / InnoDB是最新的-尝试检查php版本。我从7.3更改为7.2,这很有帮助。