자동차 테이블에 레코드를 삽입하려고합니다. 다음은 테이블의 축소 된 버전입니다.PDO가 빈 값을 null로 처리하는 이유는 무엇입니까?
참고 : 실제 작업 모델이 아니므로이 모델을 사용하거나 평가해서는 안됩니다. 나는 단순화 된 방식으로 문제를 보여주고있다.
mysql> describe desc_autos;
+-----------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------------------+----------------+
| car_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| automobile_name | varchar(25) | NO | MUL | | |
+-----------------+------------------+------+-----+---------------------+----------------+
7 rows in set (0.00 sec)
mysql> select count(*) FROM desc_autos WHERE automobile_name IS NULL;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) FROM desc_autos WHERE automobile_name = '';
+----------+
| count(*) |
+----------+
| 19322 |
+----------+
1 row in set (0.02 sec)
+-------------+
CREATE TABLE `desc_autos` (
`car_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`automobile_name` varchar(15) NOT NULL,
PRIMARY KEY (`car_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------------+
1 row in set (0.00 sec)
그래서 당신은
automobile_name
필드가
NOT NULL
입니다보고, 빈 값은 많은 레코드를 표시하고있다.
(필드 이름을 무시하십시오. null이 아닌 값이있는 필드가 허용됩니다.)
원시 MySQL 함수에서 PDO로 변환 중입니다. 비어있는 automobile_name
값을 가진 레코드를 삽입하면 문제가 없습니다. 정상적으로 작동합니다. automobile_name
이 비어 있으면 PDO가 작동하지 않습니다.
$automobile_name = '';
try
{
$q = "
INSERT INTO
desc_autos
(
automobile_name
)
VALUES
(
:automobile_name
)
";
$stmt = $dbx_pdo->prepare($q);
$stmt->bindParam(':automobile_name', $automobile_name, PDO::PARAM_STR);
$stmt->execute();
return true;
} catch(PDOException $err) {
log_error();
return false;
}
}
이 다음과 같은 오류가 발생합니다
Error: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'automobile_name' cannot be null
은 내가 암시 적으로 NULL 값을 삽입하는 PDO를 말할 줄 알았는데, 그렇지 않으면 빈 값이 같은 ... 빈 값을 삽입 할 것입니다.
예 :
$stmt->bindValue(':automobile_name', !empty($automobile_name) ? $automobile_name : NULL, PDO::PARAM_STR);
나는이 경우 NULL을 삽입 할 필요가 아니에요 - 나는 주어진 필드에 빈, null이 아닌 값을 삭제해야합니다.
질문 :
왜 PDO가 null로 빈 값을 치료한다?
mysql_query()로 작업 한'IS NULL'을 암시하고 있습니까? PDO가 실제로 MySQL 표현식에 영향을주지 않기 때문입니다.삽입하는 경우, NULL 값을 빈 문자열로 변환하는'PDO :: PARAM_STR'을 사용하여 값을 바인딩합니다. – mario
@mario 나의 반응 역시 그렇지만 맨 위에는'$ automobile_name = '';이 변수가 명시 적으로 빈 문자열로 설정되어 있습니다. –
@mario 이전에이 삽입 쿼리는'$ q = "INSERT INTO desc_autos (automobile_name) VALUES ($ automobile_name)";와 같이 mysqli_query ($ dbx, $ q); 공백 (또는 null)이라도, MySQL에서는 공백 값으로 삽입됩니다. –