【PHP】チェックボックスの値を受け取って処理


お世話になります。詳細は以下になります。

■前提
・楽天、Amazon、Yahooの各APIを利用中。

■やりたいこと
・検索ウィンドウを利用。その下にチェックボックスを配置。チェックボックスがcheckedになっていたら、任意の検索キーワードを追加。
 例:検索ボックスに「vaio」と入力し、チェックボックス「赤」をチェックすると、「vaio 赤」で検索。
・検索ボタン押下(検索結果表示)後もcheckedは保持。


文字数制限の関係で、現在のソースコードはコメント欄に書かせていただきます。


何卒よろしくお願い致します。

回答の条件
  • 1人50回まで
  • 13歳以上
  • 登録:
  • 終了:2014/04/15 21:47:22
id:cafe-beret

■定義ファイル

define('RED', '0');

define('BLACK', '1');

……

$COLOR = array(

'赤',

'黒',

…… );


■検索パラメータ編集・取り出し処理

function SearchParam($button)

{

$param = array();

$param['keyword'] = ''; // 検索キーワード

~中略~

$param['color']RED] = 0;

$param['color'][BLACK] = 0;

……

if ( $button == '絞り込み' ) {

// 設定された内容を確定

if ( array_key_exists('color', $_POST) ) {

// チェックボックスがチェックされている

foreach ( $_POST['color'] as $key => $id ){

$param['color'][$id] = '1'; // 選択済み状態

}

}

} else {

// 前回の設定内容を反映

$param['color'][RED] = $_SESSION['PARAM']['color'][RED];

$param['color'][BLACK] = $_SESSION['PARAM']['color'][BLACK];

……

}

~後略~


■検索ボックス、チェックボックス作成

<form name="search" class="search" action="http://example.com" method="post">

<input type="text" name="keyword" id="form" value="">

<input type="button" id="hogehoge" value="検索" onclick="javascriptの処理名()">

<?php

function Checkbox($color)

{

$checked = array(

'', // 赤

'', // 黒

…… );

// 選択されている項目を'checked'に

if ( is_array($colors) ) {

$i = 0;

foreach ( $colors as $color ){

if ( $color ) { // チェックされている

$checked[$i] = ' checked';

}

$i++;

}

}

?>

<input type="checkbox" name="col[]" value="0" <?=$checked[0] ?>>赤

<input type="checkbox" name="col[]" value="1" <?=$checked[1] ?>>黒

……

<input type="button" onclick="javascriptの処理名2">

<?php

}

?>


■検索部分

~前略~

$request = array(); // パラメータクリア

// キーワード

$request['keyword'] = $param['keyword']; // キーワード

} else {

return;

}

if ( array_key_exists('col', $_POST) ) {

// チェックボックスがチェックされている

foreach ( $_POST['col'] as $key => $id ){

$param['col'][$id] = '1';

}

$request['keyword'] .= (($request['keyword']) ? ' ' : '') . "ここに、チェックボックスの値に応じ「赤」「黒」などを追加できる処理を入れたい";

}


いろいろ無駄なコードもあるかもしれません。

実現にjavascriptが必要でしたら、それでも構いません。

また、やりたいことが実現できれば、大幅にコードが変わってもまったく問題ありません。

何卒よろしくお願い致します。

ベストアンサー

id:snow0214 No.2

回答回数470ベストアンサー獲得回数116

ポイント400pt

下のコードを追加してみてください。

<?php
if ( array_key_exists('col', $_POST) ) {
	 // チェックボックスがチェックされている
	foreach ( $_POST['col'] as $key => $id ) {
		$param['col'][$id] = '1';
	 }
	//追加処理
	$str_color = '';
	foreach ($_POST['col'] as $val) {
		$str_color .= ' ' . $COLOR[$val];
	}
	$request['keyword'] .= (($request['keyword']) ? ' ' : '') . $str_color;
}
?>
id:cafe-beret

snow0214さん

ありがとうございました。
正直、ここで2週間近く詰まっていたのですが、あっという間に解消しました。

アホみたいな感想ですが、まるで魔法にかかったようです。
己の未熟さを恥じ入るばかりです。


本当にありがとうございました。

2014/04/15 21:49:19

その他の回答1件)

id:pogpi No.1

回答回数385ベストアンサー獲得回数51

ポイント100pt

(document.(フォームのname).(チェックボックスのname).checked)で、チェックされているかは判定できますよ。赤、黒それぞれで判定して追加すればできると思いますよ。

id:cafe-beret

pogpiさん

ありがとうございます。
Javascriptでの方法ですね。

こちらでも実現できたのだろうと思いますが、早く実装できたsnow0214さんをBAにさせていただきました。
ご教示いただいた内容は、別のところで参考になりました。


ご回答頂きありがとうございました。

2014/04/15 21:51:08
id:snow0214 No.2

回答回数470ベストアンサー獲得回数116ここでベストアンサー

ポイント400pt

