質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

FORMで入力した内容を配列にして受け渡す方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 550

ej-ack

score 6

前提・実現したいこと

初めて質問させていただきます。書き方不十分だったら申し訳ございません。
教えていただけたら補足いたします。

<やりたいこと>
phpでデータベース(DB2)にODBCで接続してSQLで得た結果を表示→
表示項目(商品コード・FLG1・FLG2)のうちFLG1・FLG2の内容をfromで書き換えして結果をデータベースに戻したい。
*FLG1・FLG2は書き換えずそのままの場合もある
<現状>
a.phpでSQLの結果を表示。チェックボックスをつける。チェックした値をb.phpに受け渡し。
input type="checkbox" name="chk[]" value="$ROW[0]">$ROW[0]

b.phpで受け取った値をSQLの条件に入れて絞った状態で表示、変更したい項目をinput type="text"で書き換え可能にする 。
(FLG1・FLG2には1かブランクが入っています)
a.phpからのチェックボックスの受け取りはうまくいってます。
$checkbox = $_REQUEST["chk"];

商品コード・FLG1・FLG2の内容をひとまとめ(配列)にして
c.phpに受け渡して uapdate でデータベース書き換える。
この
b.phpからc.phpへの受けわたしがうまくいかないです。
b.phpは以下の通りです。
ご教示いただきますようお願い致します。

該当のソースコード

b.php
<?php
$checkbox = $_REQUEST["chk"];
?>

<?php
// ODBC接続パラメータ
$DATA_SOURCE = "odbc:DB2" ;
$USERNAME    = "***" ;
$PASSWD      = "***" ;
// DBの接続
$DBH = new PDO("$DATA_SOURCE", "$USERNAME", "$PASSWD" );
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// レコードの取得
 $SQL = " select PRCD,FLGS,FLGL".
    " from PRI".
    " where PRCD in('$checkbox[0]','$checkbox[1]','$checkbox[2]','$checkbox[3]','$checkbox[4]')".
    " order by PRCD";


$STH = $DBH->prepare($SQL);
$STH->execute();

print"<form action="c.php" method="post">";

print"<table border="1" cellspacing="1" width="750">";
print"<tr><th>商品コード</th><th>FLG1</th><th>FLG2</th></tr>";
$count=0;
while ($ROW = $STH->fetch(PDO::FETCH_NUM)) {
print"<tr><td>$ROW[0]&nbsp;</td>";

print "<td><input type="text" name="flgs" value="$ROW[1]"></td>";
print "<td><input type="text" name="flgl" value="$ROW[2]"></td>";


//代入
$a[$count]=array($ROW[0],$ROW[1],$ROW[2]);


}
 ++$count;

print"</table>";
print "<input type="submit" value=" 実 行 ">";
   print "<input type="hidden" name="a" value="$a">";

print "</form>"; 

  // DB接続の終了
unset($DBH) ;
?>
</from>
</table>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2019/10/23 13:57

    [DB2]タグを追加できると https://teratail.com/tags/DB2 に載るので同じデータベースで調べる助けになります。

    キャンセル

  • ej-ack

    2019/10/23 14:45

    m.ts10806 様
    ご指摘ありがとうございます。
    やりたいことはFORMに入力された複数項目の値を配列にいれて次のphpファイルに受け渡したいのでこのタイトルにしました。
    うまくタイトルにまとめられずすみません。

    キャンセル

  • ej-ack

    2019/10/23 14:47

    Orlofsky 様
    色々教えて頂きありがとうございます。タグ追加しました。

    キャンセル

回答 1

checkベストアンサー

+1

入力システムは

  • 入力ページ
  • 確認ページ
  • 修正・再入力ページ
  • 登録ページ
  • 登録完了ページ

の流れで処理をします。
その際、確認ページはインタフェースとしては省略できますが
再入力ページと確認ページは機能を共有してはいけません。

本件ですとおそらくaで入力してbに飛ぶという流れだと
bが確認ページになります。
したがってbでは再入力してはいけません。
要件が不足もしくはエラーの際は別途ページcに飛んで再入力させてください

sample

ざっと流れだけ

<?PHP
session_start();
$chk=filter_input(INPUT_GET,"chk",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
if(is_null($chk) and isset($_SESSION["chk"])){
  $chk=$_SESSION["chk"];
}
$action=filter_input(INPUT_GET,"action");
if(is_null($chk)){
print <<<eof
<form method="get">
<input type="hidden" name="action" value="confirm">
<label><input type="checkbox" name="chk[0]" value="A">A</label>
<label><input type="checkbox" name="chk[1]" value="B">B</label>
<label><input type="checkbox" name="chk[2]" value="C">C</label>
<input type="submit" value="send">
</form>
eof;
}elseif($action=="confirm"){
  $_SESSION["chk"]=$chk;
  $h_chk=htmlspecialchars(implode(",",$chk));
print <<<eof
<form method="get">
<input type="hidden" name="action" value="modify">
<div>chk:{$h_chk}</div>
<input type="submit" value="send">
<input type="submit" name="action" value="change">
</form>
eof;
}elseif($action=="change"){
  $checked=array_fill(0,3,"");
  foreach(array_keys($_SESSION["chk"]) as $val){
    $checked[$val]=" checked";
  }
  $_SESSION["chk"]=null;

print <<<eof
<form method="get">
<input type="hidden" name="action" value="confirm">
<label><input type="checkbox" name="chk[0]" value="A"{$checked[0]}>A</label>
<label><input type="checkbox" name="chk[1]" value="B"{$checked[1]}>B</label>
<label><input type="checkbox" name="chk[2]" value="C"{$checked[2]}>C</label>
<input type="submit" value="send">
</form>
eof;
}elseif($action=="modify"){
  /* SESSIONを利用して更新処理 */
  header('Location:'.$_SERVER["SCRIPT_NAME"].'?action=complete');
  exit;
}elseif($action=="complete"){
  $_SESSION["chk"]=null;
  print<<<eof
更新しました<br>
[ <a href="{$_SERVER["SCRIPT_NAME"]}">戻る</a>  ]
eof;
}else{
  $_SESSION["chk"]=null;
print<<<eof
不正処理<br>
[ <a href="{$_SERVER["SCRIPT_NAME"]}">戻る</a>  ]
eof;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/23 18:54

    yambejp様
    早速のご回答ありがとうございました。
    気づくのがおくれてしまい遅くなってすみません。

    aで入力対象をしぼり、bで入力、cでuodateしようと思っています。
    aをなくしてbの画面に全商品データを表示させ、修正したものだけをcに受け渡す方法だと入力が一回なので大丈夫でしょうか。その際、全データ中のどれを修正したか判別する方法ってありますか。
    修正したレコードの商品コード、FLG1、FLG2をまとめてcに受け渡したいです。
    修正レコードは複数行あります。
    いい方法があればご教示のほどよろしくお願い致します。

    キャンセル

  • 2019/10/23 19:33

    確認、修正画面がある更新の流れを書いておきました

    キャンセル

  • 2019/10/23 20:19

    yambejp様
    早速にsampleコードありがとうございます!こんな高度なソースを書いたことがなくてとても参考になります!
    array_fillがまとめて配列に入れる部分ですね。初めて知りました。今から一つづつ読み解いていきます。少し時間かかりそうですのでとりあえずお礼まで。

    キャンセル

  • 2019/10/24 18:51

    yambejp様
    いただいたsampleソースを見ながら自分のソースにあてはめてみました。
    SQL結果を表示させてそこにチェックボックスをつけチェックをつけた値のみとることができました。まだ完成ではありませんががんばれそうです。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る