
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がかかったら「ありがとう」を出して、別画面に
リダイレクトしたいです。
以上の極めてシンプルなもので結構ですので、サンプルをご教示いただけませんか
No.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でわたしてみるとか。
早速のご回答ありがとうございました。
本番環境に組み込み始めているところで、実にいい感じです。
もう一つ、わからない点が出てきたのですが、
別質問ということで、こちらに新規質問を投稿しました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2419770
もしよろしかったらご教示いただけますと幸いです。
今回もずっぽりお世話になってしまいました。ありがとうございました。
No.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;
}
?>
yamabejpさん、毎度お世話になっております。
#1さんのレスにも書きましたが、HTML_QuickFormに
流れかけていたところ、質問にずばりと回答いただき
ありがとうございました。
>実際にはフローをもっとわかりやすく関数化したり
というのが、わたしはまだできず、泥臭くて非効率な長~~い
プログラムを作ってしまうわけですが(サブルーチンなる
考え方がようやく便利だとわかり始めた次元でして・・・)
さて、本題ですが、ご提示のものを早速適用してみたのですが、
もう2点ほどご教示いただけませんか。
(1) 初回表示で「回答者名が入力されていません。」が現れます。
これをかわす場合は、初回なのかどうかを切り分けるロジック
などが必要になりますでしょうか?
(2) 適当な投稿者名を入力してSUBMITすると、
「ページを表示できません」になりますが、
action="$PHP_SELF" なので、このまま実行すれば
</html>タグの枠外「insert 処理」という文言がprintされるのが
正解だと思います、なぜでしょうか・・・
もしよろしければご教示下さい。
No.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);
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 …
貴重なご助言、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpの問い合わせフォームを作っ...
-
reuterの記事をbeautiful.soup....
-
PHP8でWarning:Undefined varia...
-
composerをインストールしたい...
-
Q&Aサイトを作成していてURLの...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
SplFileObject を利用したとき...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
phpに関わる所での、form actio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
検索時の選択内容を保持する方法
-
DBの値をチェックボックスに反...
-
$_SESSIONについて教えて下さい。
-
PHPで、ボタンを押すと同じペー...
-
PHP ボタンが押されたら処理を...
-
<input type="hidden" >で配列...
-
アンケートフォームの作り方
-
入力した部分を表示させたまま...
-
画面が更新されてもチェックボ...
-
ラジオボタンをsessionで使いたい
-
チェックボックスによる検索
-
PHPで画像の渡しが上手く行きま...
-
同じページでフォームデータを...
-
POSTをボタンではなくリンク等...
-
配列をhiddenで
-
HTMLのvalue値を取得したい。
-
パラメーターを隠す
-
選んだ数字だけ繰り返す
-
PHPで画像データーのアップロー...
おすすめ情報