source

PDO가 bool(false) 파라미터를 string("?)으로 변환하는 이유는 무엇입니까?

factcode 2022. 9. 23. 00:02
반응형

PDO가 bool(false) 파라미터를 string("?)으로 변환하는 이유는 무엇입니까?

새로운 MariaDB 10.5.8 설치에 문제가 있습니다. STRICT_TRANS_TABLES셋팅이 되어 있고$sql대상:

'INSERT INTO test (flag) VALUES (?)'

(어디서)flag로 정의됩니다.tinyint(1))와 함께var_dump($params)표시:

array(1) {
  [0]=>
  bool(false)
}

다음과 같은 메시지를 받습니다.

Incorrect integer value: '' for column `mydb`.`test`.`flag` at row 1

대신 다음 작업을 수행할 경우:

'INSERT INTO test (flag) VALUES (false)'

파라미터 없이 정상적으로 동작합니다.

데이터베이스에 접속하는 방법은 다음과 같습니다.

$this->PDO = new PDO('mysql:host=' . DB_SERVER . ';dbname=' . DB_NAME . ';charset=utf8mb4', DB_USER, DB_PASSWORD, [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
    PDO::ATTR_STRINGIFY_FETCHES  => false,
]);

$this->PDO->query("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");

그리고 이것이 제가 마리아에게 질문/패럴을 보내는 방법입니다.DB:

$stmt = self::$_instance->PDO->prepare($sql);
$stmt->execute($params);

삽입하려고 하면true대신false, 모든 것이 정상적으로 동작합니다. true로 변환되고 있다.1어디선가, 그리고false로.''내가 뭘 잘못하고 있지?

모든 값은 PDO로 처리됩니다.PARAM_STR.

https://www.php.net/manual/en/pdostatement.execute.php

execute()method에서는 변수의 유형을 지정할 수 없습니다.항상 문자열에 캐스팅되기 때문에 다음과 같은 이상한 결과를 얻을 수 있습니다.

php > var_dump((string) true);
string(1) "1"

php > var_dump((string) false);
string(0) ""

PDOStatement::bindValue()를 사용하여 값의 유형을 지정할 수 있습니다.

$statement->bindValue('some_bool', true, PDO::PARAM_INT);

MySQL에는 'true' 부울 타입이 없기 때문에 권장하는 것은PDO::PARAM_INT에 걸쳐서PDO::PARAM_BOOL.

훨씬 더 간단한 솔루션은 미리 int에 부울 값을 지정하는 것입니다.

$stmt = $PDO->prepare('INSERT INTO test (flag) VALUES (?)');
$stmt->execute([(int)$flag]);

여기 pdo params의 빈 문자열에 주조되는 부란을 해결할 수 있는 빠른 조각이 있습니다.

$params = array_map(fn($param) => is_bool($param) ? intval($param) : $param, $params);

언급URL : https://stackoverflow.com/questions/64874468/why-is-pdo-converting-my-boolfalse-param-to-string

반응형