2011-12-25 13 views
1

通常の変数の流れについて困惑している、そしてそれで私は、次のチェックボックスがあります。

<input type="checkbox" name="test"> 

注:このフォームはされていますそれ自体に提出されます。フォームの上

、私は次のPHPいる:私は、フォームを処理するとき、私は私が期待するもの

if (empty($_POST['test'])) { 
    $thevalue = 0; 
} else { 
    $thevalue = 1; 
} 
var_dump($thevalue); 

得ます。私がボックスにチェックして提出すると、int(1)となります。チェックしないと、私はint(0)となります。私のPHPコードの最初の行で


、私はいくつかの単純な変数と$_POST['test']を交換したかったです。

だから私は自分のコードの上に次の行を追加:私はその後、empty($simplevar)

であることを私if statementに条件を置き換えしかし、私は、フォームを送信すると、私は"Notice: Undefined index:"エラーを取得する

$simplevar = $_POST['test']

をメッセージ

  1. どうしてですか?
  2. 私が後にしたことを達成することができたと仮定すると(つまり、$ _POSTを$ simplevarに挿入する)、どうすればよいでしょうか?

ご協力いただきありがとうございます。

PS:私はこの質問にフォローアップしているかもしれませんが、すべてをここに詰め込んで混乱させたくありませんでした。

もう一度おねがいします...ああ、メリークリスマス! ;-)

+1

フォームが送信される前に '$ _POST ['test']'を変数に代入しているので、これが起こっています。だからあなたは代わりにするべきです: '$ simplevar =(isset($ _ POST ['test']))? $ _POST ['test']:null; '。 'empty()'は、変数が0であるか、空であるか、まったく設定されていないかをチェックするので、この関数で$ _POSTを直接チェックすると、設定されているかどうかがチェックされます。 –

+0

あなたの問題は '$ _POST'とは何の関係もなく、クレイジーウェイチェックボックスはHTMLで動作します。表示される動作は、チェックボックスにのみ適用されます。 –

+0

@Abhi Beckert - そうではありません。 'test'要素はフォームが提出された後にのみ' $ _POST'スーパーグローバルに挿入されています。したがって、 '$ _POST'配列にない要素に対する操作は、入力のタイプに関係なくこのエラーを生成します。それは入力のタイプとは関係ありません。 –

答えて

0

これは、チェックボックスをオンにしないと、ブラウザがフォームを送信するときに、そのコントロールのサーバーに値を送信しないためです。このため、$_POST['test']は定義されておらず、存在していないかどうかをチェックせずに使用しようとしたため、警告が表示されます。 empty()が行うチェックの1つは、値が設定されているかどうかを確認することです。したがって、empty()$_POSTのキーを直接使用すると、エラーは発生しませんが、このチェックなしで割り当てで使用しようとすると、エラーが発生します。

おおよそ何をしたいのですか?ロジックをわずかに変更するだけです。あなたがすれば:

$simplevar = !empty($_POST['test']); 
// You could also do 
// $simplevar = isset($_POST['test']); 

if ($simplevar) { 
    // The box was checked 
} else { 
    // The box was not checked 
} 

...あなたはエラーなしにしたいことをします。この方法を使用すると、$simplevarには、ボックスがチェックされているかどうかを示すブール値が常に保持されます。

+0

ありがとうDaveRandom、それはとてもエレガントな解決策です。 – Nathan

0

チェックボックスをオフにすると、$_POSTの配列にキーとして追加されないため、投稿したエラーが$simplevar = $_POST['test']に返されます。 empty()を使用すると、この問題はempty()で処理エラーが改善されます(まあまあまったくありません)。

このチェックボックスをオンにしたときにエラーが表示されるかどうかは指定していませんが、上記の説明だけが私に与えることができます。わからない場合は、print_r($_POST)を実行して実際に何が含まれているかを確認してください。あなたの問題へ

ソリューションは少し良くエラーを処理する三元表現を使用することです:

$simplevar = isset($_POST['test']) ? 0 : 1; 

$_POST['test']が設定されていない場合、これが$simplevar0を割り当てます(チェックボックスがチェックされていません)それ以外の場合は1です。


は、そうしないと、エラーが毎回表示されます、それはすべての時間のページの負荷を実行していないように、すべてのフォーム処理コードが

if(!empty($_POST)) { 
    // Code 
} 

の内側に置かれていることを確認しています。

0

チェックボックスの値は、チェックボックスをオンにした場合にのみ送信されます。これは、チェックされていないチェックボックスが$_POSTアレイに表示されないことを意味します。正常な動作だ

$simplevar =& $_POST['test']; 
if(empty($simplevar)) $thevalue = 1; 
else $thevalue = 0; 
+0

フィードバックニットルありがとう。私は本当にリファレンスが(変数との比較で)何か分かりません。あなたの例で参照がどこに存在するかを指摘できますか? – Nathan

+0

@Nathan:参照は最初の行( '&')に作成されます。 '$ simplevar'は' $ _POST ['test'] 'への参照であり、参照を元の変数(読み書き)として使うことができます。 – knittl

0

PHPからの通知を抑制するための方法ではなく、変数の参照を使用することです。

$simplevar = $_POST['test']; 

$ _POST変数が存在しない可能性があります。 ZendランタイムはNULLの値を割り当てますが、あなたが望むものではない場合は、有用なデバッグヒントを与えます。

empty()を以前に使用した場合、変数の存在のチェックが組み込まれました。empty()は言語構成です。 isset()のように、よくそのような通知を避けるために使用されます。そのような言語の動作をエミュレートするために面倒な構文は次のとおりです。

$simplevar = empty($_POST['test']) ? NULL : $_POST['test']; 

ビルトインの言語は以下のとおりです。今

$simplevar = @($_POST['test']); 

、私はそれを言及焙煎れます。 (@を使用すると、デバッグ通知をいつでも戻すことができますが、emptyおよびisset構文では永久に抑制する場合に便利です)。

0

まず、$ _POST、$ _REQUEST、および$の変数_GETは、それらを使用しようとする前に設定されます。単にエラーを出力しても、設定されていない状態を常に処理してください。

エラーは未定義のインデックスであるため、テストでは$ _POSTに設定されていないようですが、それは意味がありません。私は$ _POSTをチェックするために、おそらくエコーまたはvarダンプを、チェックを追加します。それが設定されていると、他の問題がスコープの問題になる可能性があります。 $ _POSTはスーパーグローバルと呼ばれるもので、どのスコープでも利用可能です。あなたが設定した変数は、スコープを越えてそれらにアクセスしたい場合に、それらを変数として定義してグローバルにする必要があります。

関連する問題