mysqli插入查询的结果不稳定

时间:2015-04-05 18:22:54

标签: php mysql mysqli

我使用 exact 相同的参数运行相同的mysqli插入查询。它大约1/3的时间是成功的,我无法弄清楚出了什么问题。

<?php
    //...
    $decrypted_session_key = 'unavailable'; // initialize
    $res = openssl_get_privatekey($priv_key, $passphrase);
    $result = openssl_private_decrypt($encrypted_session_key, $decrypted_session_key, $res, OPENSSL_PKCS1_OAEP_PADDING);

    if ($decrypted_session_key == 'unavailable') {
        mysqli_close($link);
        echo json_encode(array('result' => 'failed', 'message' => 'failed to decrypt the session key'));
        die();
    }

    if (!$decrypted_session_key) {
        echo json_encode(array('result'=>'failed', 'message'=>'decrypted session key has failed'));
        die();
    }

    $updated_at = date("Y-m-d H:i:s");

    // save this record to the database
    $result = mysqli_query($link, "INSERT INTO Session_Keys (session_id, session_key, iv, updated_at)
                                   VALUES ($session_id, '$decrypted_session_key', '$iv', '$updated_at')");

    if (!$result) { 
        $param_check = $session_id . " " . base64_encode($iv) . " " . base64_encode($decrypted_session_key) . " " . $updated_at;
        echo json_encode(array('result'=>'failed', 'message'=>$param_check));
        die();
    }

    // ...
}

每当失败时,我都会返回最后一个echo语句。我怀疑是php解密例程失败了,但事实并非如此。所有参数都很完美,包括解密值。问题是我的insert语句错了吗?我尝试了各种引用字段的组合,但没有一致的结果。

表结构如下:

'session_id'int(11)
'session_key'tinyblob
'iv'tinyblob
'updated_at'datetime

enter image description here 我不明白为什么我的结果如此不一致。如果它失败了,为什么不每次都失败?如果它有效,为什么每次都不起作用?非常困惑。任何帮助表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

在评论中向OP建议使用or die(mysqli_error($link))mysqli_query(),这使他们找到了他们的查询失败的原因。

他们的评论:

  

“我终于得到了错误消息:你的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,以便在'&lt;'§yy附近使用正确的语法?'T'î'Ágô,EÈöJÀÊ?Xû¶T¢ÑÖ?,2015-04-05 19:26:00)'第2行'必须与我试图存储的字节有关。“< / em>的

  

“现在我明白了这个问题。你关于查看mysqli_error的建议是我解决问题的原因(经过我很多困难后才能获得访问权限!)。真正的错误(在我正确引用之后)关键字'PRIMARY'是重复条目'2147483647'。我的ios应用程序随机分配无符号整数值(0 - 4294967294),但是int(11)字段maxex out 2147483647.因此,我的一半值被接收因为重复,从而导致错误。问题解决了。感谢您的帮助!“


来自:

https://stackoverflow.com/a/17783287/

2147483647是mysql的最大int值。只需将类型从int更改为bigint。

  • 解释了重复错误。

答案 1 :(得分:0)

您是否尝试过提交交易?

/* commit transaction */
if (!$mysqli->commit()) {
    print("Transaction commit failed\n");
    exit();
}

http://php.net/manual/en/mysqli.commit.php