我使用 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
我不明白为什么我的结果如此不一致。如果它失败了,为什么不每次都失败?如果它有效,为什么每次都不起作用?非常困惑。任何帮助表示赞赏。谢谢!
答案 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();
}