我的$ stmt插入执行两次,使用相同数据的mysqli仅执行一次

时间:2019-02-19 21:26:55

标签: php function mysqli

我有这两个功能。 $ stmt查询将数据两次插入我的dbase中,甚至带有检查例程。

一整天都在尝试捕获错误,但是我只是找不到它。

被称为完全相同的常规MySQLi例程确实确实只插入了一次数据。

我只是不知道为什么。做过一些回声检查,回声SQL插入等等。我只是不知道发生了什么。我还没有使用$ stmt很多,但是想在某种程度上改善程序员的生活。这没有帮助:-)

使用以下命令在XAMPP上运行测试: Apache / 2.4.29(Win32)OpenSSL / 1.1.0g PHP / 7.2.1 Clientversie van数据库:libmysql-mysqlnd 5.0.12-dev-20150407 PHP版本:7.2.1

此代码将其插入两次:

NULL

与此完全相同的数据可以完成预期的工作。一个插入。

$result = mysql_insert_array_serialised($conn, $dbt_serialsets, $_POST, $addon);


function mysql_insert_array_serialised($conn, $table, $data, $addon = "mc_api") {

        $random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
        $settings    = serialize($data);
        $uid         = $_SESSION['uid'];

        $sql_chk = "SELECT sn FROM $table WHERE sn = ?";

        if ($stmt = $conn->prepare($sql_chk)) {
            $stmt->bind_param('s', $random_code);
            $stmt->execute();
            $stmt->store_result();

            if ($stmt->num_rows == 0) {
                // SN doesnt already exist
                $sql_insert = 'INSERT INTO ' . $table . ' (uid, addon, sn, settings) VALUES (?, ?, ?, ?)';
                if ($stmt       = $conn->prepare($sql_insert)) {
                    $stmt->bind_param('ssss', $uid, $addon, $random_code, $settings);
                    $stmt->execute();
                    if (!$stmt->execute()) {
                        echo $stmt->error;
                    }else{
                        return array(
                        "mysqli_error"         => false,
                        "sn"                   => $random_code
                        );  
                    }

                } else {
                    echo 'Could not prepare statement!';
                }
            }
        }
    }

我很困惑。很少有人回答类似的问题,有人说上传到http服务器后就解决了,我只在本地测试XAMPP上运行

由于你们中的一些人认为双重$ stmt-> execute是问题,所以不是。一种用于选择(检查是否存在),一种用于插入新数据。

原始功能是这样的,将其改回并仍然插入两次:

$result = mysql_insert_array($conn, $dbt_serialsets, $_POST, $addon);

function mysql_insert_array($conn, $table, $data, $addon) {

    $random_code = substr(str_shuffle(MD5(microtime())), 0, 12);
    $settings    = serialize($data);
    $uid         = $_SESSION['uid'];

    if ($conn->query("INSERT INTO $table (uid, addon, sn, settings) VALUES ('" . $uid . "', '" . $addon . "' , '" . $random_code . "', '" . $settings . "')")) {
        return array(
            "mysqli_error"         => false,
            "mysqli_insert_id"     => $conn->insert_id,
            "mysqli_affected_rows" => $conn->affected_rows,
            "mysqli_info"          => $conn->info,
            "sn"                   => $random_code
        );

    } else {
        return array("mysqli_error" => $conn->error);
    }
}   

显然,我读得不好。我很抱歉。帖子中提到的双重执行在那里,删除1确实有帮助。我以为是要检查是否有有效的结果,而不是实际上再次执行查询。

  • 走到可耻的角落*

2 个答案:

答案 0 :(得分:5)

您有两个呼叫$stmt->execute()的电话,两个电话都会执行INSERT

                $stmt->execute();
                if (!$stmt->execute()) {

您可以删除第一个。

答案 1 :(得分:3)

它执行两次,因为代码告诉它:

function add_comment_button(postPk) {
$.ajax({
    type: "GET",
    url: '/user_add_comment',
    data: {
        "comment_text": $('#user-comment-' + postPk).val(),
        "post_pk": postPk,
    },
    dataType: "json",
    success: function (data) {
        location.href = data["url"]
    },
    failure: function () {
        alert('There is a problem!!!');
    }
});
}

要解决此问题,请删除第一行 $stmt->execute(); if (!$stmt->execute()) { echo $stmt->error; }else{ // .... } (在此块中,而不是上一个查询的行)或将结果分配给变量并进行检查。