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

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

ただいまの
回答率

90.03%

PHPで動的に生成されたテキストボックスの値をPOSTしたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,240

masarusan24

score 47

前提・実現したいこと

【前提】
PHP(5.1.6)で受注DBの情報を参照・更新する機能を持ったWEBシステムを作っています。  

  • phpがモデルとして起動し内部的にviewを呼び出します。
  • mainFormに検索条件を入れて「検索」ボタンを押すと条件に合わせたクエリを発行し、結果を表にして表示します。
  • リストの各行にテキストボックスを配置し、隣に「更新」ボタンを配置します。
     ※テキストボックスにはデフォルトで0か1が入っています。

【実現したいこと】
ボックスの値を変更して「更新」ボタンを押すと、入力されている数値をPOSTして変更された数値にupdateするクエリを発行する。

発生している問題

リストが複数件ヒットする場合にそれぞれの行に対応した値をPOSTする方法ですが、下記のようにリストの各行ごとにform要素で括りユニークなIDを付与してやってupdate.phpにPOSTする方法がよいでしょうか。

いろいろ調べてみましたが一般的な方法が見つからず、よい方法がありましたら教えていただきたく、質問させていただきます。
よろしくお願いいたします。

追記(3/7)

せっかくなので、勉強がてら未経験のajaxでの実装を試みています。
下記に追記した関数でボタンのクリックイベントを捕まえるところまではうまくいきました。

ですが、これだとリストが複数行あった場合に最終行のボタンにしか反応してくれません。
関数を行数分生成するというのもなんか違う気がしますし、うまい方法がありましたらお知恵をいただけるとありがたいです。

ソースコード

<?
//index.php
define('TOP', '../../../');
require_once(TOP . "lib/common.php");
$session = fnc_session_check();

//mainFormに入力された検索条件いろいろ
$search = $_REQUEST['search'];
$hoge= $_REQUEST['hoge'];
$fuga= $_REQUEST['fuga'];
//中略

//クエリ生成
$list_query = "select col01,col02 from table where ".
(($search== ''      || $search== null      ) ? "" : " and col01 like ".$search)
//中略
;

//クエリ実行して結果表示させる
//結果は$dataに格納
require_once(TOP . "lib/data/search.php");
<!-- index.tpl -->
<div class="pankuzu">情報管理します</div>

<div class="main">
<form name="mainForm" id="mainForm" method="get" action="./index.php">
<div id="search_table" >
<table class="commontable">
<caption>■検索条件</caption>
<tr>
  <th>検索条件いろいろ</th>
  <td>
    <input type="text" class="base" name="search" id="search" value="<? $params['search'];?>" />
  </td>
</tr>
</table>
<div class="button">
  <!-- ボタンを押すと検索結果を表示 -->
  <input type="button" value="検索" onClick="fnc_search_check();" class="btn_big">
</div>

<table>
<caption>
■検索結果
</caption>
<tr>
  <!-- ヘッダ -->
  <th>表示項目いろいろ</th>
  <th>更新対象フラグ</th>
  <th>ボタン</th>
</tr>
  <!-- リスト -->
<? foreach($list as $data){ ?>
<tr>
  <td><? $data['col01']?></td> <!-- 項目1 -->
  <!-- 問題の箇所ここから -->
  <td>
    <!-- formのidを行数に応じて命名(subform1,subform2...)-->
    <form name="subform<? $data['rownum']?>" id="subform<? $data['rownum']?>" method="post" action="./update.php">
    <input type="text" maxlength=1 id="<? $data['col01']?>" value="<? $data['col02']?>">
  </td>
  <td>
    <input type="button" value="フラグ更新" >
  </td>
  </form>
  <!-- 問題の箇所ここまで -->
<? } else { ?>
該当データはありません。<br/>
<? } ?>
</table>
<div id="result"></div>

<script type="text/javascript">
<!--
  $("#button<? $data['rownum']?>").click(function() {

      // 操作対象のフォーム要素を取得
      var $form = $(this);

      // 送信ボタンを取得
      // (後で使う: 二重送信を防止する。)
      var $button = $form.find('button');

      // 送信
      $.ajax({
          url: $form.attr('action'),
          type: 'POST',
          data: $form.serialize(),
          timeout: 10000,  // 単位はミリ秒

          // 送信前
          beforeSend: function(xhr, settings) {
              // ボタンを無効化し、二重送信を防止
              $button.attr('disabled', true);
            },
            // 応答後
            complete: function(xhr, textStatus) {
              // ボタンを有効化し、再送信を許可
              $button.attr('disabled', false);
            },

            // 通信成功時の処理
            success: function(result, textStatus, xhr) {
              // テキスト表示
              $('#result').text('OK');
            },

            // 通信失敗時の処理
            error: function(xhr, textStatus, error) {}
          });
        });
});
-->
</script>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

