アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。いつもお世話になっております。
初歩的な質問かと思いますが、hiddenでのデータの受渡で、配列でのチェックボックスが上手くわたせずに悩んでおります。

if($_POST['send']){

**メール送信の処理します**
$from_addres="xxxxxx@xxxxxxx.jp";
$to_addres=$mailadd;
$make_subject="メール送信";
$message="-入力内容-
アドレス:{$mailadd}
なぜ:{$why}";
mailsend($to_addres,$from_addres,$make_subject,$message);//はぶいてますがfunction()書いています

}elseif($_POST['submit']){
**内容確認**
foreach ($_POST['why'] as $key => $why){
if($why==0){$why0="0です";}
if($why==1){$why1="1です";}
if($why==2){$why2="2です";}
}

**入力内容表示**

<form method="post" action="<?=$_SERVER['../SCRIPT_NAME']?>">
<input type="hidden" name="why[]" value="<?php echo $_POST['why'];?>">
<input type="submit" name="return" value="修正">
</form>

<form method="post" action="<?=$_SERVER['../SCRIPT_NAME']?>">
<input type="hidden" name="why[]" value="<?php echo $_POST['why'];?>">
<input type="submit" name="send" value="送信">
</form>

}else{
<form method="post" action="<?=$_SERVER['../SCRIPT_NAME']?>">
<input name="why[]" type="checkbox" value="0"<?if($why==0){ print " checked";}?>>0
<input name="why[]" type="checkbox" value="1"<?if($why==1){ print " checked";}?>>1
<input name="why[]" type="checkbox" value="2"<?if($why==2){ print " checked";}?>>2
<input type="submit" name="submit" value="確認画面へ">
</form>


同一ページにてif分で分岐して処理しています。
確認画面での値受け取りはできています。

その後の、送信・修正へのhiddenへの値受け渡しが上手くいきません。

結果、どう動作して欲しいかといいますと、
・returnで戻った時に、値を保持してチェックしてあったチェックボックスに"checked"をつけたい
・sendへの値の受け渡し
・メールをとばすので、その本文への値の入れ方
foreach ($_POST['why'] as $key => $why){
if($why==0){$why0="0です";}
if($why==1){$why1="1です";}
if($why==2){$why2="2です";}
}
をメールをとばすところでも記述して$why0 $why1 $why2をprintすれば良いのでしょうか?

ググってみたり、色々検索してみたのですが、調べ方がよくないので見つからず、質問をさせていただきました。
よろしくお願いします。

A 回答 (3件)

ゴメン、質問内容がうまく把握できない上にソースが良く解んなかったYO。



質問内容と違うかもしれないけど、基本から行ってみましょうか。
とりあえずチェックボックスに入れた値のやり取りって事でOK?

まず、HTML側で以下のようなチェックボックスがあるとします。

<input type="checkbox" name="check[]" value="value1">

上記をチェックして送信すると、受け取ったPHPの$_POSTにはこんなデータが入ります。

$_POST['check'] = array( 'value1' );

上の例は少し解り難いのでこう書いた方が解りやすいかな。

$_POST['check'][] = 'value1';

入っているデータは同じなんですよね。配列に入れる時にはこう言う書き方もあるよと。
[]って言うのは、配列にプッシュバックする事と同じなんです。
だから以下のような書き方をして全てチェックして送信するとこんな感じになる。

※HTML側のフォーム
<input type="checkbox" name="check[]" value="value1">
<input type="checkbox" name="check[]" value="value2">
<input type="checkbox" name="check[]" value="value3">

※PHPの受け側
$_POST['check'] = array( 'value1', 'value2', 'value3' );

※別の書き方をすると
$_POST['check'][] = 'value1';
$_POST['check'][] = 'value2';
$_POST['check'][] = 'value3';

さて、ここでややこしくなる。
全てチェックしてあれば良いんだけど、例えば最初と最後だけチェックして送信すると、チェックされてない値は$_POSTに入ってこなくなるとです。

※最初と最期だけチェックして送信された値
$_POST['check'] = array( 'value1', 'value3' );

$_POST['check'][] = 'value1';
$_POST['check'][] = 'value2';
↑チェックから外れたvalue2がデータから無視される

コレだとchecked指定を使って最初からチェックさせよう、なんて小細工を弄するには不向きなんですよね。
だから普通は[]の中に識別子を入れて区別できるように仕向けます。
具体的には以下のような感じ。

※HTML側のフォーム
<input type="checkbox" name="check[0]" value="value1">
<input type="checkbox" name="check[1]" value="value2"> ←コレだけチェックせずに送信
<input type="checkbox" name="check[2]" value="value3">

※受け側のデータ
$_POST['check'] = array( 0 => 'value1', 2 => 'value3' );

$_POST['check'][0] = 'value1';
$_POST['check'][2] = 'value2';

解りますかね?
check[] を check[識別子] とした事で、例えチェックされなくても必ず識別子のキーに値が入る事になるんです。
後はHTML側で「指定の識別子に値が入っているかどうか」を判断すればよろしい訳で。
具体的には isset を使います。

※checked指定を入れたHTML
<input type="checkbox" name="check[0]" value="value1" <?php if ( isset( $_POST['check'][0] ) ) echo 'checked'; ?>>
<input type="checkbox" name="check[1]" value="value2" <?php if ( isset( $_POST['check'][1] ) ) echo 'checked'; ?>>
<input type="checkbox" name="check[2]" value="value3" <?php if ( isset( $_POST['check'][2] ) ) echo 'checked'; ?>>

コレで、チェックしてあった物にはchecked指定がくっ付く訳です。
    • good
    • 0

書き切れなかったんだぜ?


こう言う回答の仕方アリなのかなこれ…
No1の続きですYO。

続いてないよう確認部分。
さっきはtype="checkbox"で書きましたがtype="hidden"でも基本は同じ。
こちらは「チェックがあった分だけhiddenを書く」と言う方法を使います。
$_POST['check']に入るのはチェックのあったデータだけなんだから、この中身全部書けばチェックしなかった分は除かれると言う寸法です。
foreachを使いましょう。

foreash ( $_POST['check'] as $key => $val )
{
  printf( '<input type="hidden" name="check[%s]" value="%s">', $key, $val );
}

流石に何やってるかは解るよね?
こうすればチェックがあった分だけhiddenフォームが書ける訳です。
$_POSTデータも先ほどと同じ物が入ります。
さっきと同じようにキーにする識別氏も中身も同じ物を入れているから当然です。

コレはメールに入れる本文も同じ。
チェックした値全てを本文に書きたい場合は、foreachで取得したデータを全て書き出してやれば良いのです。

……ああ、そうそう忘れてた。
全ての値にチェックを入れずに送信されると$_POST['check']その物が存在しなくなるから、foreachとかで読み取る時に存在しない変数を見てるよって事でNoticeErrorが吐かれます。
回避する為にはforeachを行う前に isset( $_POST['check'] ) で中身があるか判断して、ある時だけforeachをかけるように修正してあげてください。

以上、長々と失礼致しました。

この回答への補足

すごく丁寧に書いて頂き、ありがとうございます。
とてもわかりやすいです!
短いよく説明出来ていない文章なのに、知りたいことを回答していただいています!

checkboxは使ったことが無かったので、悪戦苦闘していました。
識別子を用いると、checkedをつける時に便利なんですね、勉強になりました。
やりたいことが実現に近づきました!
ありがとうございます。

書いていただいたもので、早速試してみました。
が、
foreach ( $_POST['check'] as $key => $val )
{
  printf( '<input type="hidden" name="check[%s]" value="%s">', $key, $val );
}
このprintfの行で構文エラー?
Parse error: syntax error, unexpected '@' in
と出ます。
なででしょうか?

あと、isset( $_POST['check']に値があったらというのは
if(isset( $_POST['check'] )){
}
で書き方はあってますか?
issetも初めて使いました。

よろしくお願いします。

補足日時:2011/03/07 16:54
    • good
    • 0

補足への回答はコレで良いのだろうか…A No2の補足へのレスです。



> 書いていただいたもので、早速試してみました。
> が、
> foreach ( $_POST['check'] as $key => $val )
> {
>   printf( '<input type="hidden" name="check[%s]" value="%s">', $key, $val );
> }
> このprintfの行で構文エラー?
> Parse error: syntax error, unexpected '@' in
> と出ます。
> なででしょうか?
見たとこ異常は無い様に見受けます。
syntax errorって言うのはPHPの構文が違うぞーと言う時に出るエラーです。
よく半角スペースやカッコ等を全角で入れてたり、カッコを閉じ忘れていたりする時に出るエラーです。
で、エラー文言を見ると「ヘンな所に[@]があるんですけど何ぞこれ?」と言ってるように見えます。
本当にココのprintfが出してるエラーですか?
ブロックレベルで間違っていると、ココよりずっと後に変な構文があったりするケースがあります。
もう一度見直してみてください。

> あと、isset( $_POST['check']に値があったらというのは
> if(isset( $_POST['check'] )){
> }
> で書き方はあってますか?
大丈夫、合ってます。
PHPの配列を扱うならissetは避けて通れない道だと個人的に思っています。
マニュアルの例を見つつ経験を積んで行きましょう。

……やがて$_POSTみたいなグローバル変数やprintfを安易にあちこちで使ったりするのに嫌悪感を覚え始めたら一人前ですw
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!