プロが教える店舗&オフィスのセキュリティ対策術

PHPを使用したWebプログラミングを始めました。
基本的な事かもしれませんが、ご教示頂けますと幸いです。

テキストボックスに文字列を入力してサブミットし、サーバサイドの入力チェック処理で
エラーとなった場合は入力ページに戻る、というのは一般的なWebサイトの仕組みかと思います。

上記入力ページで、JavascriptでDOMを操作してテキストボックスを一つ追加したとします。

2つのテキストボックスに文字列を入力してサブミットし、サーバサイドの入力チェック処理で
エラーとなって入力ページに戻った場合、入力時にDOM操作で増やしたテキストボックスは
消えてしまっているのですが、そのテキストボックスと値はどのように再現すればいいのでしょうか?

A 回答 (8件)

そもそもいきなりサブミットするのはよくありません。


まず、クライアントサイドでチェック+もしDB参照がいるならAjaxで問い合わせをして、それでOKならサブミット、NGならそのページのままでエラーを表示します。
そうすればサブミット時にNGになるのは、故意に無理矢理不正な値を送信した場合のみですので、単にエラーページを表示するだけでよくなるのです。
ページの遷移やはなるべく抑えなければなりません。抑えれば抑えるほど構造が簡単になります。
    • good
    • 0
この回答へのお礼

ご教示頂きありがとうございました。
確かにクライアント側できっちり入力チェックをしていれば、サーバ側のチェックは故意の不正送信という事になり、不正送信ならば入力画面に戻す必要がないですね。
つまりそもそも質問内容にある処理は必要ないと。

有識者の方々に貴重なご意見を頂けて本当に勉強になります、ありがとうございます。

お礼日時:2014/06/26 12:15

No.6です。

ちょっと訂正

concrete5はフレームワークというより、WordPressのようなCMSソフトといったほうが正しいですね。
    • good
    • 0
この回答へのお礼

concrete5ですか、ちょっと調べてみます。情報ありがとうございました。

お礼日時:2014/06/26 09:22

>>この問題を回避できるようなPHPフレームワークをご存知でしたら、ぜひご紹介下さい。



うーん、そういうDOMの問題を解決しようというのじゃあなく、「楽してWebサイトを作りたい、PHPやJavascriptをできるだけいじりたくない」という基準で、私は、Concrete5っていうフレームワークを選んで使っています。
このフレームワークを使い、カスタマイズして企業で商用利用されているところもあるようです。
    • good
    • 0

バリデーションチェックをajaxで行う方法も一案かな思います。



ページ遷移しなくて済むので、動的に追加したパーツも消えません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
確かにajaxはページ遷移もなく、UI、UXの観点からも好ましいかもしれませんね。ajax勉強します。

お礼日時:2014/06/25 23:15

>>タグに修正が入った際は両方のソースに手を入れないといけなくなるのでメンテナンス性は下がると思うのですが、DOM操作を伴うWebサイトでは致し方ない事なのでしょうか?



メンテナンス低下は、仕方ないでしょう。それを問題とする方たちは、その苦労が減るようなフレームワークを探したり、ソースの自動生成の仕組みを考えたりするのだと思います。
    • good
    • 0
この回答へのお礼

重ねてのご回答、誠にありがとうございます。
私も技術者のはしくれとして、可能な限りメンテナンス性の低下は避けた方がいいと考えています。それで今まで苦労してきましたので。。。
この問題を回避できるようなPHPフレームワークをご存知でしたら、ぜひご紹介下さい。

お礼日時:2014/06/25 23:13

<?php


$list = '';
$hoge = isset ($_POST['@hoge']) ? $_POST['@hoge']: array ('', '');

foreach ($hoge as $h)
 $list .= '<li><input type="text" name="@hoge[]" value="'.$h.'">';

?>
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<form action="#" method="post" id="piyo">
 <ol id="fuga">
  <?php echo $list; ?>
 </ol>
 <input type="button" value="add"> /
 <input type="submit" value="submit">
</form>

<script>

function setValue (e) {
 e.value = this;
}


function addList (f) {
 var ol = f.querySelector ('#fuga');
 var li = ol.querySelector ('li').cloneNode (true);
 
 Array.prototype.forEach.call (
  li.querySelectorAll ('input'), setValue, '');
 
 ol.appendChild (li);
}


function handle (event) {
 var e = event.target;

 if ('button' === e.type)
  if ('add' === e.value)
   addList (e.form);
}


document.addEventListener ('click', handle, false);
</script>
    • good
    • 0
この回答へのお礼

具体的なコードのご提示ありがとうございます。
サーバ側でタグを生成しておいて、HTMLに反映させるんですね。大変勉強になりました、ありがとうございました。

お礼日時:2014/06/25 23:08

POSTした値があればテキストボックスを表示する、というようなロジックではだめですか?



例えば下記。POSTの扱いについては省略しますので、適宜。

<?php if(isset($_POST[name''])): ?>
<input type='text' name='name' value='<?php print($_POST['name'])?>'
<?php endif; ?>
    • good
    • 0
この回答へのお礼

具体的なコードのご提示ありがとうございます。
ご提示頂いた方法ですと確かにDOM操作で追加したテキストボックスの値をサーバ側でコントロールできますね。
この場合、追加するinputタグの記述をDOM操作用のJavascript側とPOST後に表示用のPHP側の両方に持つ事になると思います。タグに修正が入った際は両方のソースに手を入れないといけなくなるのでメンテナンス性は下がると思うのですが、DOM操作を伴うWebサイトでは致し方ない事なのでしょうか?

お礼日時:2014/06/25 10:27

>>エラーとなって入力ページに戻った場合、入力時にDOM操作で増やしたテキストボックスは


消えてしまっているのですが、そのテキストボックスと値はどのように再現すればいいのでしょうか?

一般的には、サーバ側のプログラムで、戻ったときに再現できるような処理をしておいてあげることになると思えます。
たぶんJavascriptもそういう処理ができるようなロジックにしておくことになると予想します。
    • good
    • 0
この回答へのお礼

早々にご回答頂きありがとうございます。
サーバ側で入力値を保持しておくのは分かるのですが、それをJavascriptでDOMの状態を再現するのが全くイメージできないのです。
サーバ側、クライアント側で具体的な処理方法をご存知でしたらご教示頂けないでしょうか?

お礼日時:2014/06/25 00:06

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