4

私は物のサイズを送っているフォームを持っています、そして私はそれに応じて価格を設定することができるように文字列が何に等しいかを見る必要があります。私がこれをやろうとすると、それらは等しくないと言われ、私は価格を取得しません。これは私が使用しているコードです:

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 ['sizes']をエコーすることができ、それは私にそれらの1つを正確に与えます。

4

9 に答える 9

8

ポール・ディクソンの言ったことは正しい。また、ifステートメントの不格好なチャンクの代わりにswitchステートメントを使用することをお勧めします(実際には論理的なバグがあります、追加するかもしれません -ない場合$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;
}

?>
于 2008-10-08T20:31:54.110 に答える
3

これは、switch/case ステートメントの適切な候補であり、「else」がデフォルトです。

また、Medium および Large で elseif を使用しない場合、$_POST['sizes'] が Large でない場合、$total は常に $_POST['price'] になります。これもあなたを失望させる可能性があります。

于 2008-10-08T20:34:52.390 に答える
2

つまり、if/else の問題は、最後の else が常に発生していることです。スイッチはまだ優れていますが、コードは次のようになります。

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 などを無視します。

于 2008-10-08T20:55:25.047 に答える
1

一重引用符を使用してみてください

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 で文字列リテラルを宣言する方法の違いについては、このマニュアル ページを参照してください。

(論理エラーを修正するために編集されました-他の人が指摘したように、ここではスイッチがより明確になります)

于 2008-10-08T20:27:12.840 に答える
1

または、不格好なスイッチよりもさらに優れているのは、この単純なロジックを利用して、「データ駆動型プログラミング」を実践することです。

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

$total = array_key_exists($_POST['sizes'], $vals)
    ? $vals[$_POST['sizes']]
    : $_POST['price'];
于 2009-02-04T00:01:58.717 に答える
1

このエラーの実際の原因は別として、ラベル以外の値を使用していれば回避できた可能性があります。

<select name="sizes">
    <option value="small">Small ($30)</option>
    <option value="meduim">Medium ($40)</option>
    <option value="large">Large ($50)</option>
</select>
于 2009-02-04T00:13:50.583 に答える
0

$ totalは文字列ですか?

$ total = "30"; 文字列の構文です。$ total = 30; Numericの場合は正しいでしょう。

于 2009-02-03T23:51:38.490 に答える
0

Isn't there a security hole here? What if someone just submits whatever price they want for the default clause?

于 2009-02-03T23:53:38.877 に答える
0
// 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'];
于 2009-02-04T00:04:48.650 に答える