2015-04-05 101 views
1

我正在运行相同的mysqli插入查询使用精确相同的参数。它大概有三分之一的时间是成功的,我不知道哪里出了问题。使用mysqli插入查询的不稳定结果

<?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(); 
    } 

    // ... 
} 

每当这个失败,我得到最后一个回声语句返回。我的怀疑是php解密程序失败,但事实并非如此。所有参数都是完美的,包括解密值。是我的插入语句错误的问题?我尝试过引用字段的各种组合,但没有任何一致的结果。

表结构是这样的:

'SESSION_ID' INT(11)
'session_key可以' TINYBLOB
'IV' TINYBLOB
'的updated_at' 日期时间

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

+0

您在列声明中使用了不正确的标识符。把'mysqli_error($ link)'加入'mysqli_query()',你会看到语法错误。还要确保'$ session_id'不是一个被传递的字符串。 – 2015-04-05 18:35:51

+0

我看不到它。你可以说得更详细点吗?谢谢! – Alex 2015-04-05 18:39:34

+0

我看到你删除了'updated_at'前面的引号''''''''''''''''''''''''''''''''这就是我为什么这么说的原因。 – 2015-04-05 18:40:33

回答

1

已经提出到OP在注释中使用or die(mysqli_error($link))mysqli_query()带领他们找到为什么他们的查询是失败的原因。

他们的意见:

“我终于在这里的错误信息是:您的SQL语法错误;检查对应于您的MySQL服务器版本正确的语法手册使用附近的'<'§y?'T]î'Ágô,EÈöJÀÊ?ûTÑÑÑ?, 2015-04-05 19:26:00)'在第2行必须与我的字节有关我正在努力储存。“

“现在我明白了这个问题。你地看着mysqli_error的建议是什么导致我的解决方案(很多困难的在我结束来访问它了!) 。真正的错误(在我正确地引用了我的字段后)是'PRIMARY'键的重复条目'2147483647'。我的ios应用程序随机分配一个无符号整数值(0 - 4294967294),但是一个int(11)字段maxex在2147483647 。因此,我的一半价值被作为重复收到,从而导致错误。问题解决了,谢谢你的帮助!


从拉:

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

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

  • 它解释了重复的错误。
+0

感谢您的帮助! – Alex 2015-04-05 19:51:48

+0

@Randall不客气Randall。毕竟这是2147483647导致重复的错误。我想那个号码响了一声遥远的钟声!我已经添加了这个答案,如果你还没有看到它, *欢呼!* – 2015-04-05 19:52:43

+0

大数字将得到雅'每次! * Mornin'拉尔夫!* – 2015-04-06 12:52:57

0

您是否尝试提交交易?

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

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

+0

我没有,但它没有解决任何问题。感谢您的建议。 – Alex 2015-04-05 18:34:00