HTMLとPHPでの質問です。


現在formでデータをPHPに渡しておりますが、チェックボックスにチェックした値をうまく渡せないでおります。
チェックボックスをformでPHPに渡す簡単なサンプルなどがあれば教えてください。

回答の条件
  • 1人3回まで
  • 登録:2008/01/19 10:40:35
  • 終了:2008/01/26 10:45:02

回答(4件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812008/01/19 10:59:09

ポイント23pt

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' ? 'チェックされてる' : 'チェックされてない' ;
?>
id:quocard

ありがとうございます。

少々あせって投稿したこともあり説明が不足しておりました。

実際にやっていることは

チェックボックスでチェックした部分のデータを削除する

というものなのですが

実際にチェックボックスの部分は下記のようになります。

<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の部分には問題がないように見られます。

2008/01/20 23:15:18
id:tobeoscontinue No.3

tobeoscontinue回答回数212ベストアンサー獲得回数522008/01/19 22:43:09

ポイント22pt

>チェックボックスにチェックした値をうまく渡せないでおります。

チェックボックスは複数の値を返すので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なら必要ありません。

id:GoldenDawn No.4

GoldenDawn回答回数426ベストアンサー獲得回数812008/01/20 23:35:20

ポイント22pt

delete.php を以下のようにして試してみましたが、

こちらの環境では問題ないように思えます。

<pre>
<?php
print_r($_POST) ;
?>
</pre>
  • id:tobeoscontinue
    三種類のチェックの方法が考えつき下記のコードで確認できました。
    <?php

    if ($_POST["delete_data_a"])
     echo "delete_data_aがチェックされた<br>";
    if (isset($_POST["delete_data_b"]))
     echo "delete_data_bがチェックされた<br>";
    if ($_POST["delete_data_c"] == "delete_data_c")
     echo "delete_data_cがチェックされた<br>";

    ?>
    チェックボックスがチェックされない場合、$_POSTには値が渡らないのでisset()以外はエラーになると思ったのですが、テストした所ではエラーにはなりませんでした。
    ちょっと腑に落ちませんが。
  • id:tezcello
    > 渡せてないのか受け取れてないのかわかりませんが
    単純にどんな値が返されているかをチェックされてみてはどうでしょう?

    $data = <<< EOL
    <form action="test.php" method="post">
    <input type="checkbox" name="delete_data_a" value="a" id="a"/><label for="a">a</label>
    <input type="checkbox" name="delete_data_b" value="b" id="b"/><label for="b">b</label>
    <input type="checkbox" name="delete_data_c" value="c" id="c"/><label for="c">c</label>
    <input type="submit" value="delete"/>
    <input type="submit" value="delete"/>
    </form>

    EOL;

    print $data;
    var_dump($_POST);

    うちの環境では、
    チェックボックスの下に、
    array(2) { ["delete_data_b"]=> string(1) "b" ["delete_data_c"]=> string(1) "c" }

    と表示されます。


    > HTMLの部分には問題がないように見られます。
    html に記述している名前と、$_POST[] で指定している名前が一致してないなんてオチでは無いですよね?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません