2016-07-22 16 views
0

私のMySQLのクエリが失敗し続けて、なぜそれを読んで、私は明らかに私はテーブル名などのバックティック( `)が不足していたので、私はそれらを追加し、変更を理解できません。MySQLのクエリに失敗しましたか?

$db = new PDO("mysql:host=".$db_host.";db_name=".db_name, $db_user, $db_pass); 

    try{ 
     $check = $db->prepare("SELECT `userID` from `userData` WHERE `userID` = :accountID"); 
     $check->bindParam(':accountID', $accid, PDO::PARAM_INT); 
     $check->execute(); 
     if(!$check->execute()){ 
      die(var_dump($db->errorInfo())); 
     }else{ 
      if($check->rowCount() > 0) { 
       $creditsQuery = $db->prepare("SELECT `userCredits` FROM `userData` WHERE `userID` = :accountID3"); 
       $creditsQuery->bindParam(":accountID3", $accid, PDO::PARAM_INT); 
       $creditsQuery->execute(); 
       //Set Credits To Variable From Database Column 
       $credits = $creditsQuery->fetch(PDO::FETCH_ASSOC); 
      }else{ 
       $sql = $db->prepare("INSERT INTO `userData` (`userID`, `userCredits`) VALUES (:accountID2, '0')"); 
       $sql->bindParam(':accountID2', $accid, PDO::PARAM_INT); 
       $sql->execute(); 
       if(!$sql){ 
        die('Server Error: 404Insert, Please Contact A Member Of Staff If This Error Continues.'); 
       } 
      } 
     } 
    }catch(PDOException $e){ 
     die ("Server Error: 404Connection, Please Contact A Member Of Staff If This Error Continues."); 
    } 

のerrorInfo線が表示されます:ここでは、コードされた配列(3){[0] =>列(5) "00000" [1] => NULL [2] => NULL}

したがって、tryブロックが例外をスローしないので、データベースは正常に接続されます。だから私は本当に知らない。

おかげで、

マット

+0

あなたのPDO接続指示は、あなたのtryブロックではありませんので、例外がキャッチされません。 ) – Kern

+0

tryブロックに追加しました。もう一度変更はありません – Matt142

+1

あなたの例では '$ accid'に値がありません... –

答えて

1

あなたは

  • PDOが
  • $accidが値
  • が含まれていない
  • は、あなたの代わりに bindParamを使用している例外モードではありません、あなたのコード内のいくつかのエラーを持っています bindValue - それらの間にはかなりの重要なものがあります
  • MySQLの予約語でない限り、バックティックで何かをラップする必要はありません
  • あなたはPHPでレコードの存在をチェックしています。これはMySQLの仕事です。 PHPはレコードがMySQLに存在するかどうかを正確に判断できません。 PHPとMySQLの接続にはごくわずかな遅延があります(人間の測定ではごくわずかですが、コンピュータ測定ではまったく)。結果が到着し、PHPによって解析されるまでに、別のプロセスがレコードを挿入する可能性があります。そのため、MySQLは一意性とデータの完全性を処理します。

、私が投稿していたコードのコメントを読んで、あなたのニーズに応じて調整してください:

<?php 

/** 
* Create PDO object and set it into exception mode 
*/ 

try { 
    $db = new PDO("mysql:host=".$db_host.";db_name=".db_name, $db_user, $db_pass); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
    exit; 
} 


try { 
    // Replace with actual value 
    $user_id = 1; 

    // Pay close attention to IGNORE keyword - it's extremely important 
    // and it requires a unique index to be placed on userID column 
    // I assumed that userID is primary key 
    $query = "INSERT IGNORE INTO userData (userID, userCredits) VALUES (:userID, 0)"; 

    $stmt = $db->prepare($query); 

    $stmt->bindValue(':userID', $user_id); 

    $stmt->execute(); 

} catch(PDOException $e) { 
    echo 'An error occurred: '. $e->getMessage(); 
} 
+0

ありがとう、これは非常に便利ですが、実行されると、2番目のtryステートメントで例外がキャッチされます。ここでは完全なコードです:http://pastebin.com/Gv7EYqbN – Matt142

+0

@ Matt142 - 例外メッセージは何ですか?そしてなぜあなたは 'rowCount()'関数を使用していますか?例外が発生しない場合は、クエリは成功し、選択を続行できます。 –

+0

例外メッセージはerrUserです。申し訳ありません – Matt142

関連する問題