2011-12-26 3 views
0

강사가 양식 제출을 테스트중인 비디오 자습서를보고 있습니다.PHP 비어있는 이상한 행동과 0 대 0 "

그가 사용하는 코드는 다음과 같습니다

$required_fields = array('menu_name', 'position', 'visible'); 

foreach ($required_fields as $fieldname) { 
    if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] != 0) { 
     $errors[] = $fieldname; 
    } 
} 

공지 사항 그가이 어떤 이유로 나를 위해 작동하지 않습니다 $_POST[$fieldname] != 0

있는 &&if statement의 조건.

그러나 0처럼 따옴표를 붙이면 $_POST[$fieldname] != "0"이됩니다.


BTW의 'visible' 필드는 MySQL은 부울, 일명 tinyint(1)이다. 여기

은 양식의 HTML이이 필드에 모습입니다 :

Visible: 
<input type="radio" name="visible" value="1" <?php if ($sel_subject['visible'] == "1") {echo "checked=\"checked\"";} ?> /> Yes 
&nbsp; 
<input type="radio" name="visible" value="0" <?php if ($sel_subject['visible'] == "0") {echo "checked=\"checked\"";} ?> /> No 

어떤 아이디어? 당신의 도움에 미리 감사드립니다.


UPDATE :

은 무슨 일이 있었는지 모르겠지만, 어떤 이유로 코드는 따옴표없이 지금 노력하고 있습니다. 혼란스러워서 죄송합니다.

비교하기 전에
+0

나는 그것을 인용해야하고 HTML을 사용하지 않고 변경하려고했지만 그다지 차이가 ​​없다. – Nathan

+0

사용중인 코드를 확인할 수 있습니까? 'foreach'에있는'if' 문은'{'앞에')'가 없습니다. – Tim

+0

@Tim 죄송합니다. 문제가 표시되지 않습니다. 나는 일식이 나를 경고했을 것이라고 생각한다. – Nathan

답변

1

는 수행

 
$fieldName = (int) $_POST[$fieldname]; 

나는 당신이 조건을 정의한 생각이

+0

이것이 무엇을 설명 할 수 있습니까? – Nathan

+0

@Nathan 그것은 int로 캐스팅합니다. 기본적으로 문자열이 아닌 int로 채워 넣습니다. 모든 폼 입력은 문자열, 짝수입니다. 즉 폼에'0'을 쓰면 숫자/int 0이 아니라 서버로 보내질 때 문자열 "0"을 반환합니다. 물론 입력이 "0username" int로 캐스팅하면 숫자 0 만 남게됩니다. 폼에서 오는 데이터를 항상 숫자로 나타내지 않는 한 찾고있는 것이 아닙니다. – Phoenix

+0

@Nathan 또한, 숫자로 시작하지 않는 문자열을'(int) menuname "처럼 캐스팅 할 때 결과는 0입니다. 숫자 데이터가없는 모든 필드가 같으므로 무의미합니다 int에 캐스트하면 0. – Phoenix

0

도움이 희망하는 경우() 모든 포스트 PARAMS에 값이 있고,없는 것을 확인하십시오 비어 있지 만, 0으로 볼 수있는 매개 변수 값을 가질 수 있습니다.

그러나 두 번째 및 세 번째 조건은 일부 PHP 내부 형식 변환 규칙에 대한 것입니다. 매개 변수에 빈 문자열 값을 전달하면 empty()가 true를 반환하므로 & & 연산자가 두 번째 조건을 확인합니다. 빈 문자열을 정수 0과 비교하면 true가 다시 반환되므로 $ value! = 0은 false를 반환하므로 조건이 적용되지 않습니다.

'position'(또는 기타)의 필수 입력란에 빈 문자열을 보내면 위의 코드는 오류로 간주하지 않고 유효성 검사가 실패하는 이유입니다.

당신이 모든 값이 설정되어야하고 아무도 빈,하지만 눈에 보이는 필드가 "0"의 값을 가질 수 원하기 때문에, 당신은이에 비해 변경 제안 :

foreach ($required_fields as $fieldname) { 
    if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] !== "0")) { 
     $errors[] = $fieldname; 
    } 
} 

기억을 모든 HTTP PARAMS (GET, POST, ...)는 문자열 값으로 PHP 스크립트에 전송됩니다. == 또는! = 연산자를 사용하여 문자열을 정수 0과 비교하는 경우 PHP가 문자열 값을 정수로 변환하므로 ''또는 '0'사이에 차이가 없습니다. 그러나 === 또는! == 연산자를 사용하고 0을 문자열로 사용하면 값이 변환되지 않습니다. 그래서 당신은 '0'과 '0'을 구별 할 수 있습니다.

+0

이것은 나를 위해 소화 할 것이 많지만 :-) 내가 관심있는 세부 유형입니다. 내 업데이트를 눈치 채 셨는지/게시물을 편집했는지는 확실하지 않지만, 이유가 무엇인지 (이유는 모르겠습니다) , 유효성 검사가 제대로 작동하기 시작했습니다. 나는 아직도 당신이 쓴 것을 공부할 시간을 가질 것이다. 여기에 내가 이해하는 데 도움이 될 세부 사항이있는 것 같습니다. 고맙습니다. – Nathan

+0

당신의 환영 네이선. 필요한 경우 더 설명해 드리겠습니다. 그러나 HTML 폼에서 빈 값을 보내면 (HTML 필드에 아무것도 입력하지 않고 제출하면) 코드에서 오류를 고려하지 않을 것이라고 생각합니다. 그것이 당신이 원하는 것이 아니라면, 제 제안 된 수정이 도움이 될 수 있습니다. :) – farzad