2016-08-09 11 views
1

だから私は(PDOの上に構築された)私自身のmysqlのクラスを使用してデータベースにいくつかのデータを挿入しようとしていますが、私はいくつかの奇妙なエラーがMySQLのクエリを返す奇妙なエラー

(!) Fatal error: Uncaught PDOException: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: 'Google Chrome' for column 'user_id' at row 1 in C:\wamp64\www\LVWeb\Core\Database\database.mysql-pdo.php on line 44

(!) PDOException: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: 'Google Chrome' for column 'user_id' at row 1 in C:\wamp64\www\LVWeb\Core\Database\database.mysql-pdo.php on line 44

表構造になっkeed:http://prntscr.com/c3pgzi

私のクエリ機能:

public function Query($query, $vars = []){ 
     $Statement = $this -> con -> prepare($query); 

     if(is_array($vars)) 
      foreach($vars AS $key => $val){ 
       if(is_string($val)) 
        $Statement->bindParam($key, $val, PDO::PARAM_STR); 
       else if(is_integer($val)) 
        $Statement->bindParam($key, $val, PDO::PARAM_INT); 
      } 

     return $Statement->execute(); 
    } 

私はデータを挿入しようとする一部:

  1. $セッション=文字列
  2. $応答[ 'ID'] =整数
  3. GetIp()=文字列:
    $a = "INSERT INTO sessions (ses_id, user_id, ip, os, browser) VALUES 
        (:ses_id, :user_id, :ip, :os, :browser)"; 
    
    $this->DB->Query($a, [ 
        ':ses_id' => $session, 
        ':user_id' => $response['ID'], 
        ':ip'  => GetIp(), 
        ':os'  => GetOS(), 
        ':browser' => GetBrowser()['name'] 
    ]); 
    

    だから私はすべての彼らが正しいタイプであるかどうかを確認するために出て変数をテストしています

  4. GetOs()=列
  5. GetBrowser()[ '名前'] =ストリング
+1

'Google Chromeは' 文字列です。 intergerではない –

+2

奇妙なエラー?彼らはより明確になることはできません..それはあなたにも言います。あなたは整数のために 'Google Chrome 'を供給しようとしました。あなたは古典的な間違いをして、PDOを悪化させるばかげたコードを作成することによってPDOを「より良く」しようとしました。関数をダンプし、準備されたステートメントを直接使用します。 –

答えて

0

これは面白い問題です。原因は、パラメータがPDOStatement->bindParam()の参照としてバインドされているためです。

I.e. foreachループでは、 "let:ses_idが$ valにあるものにバインドされるようにする"、そして次の反復で "let:user_idを$ valにあるものにバインドする"などと言う。ループの最後には、すべてのパラメータが同じ事物に効果的にバインドされています - 変数$val。その価値には何が含まれていますか? PHPが最後に割り当てたのは$vars[':browser']です。

したがって、$Statement->execute()は、すべてのフィールドがブラウザの名前と等しいレコードを挿入しようとします。あなたは、次のforeachのコードを変更する必要が

foreach($vars AS $key => $val){ if (is_string($val)) $Statement->bindParam($key, $vars[$key], PDO::PARAM_STR); else if(is_integer($val)) $Statement->bindParam($key, $vars[$key], PDO::PARAM_INT); }

+0

フィードバックありがとう! それはうまくいった、私はこれを解決策としてマークしている – Champa