문제

나는 물건의 크기를 보내는 양식을 가지고 있으며, 그에 따라 가격을 설정할 수 있도록 문자열이 무엇인지 확인해야합니다. 내가 이것을하려고 할 때, 그것들은 같지 않다고 말하고 가격을 얻지 못했습니다. 이것은 내가 사용하는 코드입니다.

if ($_POST['sizes'] == "Small ($30)"){$total = "30";}
if ($_POST['sizes'] == "Medium ($40)"){$total = "40";}
if ($_POST['sizes'] == "Large ($50)"){$total = "50";}
else {$total = $_POST['price'];}

여기서 내가 뭘 잘못하고 있니? 나는 $ _post [ 'size']를 반향 할 수 있으며 그 중 하나를 정확히 제공합니다.

도움이 되었습니까?

해결책

폴 딕슨이 말했다 맞다. IF 문의 Clunky 덩어리 대신 스위치 문을 사용하는 것이 좋습니다 (실제로 논리 버그가있는 경우 추가 할 수 있습니다. $total 항상 동일합니다 $_POST['price'] 그렇지 않은 경우 'Large ($50)')

<?php

switch ( $_POST['sizes'] )
{
    case 'Small ($30)' :
        $total = 30;
        break;
    case 'Medium ($40)' :
        $total = 40;
        break;
    case 'Large ($50)' :
        $total = 50;
        break;
    default:
        $total = $_POST['price'];
        break;
}

?>

다른 팁

그것은 당신의 'else'가 기본값 인 스위치/케이스 문의 좋은 후보입니다.

또한, elseif 's를 중간 및 대형으로 사용하지 않고, $ _post ['size ']가 크지 않으면 $ _Post ['price ']가 항상 $ _post가됩니다. 이것은 당신을 버릴 수 있습니다.

아시다시피, IF/Else 's의 문제는 마지막 다른 것이 항상 일어나고 있다는 것입니다. 스위치는 여전히 더 좋지만 코드는 다음과 같습니다.

if ($_POST['sizes'] == "Small ($30)") { $total = "30";
} else if ($_POST['sizes'] == "Medium ($40)") { $total = "40";
} else if ($_POST['sizes'] == "Large ($50)") { $total = "50";
} else { $total = $_POST['price']; }

문제가 $ 30, $ 40 등이라고 말하는 모든 사람에게는 그렇지 않습니다. 변수는 숫자로 시작할 수 없으므로 PHP는 $ 40 등을 무시합니다.

또는 Clunky Switch보다 더 나은이 간단한 논리를 활용하고 '데이터 중심 프로그래밍'연습을 할 수 있습니다.

$vals = array(
    'Small ($30)' => 30,
    'Medium ($40)' => 40,
    'Large ($50)' => 50
);

$total = array_key_exists($_POST['sizes'], $vals)
    ? $vals[$_POST['sizes']]
    : $_POST['price'];

이 오류의 실제 원인 외에도 레이블 이외의 다른 값을 사용한 경우 피할 수 있습니다.

<select name="sizes">
    <option value="small">Small ($30)</option>
    <option value="meduim">Medium ($40)</option>
    <option value="large">Large ($50)</option>
</select>

단일 따옴표를 사용해보십시오

if ($_POST['sizes'] == 'Small ($30)'){$total = "30";}
elseif ($_POST['sizes'] == 'Medium ($40)'){$total = "40";}
elseif ($_POST['sizes'] == 'Large ($50)'){$total = "50";}
else {$total = $_POST['price'];}

이중 인용 문자열은 변수 보간을 사용하므로 $ 기호가 중요 해집니다! 보다 이 설명서 페이지 PHP에서 문자열 리터럴을 선언 할 수있는 방법의 차이점.

(논리 오류를 수정하기 위해 편집 됨 - 다른 사람들이 언급했듯이 스위치가 훨씬 더 명확해질 것입니다)

총 $는 문자열입니까?

$ total = "30"; 문자열의 구문입니다. $ 총 = 30; 숫자에 맞습니다.

여기에 보안 구멍이 없습니까? 누군가 기본 조항에 대해 원하는 가격을 제출하면 어떻게해야합니까?

// remove any non-decimal characters from the front, then extract your value,
// then remove any trailing characters and cast to an integer
$total = (integer)preg_replace("/^\D*(\d+)\D.*/", "$1", $_POST['sizes']);
if (!$total) $total = $_POST['price'];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top