2017-12-15 7 views
1

명시 적으로 데이터 형식을 선언하는 동안 PDO :: bindParam/bindValue를 사용할 때 데이터 형식이 제공된 값과 다른 경우 예외가 throw됩니다. MySQL 데이터베이스데이터 형식이 제공된 것과 다를 경우 PDO :: bindParam/bindValue가 예외를 throw합니까?

public function insert($sql, $values){ 
    $stmt = $this->connect()->prepare($sql); 
    foreach($values as $value){ 
     $stmt->bindValue($value[1], $value[2], $value[3]); 
    } 
    $stmt->execute(); 
} 

$array = array(
    0 => array(
     1 => ':jotName', 
     2 => 'some jot string', 
     3 => PDO::PARAM_STR 

    ) 
); 

$iSql = "INSERT INTO `jots`(`jotContext`) VALUES (:jotName)"; 

$con = new sql(); 
try{ 
    $con->insert($iSql,$array); 
} catch(PDOException $exception) { 
    echo $exception->getMessage(); 
} 

즉에 연결하는 데 사용되는 DB 클래스

발췌 PDO :: PARAM_STR이 $ array [0] [3]에서 PDO :: PARAM_INT로 변경되면 $ array [0] [2]가 int가 아닌 문자열이기 때문에 mysql 트랜잭션이 실패합니다.

PDO :: PARAM_STR, PDO :: PARAM_INT, & PDO :: PARAM_BOOL을 사용하여이 코드 블록을 테스트했습니다. _STR이 올바르게 작동하고 데이터베이스에 새 레코드를 삽입 할 것을 기대하는 동안. 삽입 메서드를 호출 할 때 _BOOL & _INT가 예외를 throw하지 않을 것으로 예상하지 않았습니다.

+1

이 변경 될 수 있지만, MySQL의 또는 PHP는 일반적으로 경우 매개 변수를 주조한다 그들은 할 수있다. 나는 그것이 무엇이 일어나고 있는지 짐작할 것이다. http://php.net/manual/en/pdo.setattribute.php – bassxzero

+0

확인하는 대신 typecasting 할 수 있습니다. 값이 실제로 올바른지 확인하기 위해 sql을 확인 했습니까? 제로로 바뀌는 몇 개의 jot 문자열과 같습니다. – IncredibleHat

+0

@bassxzero - setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION)는 유일하게 설정된 속성입니다. – Jaxchief

답변

2

적어도 mysql의 경우 오류가 발생하지 않습니다.

또한 어떤 유형의 경우 99.99% of time mysql is happy with PDO::PARAM_STR. 따라서, 당신은 $ 값 배열에서 모든 불필요한 물건을 생략 극적으로 삽입 기능을 단순화 할 수 있습니다 : 당신이`PDO :: ATTR_EMULATE_PREPARES`를 사용하는 경우

public function insert($sql, $values){ 
    return $this->connect()->prepare($sql)->execute($values); 
} 
$array = array('jotName' => 'some jot string'); 
$db->insert($sql, $array); 
+1

그래서 내 질문은 PDO :: PARAM_x의 요점으로 바뀝니다. 나는. 내 논리는 데이터를 얻고, 데이터를 검증/위생 처리하고, 데이터를 바인드하고, 실행합니다. 나는 타입 캐스팅에 대해 @bassxzero가 말한 것을 이해하는 동안. 문자열을 int로 어떻게 형변환 할 수 있습니까? – Jaxchief

+0

그다지 요점은 없지만 유용 할 수있는 몇 가지 사례가 있습니다. [예를 들어 INT] (https://phpdelusions.net/pdo#limit) –