2016-08-22 10 views
-1

今日、非常に奇妙なバグが発生しました。私はこれによってサイドブラインドを起こしているので、アプリケーション全体が壊れています。PDOを使用するときにMySQLを使用するときに奇妙なエラーが発生する

私は標準的なモデルを持っているので、私はこの小さなフレームワークを構築しています。これはちょっと長めの説明的なものになります。

<?php include('inc/inc.php'); ?> 
<?php 
if(!empty($_POST['answer']) && !empty($_POST['levelstart'])){ 
    if($stmt = $site->answerQuestion($_POST['levelstart'],  $_POST['answer'])){ 
    if($stmt[0]){ 
     echo json_encode(array('success' => true, 'correct' => $stmt[1], 'correctanswer' => $stmt[2], 'round_end' => $stmt[3])); 
    }else{ 
     echo json_encode(array('success' => false, 'error' => 'error occurred'.$stmt[1])); 
    } 
    }else{ 
    echo json_encode(array('sucess' => false, 'error' => 'Unknown error')); 
    } 
}else{ 
    echo json_encode(array('success' => false, 'error' => 'Provide all necessary parameters.')); 
} 
?> 

このコードは、以下を出力します。

INSERT INTO quiz_level_starts (`user_id`, `question_id`, `time`, `round_id`, `type`, `success`, `ref_id`) VALUES ('4', '10', '1471887809', '', '1', '1', '905'){"success":false,"error":"error occurred23000"} 

上記生成されたクエリは、私は単純にテストするためのパラメータを必要としないので、私は簡単なまとめだけダミーです。 json配列の "error"キーにはエラーデータが含まれており、エラーコードがそこにダンプされます。 23000は重複したユニークな列が存在するためのmysqlエラーコードですが、クエリで使用しているユニークな列はありません(下記の表構造体を参照してください)。

関数answerQuestionは非常に長いため、私は関連する行を次に貼り付けます。 $ site-> answerQuestionでは、 "insertLevelStarts"という関数を呼び出します。この関数は、dbにエントリを挿入することになっています。

if($stmtss = $this->db->insertLevelStarts($_SESSION['user']['id'], $stmts['return'][0]['id'], time(), $roundid, 1, 1, $levelstart)){ 

そして、これはまた、それが宣言されていますどのように関連して、未知のコードの残りの部分である: これは私がそれを呼び出す方法です

public function insertLevelStarts($user_id, $question_id, $time, $round_id, $type = 0, $success = 0, $refid = 0){ 
    /* 
    Type=0 start 1 stop 
    success=0 for start 1 if successfull on stop 
    */ 
    $query = 'INSERT INTO quiz_level_starts (`user_id`, `question_id`, `time`, `round_id`, `type`, `success`, `ref_id`) VALUES (:user_id, :question_id, :time, :round_id, :type, :success, :refid)'; 
    echo $this->genFakeQuery($query, array(
     ':user_id' => $user_id, 
     ':question_id' => $question_id, 
     ':time' => $time, 
     ':type' => $type, 
     ':success' => $success, 
     ':refid' => $refid, 
     ':round_id' => $round_id 
    )); 
    return $this->execInsert($query, array(
     ':user_id' => $user_id, 
     ':question_id' => $question_id, 
     ':time' => $time, 
     ':type' => $type, 
     ':success' => $success, 
     ':refid' => $refid, 
     ':round_id' => $round_id 
    ) 
); 
} 
public function genFakeQuery($query, $array){ 
    foreach($array as $key => $val){ 
    $query = str_replace($key, "'$val'", $query); 
    } 
    return $query; 
} 
public function execUpdate($query, $preparray, $updatearr){ 
    try { 
     $stmt = $this->db->prepare($query); 
     $stmt->execute(array_merge($preparray, $updatearr)); 
     $rows = $stmt->rowCount(); 
     if($rows > 0){ 
      return array('type' => 'rowsaffected', 'return' => $rows); 
     }else{ 
      return array('type' => 'noreturn', 'return' => 'none'); 
     } 
    } catch(PDOException $ex) { 
     return array('type' => 'error', 'return' => $ex); 
    } 
} 
public function updateClause($query, $update, $updatearr){ 
    if(count($update) > 0){ 
    $count = 0; 
    foreach($update as $k => $v){ 
     if($count > 0){ 
     $query .= ','; 
     } 
     $query .= " `$k` = :$k"; 
     $updatearr[":$k"] = $v; 
     $count++; 
    } 
    } 
    return array('query' => $query, 'updatearr' => $updatearr); 
} 

前述のクエリ

INSERT INTO quiz_level_starts (`user_id`, `question_id`, `time`, `round_id`, `type`, `success`, `ref_id`) VALUES ('4', '10', '1471887809', '', '1', '1', '905') 

挿入次のような表になります。

CREATE TABLE IF NOT EXISTS `quiz_level_starts` (
`id` int(11) NOT NULL, 
`user_id` int(11) NOT NULL, 
`question_id` int(11) NOT NULL, 
`time` int(11) NOT NULL, 
`type` int(11) NOT NULL, 
`success` int(11) NOT NULL, 
`ref_id` int(11) NOT NULL, 
`round_id` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
ALTER TABLE `quiz_level_starts` 
ADD PRIMARY KEY (`id`); 
ALTER TABLE `quiz_level_starts` 
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 

受け取ったヘルプを大幅に訴えるでしょう。

+3

をまあ、エラーコード23000が異なる意味を持つことができますhttp://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html –

+2

あなたが必要mysqlからより詳細なエラーメッセージを出力する –

答えて

0

round_idはNULLにすることはできず、デフォルト値もなく、空の値を渡す整数フィールドなので、エラーが発生すると想定します。 このクエリが動作するかどうか試してみてください:

INSERT INTO quiz_level_starts (`user_id`, `question_id`, `time`, `round_id`, `type`, `success`, `ref_id`) VALUES ('4', '10', '1471887809', '0', '1', '1', '905') 
関連する問題