2016-08-09 20 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

'구글 크롬'문자열입니다. interger하지 –

+2

이상한 오류가 있습니까? 그들은 더 명확해질 수 없다. 그것은 심지어 당신에게 말한다. 당신은 정수로'Chrome '을 공급하려했습니다. 당신은 고전적인 실수를 저질렀던 바보 같은 코드를 만들어 PDO를 "더 좋게"만들려고했습니다. 함수를 덤프하고 준비된 문을 직접 사용하십시오. –

답변

0

이게 재미있는 문제 - 원인은 매개 변수가 PDOStatement->bindParam()의 참조로 바인딩되어 있기 때문입니다.

e.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