2011-03-16 6 views
25

일부 PHP/MySQL 코드로 고민하고 있습니다. 하나의 테이블에서 읽는 중 일부 필드를 변경 한 다음 다른 테이블에 쓰는 경우 삽입 및 배열 값 중 하나를 Null로 데이터베이스에 null (필드에 null 값이 허용됩니다 삽입 할 때 null 일 때 아무것도 발생합니다. 그것은이 같은 비트 같습니다PHP/MySQL은 null 값을 삽입합니다.

$results = mysql_query("select * from mytable"); 
while ($row = mysql_fetch_assoc($results) { 
    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', {$row['null_field']}); 
} 

없음 모든 행은 null 값을 가지고 있으며, 내 쿼리 또는

답변

50

준비된 문을 사용하여 하나의 예입니다은 실제로 몇 가지 문제를 저장합니다.

MySQL의에서 null 값을 삽입하기 위해, 당신은 INSERT 시간을 지정하거나 추가 분기 요구하는 현장을 떠나야한다 : 당신이에 값을 삽입 할 경우, 그러나

INSERT INTO table2 (f1, f2) 
    VALUES ('String Value', NULL); 

을 이제 코드를 분기하여 작은 따옴표를 추가해야합니다.

INSERT INTO table2 (f1, f2) 
    VALUES ('String Value', 'String Value'); 

준비된 문이 자동으로 수행합니다. 그들은 string(0) ""null의 차이를 알고 적절하게 쿼리를 작성 :

그것은 당신을 위해 필드를 탈출
$stmt = $mysqli->prepare("INSERT INTO table2 (f1, f2) VALUES (?, ?)"); 
$stmt->bind_param('ss', $field1, $field2); 

$field1 = "String Value"; 
$field2 = null; 

$stmt->execute(); 

, 당신이 매개 변수를 바인딩하는 것을 잊지 않도록한다. 확장자가 mysql 인 상태로 머물러야 할 이유는 없습니다. mysqli을 사용하고 대신 prepared statements을 사용하십시오. 자신을 고통의 세계로 구원하십시오. NULL이 허용 필드

+3

훌륭해, 고마워, 이제 mysqli가 변환된다! – MattP

+5

@MattP : PDO도 똑같은 동작을한다. 하나에 정하기 전에 각각의 API를 비교한다. (PDO는 더 쉽다. mysql은 MySQL API에보다 직접적인 접근을 제공한다. – outis

+0

다른 approch - https://stackoverflow.com/a/20900661/4050261 –

5

난 당신이 따옴표를 필요가 있다고 생각 null이되지 않을 수도 있습니다 더 많은 필드와 2 열이있는 당신의 {$row['null_field']}, so '{$row['null_field']}'

따옴표가 없으면 때때로 문법 오류 인 insert into table2 (f1, f2) values ('val1',)과 같은 삽입 문으로 끝납니다. 그 숫자 필드 인 경우

, 당신은 위의 몇 가지 테스트를해야 할 것이며, null_field에 값이없는 경우, 명시 적으로 null로 설정 ..

+0

덕분에, 내가 몇 가지 추가 테스트를 추가하고 명시 적으로 null을 설정해야합니다, 그것은 필드가 빈 문자열이 아닌 null의 응용 프로그램에서 훨씬 더 논리적이다. – MattP

+0

삽입 할 값이 NULL이면 불행히도 필드의 인용 부호가 잘못됩니다. 하나의 문자열로 전체 문장을 수행 할 수 없습니다. is_null ($ row [ 'null_field']), 'NULL', ''('{$ row ['string_field ']}', '') 'mysql_query (" {$ row [ 'null_field']} '')) ")"도우미 함수를 작성하여 읽기가 쉬워 질 수있는 함수 quotedValueOrNull ($ value) {return (is_null ($ value), "NULL", " – ToolmakerSteve

4

, 당신은 출력 string, integer, 또는 NULL 문자에 var_export($var, true)를 사용할 수 있습니다. 결과는 자동으로 추가되거나 생략되므로 출력을 따옴표로 묶지는 않습니다. 예를 들어

:

mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")"); 
관련 문제