check解決した方法

0

しばらく放置してしてしまいましたが、自己解決しました。
結局ajaxでPOSTするやり方ではなく、下記のように実装しました。
※POSTにこだわる必要もなかったので最終的にGETで渡してます

<?
//index.php(変更なし)
define('TOP', '../../../');
require_once(TOP . "lib/common.php");
$session = fnc_session_check();

//mainFormに入力された検索条件いろいろ
$search = $_REQUEST['search'];
$hoge= $_REQUEST['hoge'];
$fuga= $_REQUEST['fuga'];
//中略

//クエリ生成
$list_query = "select col01,col02 from table where ".
(($search== ''      || $search== null      ) ? "" : " and col01 like ".$search)
//中略
;

//クエリ実行して結果表示させる
//結果は$dataに格納
require_once(TOP . "lib/data/search.php");
<!-- index.tpl -->
<div class="pankuzu">情報管理します</div>

<div class="main">
<form name="mainForm" id="mainForm" method="get" action="./index.php">
<div id="search_table" >
<table class="commontable">
<caption>■検索条件</caption>
<tr>
  <th>検索条件いろいろ</th>
  <td>
    <input type="text" class="base" name="search" id="search" value="<? $params['search'];?>" />
  </td>
</tr>
</table>
<div class="button">
  <!-- ボタンを押すと検索結果を表示 -->
  <input type="button" value="検索" onClick="fnc_search_check();" class="btn_big">
</div>

<table>
<caption>
■検索結果
</caption>
<tr>
  <!-- ヘッダ -->
  <th>表示項目いろいろ</th>
  <th>更新対象フラグ</th>
  <th>ボタン</th>
</tr>
  <!-- リスト -->
<form id="update-data-form">
<? foreach($list as $data){ ?>
<tr>
  <td><? $data['col01']?></td> <!-- 項目1 -->
  <!-- 問題の箇所ここから -->
  <td>
    <!-- text欄にユニークidを発行(ここではcol01がユニークな変数)-->
    <input type="text" maxlength=1 id="<? $data['col01']?>" value="<? $data['col02']?>">
  </td>
  <td>
    <input type="button" $data['rownum'] value="フラグ更新" onClick="fnc_update('<? $data['col01']?>');">
  </td>
  <!-- 問題の箇所ここまで -->
<? } else { ?>
該当データはありません。<br/>
<? } ?>
</form>
</table>
<div id="result"></div>

<script type="text/javascript">
<!--
function fnc_update(key){
  var n = document.getElementById(key).value;
  if(n == "1" || n == "0"){
    if(confirm('更新してよろしいですか?')){
      //update.phpにパラメータを渡して更新
      window.open('<? $url;?>update.php?key='+key+'&dm_flg='+n, 'detail'+key, 'width=400, height=200, menubar=no, toolbar=no, scrollbars=yes');
      return true;
    }else {
      return false;
    }
    return true;
  }else {
    alert("半角数字の0か1を入力してください。");
    return false;
  }
}
-->
</script>

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

JavaScriptをつかってajaxでやるのが良いと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/03 11:50 編集

    回答ありがとうございます。

    liplyさんの回答のようにセッションに保存するやり方がよいのかajaxでやるのがよいのか検討してみます。
    実装する上で不明点ありましたらまたご質問させてください。

    キャンセル

  • 2016/03/07 18:43

    ajaxで実装するうえでの不明点を、投稿元の方へ追記させていただきました。

    キャンセル

-1

たぶん社内利用でしょうが、バージョンも古いのはまだしも、コードが危険すぎます。
悪意ある社員がいたら情報取り放題書き換え放題です。

質問内容ですが、DB上のデータとHTMLにレンダリングされたデータを結びつける情報を、セッションに保存するのが普通です。クライアントから入力される情報はすべて不審物と思ってください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/03 11:50 編集

    回答ありがとうございます。

    ・危険性に関して
    社内利用でアクセスも社内のみに制限、そして利用者は今のところ自分だけですが、不正入力に関しては極力注意していきたいと思います。
    具体的にいうとcol02の値をユーザから書き換え放題だから危険だよ、という解釈でよいでしょうか。

    ・バージョンに関して
    下記によると5.1.6もディストリビューションによっては独自サポートされてるようですね。
    http://blog.ircmaxell.com/2014/12/php-install-statistics.html
    それはそれで別途確認してみます。

    ・実現方法に関して
    セッションに保存するやり方がよいのかogaaaanさんの回答のようにajaxでやるのがよいのか検討してみます。
    実装する上で不明点ありましたらまたご質問させてください。

    キャンセル

  • 2016/03/04 18:10

    PHPのバージョン(5.1.6)ですが、古いけど一応安全なバージョンでもあり、脆弱性があってもセキュリティ機器で防げそうです。

    キャンセル

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

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