みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

1つのphpファイルで、入力フォーム、チェック、Insertまで全て済ませられませんか

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がかかったら「ありがとう」を出して、別画面に
リダイレクトしたいです。

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

投稿日時 - 2006-09-20 11:01:39

QNo.2419133

暇なときに回答ください

質問者が選んだベストアンサー

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

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でわたしてみるとか。

投稿日時 - 2006-09-20 16:07:12

お礼

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

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

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

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

投稿日時 - 2006-09-20 16:51:22

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

こんなかんじでどうですか?
実際にはフローをもっとわかりやすく関数化したり
してください

<?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;
}
?>

投稿日時 - 2006-09-20 15:02:53

お礼

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

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

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

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

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

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

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

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

投稿日時 - 2006-09-20 15:43:56

ANo.1

例えば、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);

投稿日時 - 2006-09-20 11:40:57

お礼

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

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

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

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

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

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

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

投稿日時 - 2006-09-20 15:28:34

あなたにオススメの質問