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
'source' 카테고리의 다른 글
NumPy에서 인덱스 배열을 원핫 인코딩 배열로 변환 (0) | 2022.09.23 |
---|---|
문자열에서 각 단어의 첫 글자를 가져옵니다. (0) | 2022.09.23 |
VueX 스토어가 여러 유닛 테스트에 걸쳐 상태를 유지하는 이유는 무엇입니까? (0) | 2022.09.23 |
팬더를 사용하여 문자열 열의 각 값에 문자열 접두사를 추가하다 (0) | 2022.09.23 |
Panda DataFrame의 더 많은 열을 보려면 출력 디스플레이를 확대하려면 어떻게 해야 합니까? (0) | 2022.09.23 |