現在formでデータをPHPに渡しておりますが、チェックボックスにチェックした値をうまく渡せないでおります。
チェックボックスをformでPHPに渡す簡単なサンプルなどがあれば教えてください。
test.html
<html> <body> <form action="./test.php" method="get"> <input type="checkbox" name="check" /> <input type="submit" /> </form> </body> </html>
test.php
<?php echo $_GET['check'] === 'on' ? 'チェックされてる' : 'チェックされてない' ; ?>
>チェックボックスにチェックした値をうまく渡せないでおります。
チェックボックスは複数の値を返すのでhtml文ではname="chk[]"のように[]を付けます。
php側では一個でも配列として表現されています。
>チェックボックスをformでPHPに渡す簡単なサンプルなどがあれば教えてください。
formの処理はhtml文の生成と受け取った値の検証と異なる二つの事をしなければならず面倒です。それらを軽減する目的で、HTML_QuickFormがあると思いますが、生成されるhtml文への介入がよくわからず、その考えだけを拝借してサンプルを書いてみました。
$form = array( '<p>formてすと</p>', '名前', 'name' => array('text'),'<br>', 'メール', 'email' => array('text'),'<br>', 'color' => array('checkbox', array('red', 'green', 'blue'), array('赤', '緑', '青')), '<br>', 'six' => array('radio', array('male', 'female'), array('男', '女')), '<br>', '<input type="submit" value="送信">', '<input type="reset" value="クリア">' ); $form_var = validate($form, $_POST); if (empty($form_var)) echo form_html($form, $_SERVER["PHP_SELF"]); else print_r($form_var);
htmlの生成では$form配列の名前付きキーのものはinputタグに生成され、ただの文字列はhtml文としてそのまま出力されます。
検証では名前付きキーのものだけがチェックされます。
処理の流れはvalidate()で検証します。最初のアクセスでは何も渡ってこないので$form_varは空です。
次にform_html()でhtml文を生成します。formタグだけのものですので実際のコードでは前後にheaderやbodyが必要です(テストではこれだけでも動きます)。
validate()が値を返したら本来の処理をします。ここではprint_r()でダンプしています。
配列の構成が出来る範囲を限定してしまいます。実用に耐えるにはもっと複雑にする必要があると思いますがサンプルということで。
define(CR, "\n"); function form_html($forms, $action, $method = 'post') { $html = ''; foreach ($forms as $name => $input) { if (is_string($name) && is_array($input)) { list($type, $value, $option) = $input; if ($type === 'checkbox') $name .= '[]'; if ($name) $name = ' name="'.$name.'"'; if (is_array($value)) { $combine = array_combine($value, $option); foreach ($combine as $value => $option) $html .= '<input type="'.$type.'"'.$name.' value="'.$value.'">'.$option.CR; } else { if ($value) $value = ' value="'.$value.'"'; $html .= '<input type="'.$type.'"'.$name.$value.'>'.$option.CR; } } else $html .= $input.CR; } return '<form action="'.$action.'" method="'.$method.'">'.CR.$html.'</form>'.CR; }
form_html()は$formsからhtml文を生成します。form_html()の中に全てどじ込めてしまったので外からは便利なのですがhtml生成の自由度が低くなってしまいます。それでも妥協出来るレベルであればいちいち手書きするよりは便利だと思います。
function validate($forms, $env) { // $envの値はそのまま使うべきではない $html = array(); foreach ($forms as $name => $input) { list($type, $value, $option) = $input; if (is_string($name) && isset($env[$name])) { if (is_array($value)) { $combine = array_combine($value, $option); if (is_array($env[$name])) { $pack = array(); foreach ($env[$name] as $env_name) if (isset($combine[$env_name])) $pack[] = $combine[$env_name]; else $pack[] = ''; // 想定外の値が返った $html[$name] = $pack; } else { if (isset($combine[$env[$name]])) $html[$name] = $combine[$env[$name]]; else $html[$name] = ''; // 想定外の値が返った } } else $html[$name] = htmlspecialchars($env[$name], ENT_QUOTES, 'UTF-8'); } } return $html; }
同じように検証もvalidate()の中にある程度は閉じ込めることができるのは利点です。共通のチェックはこの中で出来てしまうので、固有のチェックだけに専念できます。基本的に$_POSTや$_GETの値は直接使うべきではないでしょう。
ここでは送出した値を持っています。それに対して受け取った値と比較することで予期しない値を受け取ることを防ぐことができます。
function array_combine($keys, $values) // for PHP4 { $combine = array(); foreach ($keys as $id => $key) $combine[$key] = $values[$id]; return $combine; }
php4にはarray_combine()が無かったので。php5なら必要ありません。
delete.php を以下のようにして試してみましたが、
こちらの環境では問題ないように思えます。
<pre> <?php print_r($_POST) ; ?> </pre>
ありがとうございます。
少々あせって投稿したこともあり説明が不足しておりました。
実際にやっていることは
チェックボックスでチェックした部分のデータを削除する
というものなのですが
実際にチェックボックスの部分は下記のようになります。
<form action="delete.php" method="post">
<input type="checkbox" name="delete_data_a" value="delete_data_a">
<input type="checkbox" name="delete_data_b" value="delete_data_b">
<input type="checkbox" name="delete_data_c" value="delete_data_c">
<input type="submit" value="delete">
</form>
渡されたデータがdelete_data_cならその部分をPHPに渡すということをしたいと考えておりますが
なぜか渡せません。
渡せてないのか受け取れてないのかわかりませんが
HTMLの部分には問題がないように見られます。