プロが教えるわが家の防犯対策術!

PHP4.4.4+MySQL4.0.26

PHPの入門書に、form.html から、update文を含むPHPにPOSTする
掲示板サンプルがあるのですが、これにある入力チェックサンプルですと、
別画面に遷移して(例えば投稿者名は)「全角10文字以下にして」、とか
メッセージを表示します。そうではなく、

値を入力
  ↓
登録ボタン押下
  ↓問題なしなら     ↓問題あるなら
INSERT文を実行    問題ある【フォームの脇に】「10文字以下で」と表示

のように1つのPHPファイルで全てを済ませたいのですが、可能でしょうか。

下記サンプルで、update.phpのところを<?= $PHP_SELF ?>にして、

<html>
<body>
<form method="post" action="update.php">
投稿者名<input type="text" name="name" value="">
<input type="submit" name="reg" value="登録">
</form>
</body>
</html>


投稿者名の脇に
if (strlen($name) == 0) {
  $errmsg .= "回答者名が入力されていません。<br>";
}
print $errmsg;

みたいなものを仕込めばよさそうですが、

(1)
これを登録ボタン押下時だけ動作させなければだめですよね?
(初めに表示するときにチェックにHITしてしまうでしょうから)
それをどうしたらいいかわかりません。

(2)
↑が克服できたとしても、問題がなければSQLでINSERT or UPDATEを
かけなければならないですが、POST先が$PHP_SELFだと、永久にUPDATEが
かからず、入力チェックばかりが無限ループしてしまうと思うのですけど。

(3)
それと、Insert ot Updateがかかったら「ありがとう」を出して、別画面に
リダイレクトしたいです。

以上の極めてシンプルなもので結構ですので、サンプルをご教示いただけませんか

A 回答 (3件)

あ~・・・


いい加減な回答してしまいましたね。
すみませんでした。

submitに名前がついていたのでそれで判断しては
どうでしょうか?

<?PHP

$errFlg=false;
if ($_POST["reg"]=="") $errFlg=true;

if(!$errFlg){
if($_POST["name"]==""){
$errFlg=true;
$errStr["name"]="<span style='color:red'>回答者名が入力されていません。</span>";
}
if(strlen($_POST["name"])>20){
$errFlg=true;
$errStr["name"]="<span style='color:red'>10文字以下にしてください</span>";
}
}

if($errFlg){
print <<<eof
<html>
<body>
<form method="post" action="{$_SERVER["PHP_SELF"]}">
投稿者名<input type="text" name="name" value="{$_POST["name"]}">{$errStr["name"]}<br>
<input type="submit" name="reg" value="登録">
</form>
</body>
</html>
eof;
}else{
print <<<eof
insert 処理
eof;
}
phpinfo();
?>

「ページを表示できません」・・・ってのは
ちょっとわかりません。
ねんのため$_SERVERでわたしてみるとか。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
本番環境に組み込み始めているところで、実にいい感じです。

もう一つ、わからない点が出てきたのですが、
別質問ということで、こちらに新規質問を投稿しました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2419770

もしよろしかったらご教示いただけますと幸いです。

今回もずっぽりお世話になってしまいました。ありがとうございました。

お礼日時:2006/09/20 16:51

こんなかんじでどうですか?


実際にはフローをもっとわかりやすく関数化したり
してください

<?PHP
$errFlg=false;
if(is_array($_POST)){
if($_POST["name"]==""){
$errFlg=true;
$errStr["name"]="<span style='color:red'>回答者名が入力されていません。</span>";
}
if(strlen($_POST["name"])>20){
$errFlg=true;
$errStr["name"]="<span style='color:red'>10文字以下にしてください</span>";
}
}

if($errFlg or !is_array($_POST)){
print <<<eof
<html>
<body>
<form method="post" action="$PHP_SELF">
投稿者名<input type="text" name="name" value="{$_POST["name"]}">{$errStr["name"]}<br>
<input type="submit" value="登録">
</form>
</body>
</html>
eof;
}else{
print <<<eof
insert 処理
eof;
}
?>
    • good
    • 0
この回答へのお礼

yamabejpさん、毎度お世話になっております。

#1さんのレスにも書きましたが、HTML_QuickFormに
流れかけていたところ、質問にずばりと回答いただき
ありがとうございました。

>実際にはフローをもっとわかりやすく関数化したり

というのが、わたしはまだできず、泥臭くて非効率な長~~い
プログラムを作ってしまうわけですが(サブルーチンなる
考え方がようやく便利だとわかり始めた次元でして・・・)

さて、本題ですが、ご提示のものを早速適用してみたのですが、
もう2点ほどご教示いただけませんか。

(1) 初回表示で「回答者名が入力されていません。」が現れます。
これをかわす場合は、初回なのかどうかを切り分けるロジック
などが必要になりますでしょうか?

(2) 適当な投稿者名を入力してSUBMITすると、
「ページを表示できません」になりますが、
action="$PHP_SELF" なので、このまま実行すれば
</html>タグの枠外「insert 処理」という文言がprintされるのが
正解だと思います、なぜでしょうか・・・

もしよろしければご教示下さい。

お礼日時:2006/09/20 15:43

例えば、PEAR::HTML_QuickFormなら1画面での処理になりますね。


<? // 適当に書いてます
$form = new HTML_QuickForm();
$form->addElement('text', 'name', '氏名');
$form->addRule('name', '氏名を入力して下さい', 'required');

// POSTされた時に入力値検証
if ($form->validate()) {
 if ($form->_frozen) {
  // DB処理
  $data = $form->getSubmitValues();
  $db->insert($data);
  header("Location: ok.php");
  exit;
 }

 // 確認画面
 $form->freeze();
}

// error
print_r($form->_errors);
    • good
    • 0
この回答へのお礼

tany180sxさん、レスありがとうございました。

HTML_QuickForm、この2時間くらい調べてみました。
(PEARのインストールでちょっとつっかかりましたが)

すごい興味をもちました。たまたまみつけた入門サイトの
http://www.okushin.co.jp/information/tanuki03/in …
このサンプル↓みて、惚れましたね。
http://www.okushin.co.jp/information/tanuki03/ta …

まさに、私の要望どおりで、しかも効率もよさそうです。

ただ残念なのは、わたしには少々敷居が高いかもしれません。
「クラス」とか、オブジェクト指向っぽい話がよく出てきますが、
ただでさえ元々チンプンカンプンなのに、少し難しい話に
飛躍しすぎるといいますか・・

あとは、この本に少々解説も載っているようなので、買って勉強して、
自分なりのテンプレートを作ってみるべきかといったところです。
http://www.amazon.co.jp/gp/product/4798109592/re …

貴重なご助言、ありがとうございました。

お礼日時:2006/09/20 15:28

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