下のコードを追加してみてください。

<?php
if ( array_key_exists('col', $_POST) ) {
	 // チェックボックスがチェックされている
	foreach ( $_POST['col'] as $key => $id ) {
		$param['col'][$id] = '1';
	 }
	//追加処理
	$str_color = '';
	foreach ($_POST['col'] as $val) {
		$str_color .= ' ' . $COLOR[$val];
	}
	$request['keyword'] .= (($request['keyword']) ? ' ' : '') . $str_color;
}
?>
id:cafe-beret

snow0214さん

ありがとうございました。
正直、ここで2週間近く詰まっていたのですが、あっという間に解消しました。

アホみたいな感想ですが、まるで魔法にかかったようです。
己の未熟さを恥じ入るばかりです。


本当にありがとうございました。

2014/04/15 21:49:19
  • id:tobeoscontinue
    <?php
    define ("CR", "\n");

    function checkbox_html($name, $color) {
    $html = "";
    foreach ($color as $k=>$v) {
    $html .= '<input type="checkbox" name="'.$name.'[]" value="'.$k.'" onclick="rekw(this, false)"'.$v.'>'.$k.CR;
    }
    return $html;
    }

    function radio_html($name, $color) {
    $html = "";
    foreach ($color as $k=>$v) {
    $html .= '<input type="radio" name="'.$name.'" value="'.$k.'" onclick="rekw(this, true)"'.$v.'>'.$k.CR;
    }
    return $html;
    }

    function text_html($name, $atrb='') {
    return '<input type="text" name="'.$name.'" '.$atrb.' value="'.$GLOBALS["$name"].'">';
    }

    $keyword = '';
    $color = array("赤"=>'',"黒"=>'',"白"=>'',"黄"=>'',"青"=>'',"緑"=>'');
    if (!empty($_POST["color"]))
    foreach ($_POST["color"] as $c)
    if (array_key_exists($c, $color))
    $color["$c"] = " checked";

    if (!empty($_POST["keyword"]))
    $keyword = htmlentities($_POST["keyword"]);

    ?>
    <html><head>
    <script language="javascript">
    <!--
    function rekw(self, radio) {
    var keyword = document.search.keyword.value;
    //var checks = document.search.elements[self.name];
    var checks = document.getElementsByName(self.name);
    for (var i=0;i < checks.length; i++){
    keyword = keyword.replace(' '+checks[i].value, '');
    if (radio && (checks[i] != self))
    checks[i].checked = false;
    }

    for (var i=0;i < checks.length; i++)
    if (checks[i].checked)
    keyword += ' '+checks[i].value;
    document.search.keyword.value = keyword;
    }
    // -->
    </script>
    </head>

    <body>
    <form name="search" class="search" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
    <?php echo text_html("keyword", 'id="form" maxlength="30"') ?>
    <input type="button" id="hogehoge" value="検索" onclick="document.search.submit()">
    <p><?php echo checkbox_html("color", $color) ?></p>
    <p><?php echo radio_html("radio", $color) ?></p>
    <hr color="#afeeee" width="300" size="10" style="float: left;" /><br />
    <p><?php var_dump($_POST); ?></p>
    </form>
    </body></html>
    既に解決済みですが参考までに。
    >チェックボックスがcheckedになっていたら、任意の検索キーワードを追加
    チェックボックスの状態によって検索キーワードに文字を追加するのであればJavaScriptで実装した方が操作性がいいように思います。
    またチェックボックスの場合複数選択が可能なので複数選択ができた方がいいのかラジオボタンのように常に単一の方いいのかで多少異なってきます。
    <input type="checkbox">でname="color[]"のようにすることで配列として受け取ることができます。name="color"の場合は複数選択されていても最後に選択
    したもののみが返るようです。

    checkbox_html、radio_html、text_htmlはphpで処理してhtmlを生成しています。自由度は低下しますがいちいち書くのが手間なもので。

    メインの処理はJavaScriptのrekwです。最初の引数はthisです。それ意外では正しく動きません。
    次の引数はtrue/falseです。チェックボックスの場合にしか機能しませんがtrueの場合、ラジオボックスのように一つだけ選択にします。
    falseなら複数選択です。
    処理は最初のforでチェックボックスで付加された色をreplaceを使って全て取ります。
    次のforでcheckedのもののvalue(色)を付加しています。
    色々操作すると粗が見えてきますが。(__;

    ラジオボタンは操作できますが処理していないため変な感じになります。
  • id:cafe-beret
    tobeoscontinueさん

    本当にいつもありがとうございます。

    自分のコードは、ここには書ききれないほど長いのですが、ムダのないコードというのは本当に美しいのですね。

    自分はプログラマーというのも憚れるようなサンデープログラマーなので、本当にいつも勉強になります。
    まだすべて自分のソースに適用できてませんが、少しずつ動きを理解したいと思います。

    今後共よろしくお願い致します。

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

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

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

回答リクエストを送信したユーザーはいません