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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

879閲覧

jQueryによるAjaxでのバリデーションを関数によって行う方法

penginer

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/04/01 04:23

編集2018/04/07 09:08

Ajaxにおける複数の関数での処理

前提・実現したいこと

現在jQueryを用いたAjaxでアンケートフォームを作成しており、
各要素に変更が加わるか最後に送信する前にバリデーションチェックを行う方式をとろうとしています。
これは全部回答が終わってから戻ることを避け、かつ無回答で送信することを避けるためです。

この際各要素において、真偽値を返してエラーメッセージをechoする関数(Aとします)と
最終的な解答をechoする関数(Bとします)を用意し、
Aがtrueを返せばBが動くという方式で設計します。
尚、AとBにおいてechoする場所は異なります。

発生している問題・エラーメッセージ

この場合どのように2つの関数に同じ値を引数に入れるかが分からないです。
また、関数が依存しあっているため可能な限り同じファイルに1つにしてまとめたいです。
(上に書いた前提はまだ変えても問題ないです)
またそもそも調べてもどのような仕様にすべきかわからない状況です。

  • 2018/4/7追記

その後euledge様の解答を参考に修正した所、jsonは値を生成しましたが出力が全く成されず、
バリデーションを行うPHPの関数はHTMLで値を入れているにもかかわらず値が入っていないと出力しております。
また、json自体はpタグの閉じタグでないものは全て表示されず、いくつかの値はそもそも表示すらされませんでした(空文字のままです)

尚、Chromeの検証やNetBeansを見る限り文法上のエラーは無いようです。

該当のソースコード

以下は全て仮のものです。また、

js

1$(function (){ 2 var b=[]; 3 $("[name='b[]']:checked").each(function(){ 4 b.push(this.value); 5 }); 6 var data={a:$("[name=a]").val(),b:b,c:$("[name=c]").val(),d:$("[name=d]").val(),e:$("[name=e]").val()}; 7 $(".a").change(function(){$.post("function-src.php",'json',data).done 8 (function(response){ 9 $("#a_valid").html(response.error_a); 10 $("#b_valid").html(response.error_b); 11 $("#c_valid").html(response.error_c); 12 $("#d_valid").html(response.error_d); 13 $("#e_valid").html(response.error_e);}); 14 }). 15 });

html

1 <span id="a_valid"></span> 2<p> 3 <input type="radio" name="a" value="a" id="a" class="a"><label for="a">A</label> 4 <input type="radio" name="a" value="b" id="b" class="a"><label for="b">B</label> 5 <input type="radio" name="a" value="c" id="c" class="a"><label for="c">C</label> 6 7</p> 8<!--この下にnameがbのチェックボックス(配列を用いるもの)、nameがcとdのプルダウンメニュー、nameがeのラジオボタンがあり 9これら全てにaというクラス属性があります。 10--> 11

php

1function valid_a($a) 2{ 3 4 $validation=false; 5 if (!isset($a)) { 6 $error_a = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 7 } elseif (($a != "a") && ($a != "b") && ($a != "c")) { 8 $error_a = "<p style=\"color:#ff2800;\">不正なPOSTです。</p>"; 9 }else { 10 $validation=true; 11 $error_a=""; 12 echo json_encode(compact('error_a'));; 13 return $validation; 14 } 15} 16 17function valid_a_echo($a) 18{ 19 $a_echo =""; 20$a_ans=array("a"=>"A","b"=>"B","c"=>"C"); 21 if (valid_a($a)) { 22 $a_echo = $a_ans[$a]; 23 } 24 echo json_encode(compact('a_echo')); 25} 26function valid_b($b){ 27 28 $b2 = array(/*配列の中身*/); 29 $validation=false; 30 if (!in_array($b)) { 31 $error_b = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 32 }else{ 33 for ($i = 0; $i <count($b) ; $i++) { 34 if ((intval($b[$i])<0||intval($b[$i])>count($b2)-1)&&!ctype_digit($b[$i])) { 35 $error_b = "<p style=\"color:#ff2800;\">不正なPOSTです。</p>"; 36 break; 37 } 38 } 39 if ($i == count($b) - 1) { 40 $validation=true; 41 $error_b=""; 42 } 43 } 44 echo json_encode(compact('error_b')); 45 return $validation; 46} 47 48function valid_b_echo($b) 49{ 50 $b = array(/*配列の中身*/); 51 $array=array(); 52 if (valid_b($b2)) { 53 for ($j = 0; $j <count($b) ; $j++) { 54 array_push($array,$b2[intval($b[$j])]); 55 } 56 } 57 $b_echo=implode(",",$array); 58 echo json_encode(compact('b_echo')); 59} 60 61function valid_c($c) 62{ 63 $validation=false; 64 if (!isset($c)) { 65 $error_c = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 66 } elseif ((intval($c)<0||intval($c)>10)&&!ctype_digit($c)) { 67 $error_c = "<p style=\"color:#ff2800;\">不正なPOSTです。</p>"; 68 }else { 69 $validation=true; 70 $error_c=""; 71 } 72 echo json_encode(compact('error_c')); 73 return $validation; 74} 75 76function valid_d($d) 77{ 78 $validation=false; 79 if (!isset($d)) { 80 $error_d = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 81 } elseif ((intval($d)<0||intval($d)>9)&&!ctype_digit($d)) { 82 $error_d = "<p style=\"color:#ff2800;\">不正なPOSTです。</p>"; 83 }else { 84 $validation=true; 85 $error_d=""; 86 } 87 echo json_encode(compact('error_d')); 88 return $validation; 89} 90 91function valid_d_echo($c,$d) 92{ 93 $d_echo =""; 94 if (valid_c($c)&&valid_d($d)) { 95 $d_echo = intval($c.$d); 96 } 97 echo json_encode(compact('d_echo')); 98} 99 100function valid_e($e) 101{ 102 $validation=false; 103 if (!isset($e)) { 104 $error_e = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 105 } elseif ((intval($e)<0||intval($e)>9)&&!ctype_digit($e)) { 106 $error_e = "<p style=\"color:#ff2800;\">不正なPOSTです。</p>"; 107 }else { 108 $validation=true; 109 $error_e=""; 110 } 111 echo json_encode(compact('error_e')); 112 return $validation; 113} 114 115function valid_e_echo($e) 116{ 117 $e_array = array(/*配列の中身*/); 118 $e_echo =""; 119 if (valid_e($e)) { 120 $e_echo = $e_array[intval($e)]; 121 } 122 echo json_encode(compact('e_echo')); 123} 124$a=filter_input(INPUT_POST,'a'); 125valid_a($a); 126valid_b($b); 127valid_c($c); 128valid_d($d); 129valid_e($e); 130valid_a_echo($a); 131valid_b_echo($b); 132valid_c_echo($c); 133valid_d_echo($d); 134valid_e_echo($e); 135/*valid_a_echo($a)が出力する値はvalid_a($a)の値が出力される場所ではないです。 136今回はvalid_a~valid_eまでについて質問致します。*/

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2018/04/01 17:26

PHPで何かフレームワーク使っているのであれば、追記してください
penginer

2018/04/02 04:50

特に使っていないです
guest

回答2

0

ベストアンサー

コードが長くなるのでa,b,c のみでb,cについてはvalid_b(),valid_c()の呼び出しを省略した感じで
下に例示します。

php

1function valid_a($a) 2{ 3 $error_a=""; 4 if (!isset($a)) { 5 $error_a = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 6 } elseif (($a != "a") && ($a != "b") && ($a != "c")) { 7 $error_a = "<p style=\"color:#ff2800;\">不正なPOSTです。</p>"; 8 } 9 return $error_a; 10} 11 12function valid_a_echo($a) 13{ 14 $a_echo = ""; 15 $error_a = ""; 16 $a_ans=array("a"=>"A","b"=>"B","c"=>"C"); 17 $error_message = valid_a($a); 18 if ($error_message == "") { 19 $a_echo = $a_ans[$a]; 20 } else { 21 $error_a = $error_message; 22 } 23 return compact('a_echo','error_a'); 24} 25 26function valid_b_echo($b) 27{ 28 // valid_b()を呼び出す箇所は省略 29 30 $b_echo = "B"; 31 $error_b = ""; 32 return compact('b_echo','error_b'); 33} 34 35function valid_c_echo($c) 36{ 37 // valid_c()を呼び出す箇所は省略 38 39 $c_echo = ""; 40 $error_c = "<p style=\"color:#ff2800;\">入力されていません。</p>"; 41 return compact('c_echo','error_c'); 42} 43 44$a = "x"; 45$b = "b"; 46$c = null; 47 48echo json_encode( 49 array_merge(valid_a_echo($a), 50 valid_b_echo($b), 51 valid_c_echo($c)));

上記の実行結果は以下のJsonになります。

json

1{ 2 "a_echo":"", 3 "error_a":"<p style=\"color:#ff2800;\">不正なPOSTです。</p>", 4 "b_echo":"B", 5 "error_b":"", 6 "c_echo":"", 7 "error_c":"<p style=\"color:#ff2800;\">入力されていません。</p>" 8}

このJsonを受け取ればエラーメッセージと、解凍を両方受け取れるので空白じゃないほうを使ってHTML上に表示できるのではないでしょうか?

投稿2018/04/03 17:28

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penginer

2018/04/07 08:44

遅くなってしまい申し訳ありませんでした。 結局表示はされませんでした。 echoを用いて調べた所、jsonやPHPは問題ないようなので 問題はJavascriptにあるようです。 もし何かお気づきの点がございましたらご教授いただいてもよろしいでしょうか? (尚spanをdivにしました。)
euledge

2018/04/08 05:01

確認する項目としては、javascriptで返ってきたレスポンスをconsole.logで書き出してみることでしょうか
guest

0

まずは、valid_a($a)とvalid_a_echo($a) に同じ引数を入れるにはという点について回答します。

valid_a_echo($a)では内部で呼んでいるvalid_a($a)でバリデーションエラーがなかったら$a_ans、エラーがあったら空文字を返すようにしていると思います。
valid_aでエラーがあった場合には空文字ではなくそのエラーの出力をvalid_a_echo($a)から返してあげればよいのではないでしょうか?
そのためにはvalid_a($a)の返り値が今はbooleanになっていますが、文字列を返すようにしてあげるとよいと思います。

下記に動作のイメージのコードを記します。しばらくPHPやっていないので構文ミスなどはご容赦を、

php

1function valid_a($a) 2{ 3 if (エラーがあったら) { 4 return エラーメッセージ; 5 } else { 6 return ""; 7 } 8} 9 10function valid_a_echo($a) 11{ 12 $a_ans=array("a"=>"A","b"=>"B","c"=>"C"); 13 $error_message = valid_a($a); 14 if (error_message が 空文字だったら) { 15 $a_echo = $a_ans[$a]; 16 } else { 17 $a_echo = $error_message; 18 } 19 echo json_encode(compact('a_echo')); 20}

これでvalid_aとvalid_a_echoは valid_a_echo を呼んであげることで解決できると思いますが
次にa,b,c,d,eそれぞれのバリデーションを function-src.phpを呼ぶことで一度に対応することとしたいですね?

これも結局は上で行ったことの延長で、今度は、valid_a_echo($a)でechoしているものを returnにしてあげて、valid_a_echo,valid_b_echo,valid_c_echo,valid_d_echo,valid_e_echoを呼ぶ親が最後にechoしてあげればよいのではないでしょうか?

下記にイメージのコードを示します。こちらも構文ミスなどはご容赦を

php

1 2<?php 3$a_echo = valid_a_echo($_POST["a"]); 4$b_echo = valid_b_echo($_POST["b"]); 5$c_echo = valid_c_echo($_POST["c"]); 6$d_echo = valid_d_echo($_POST["d"]); 7$e_echo = valid_a_echo($_POST["e"]); 8 9 10ここで $a_echo,$b_echo,$c_echo,$d_echo,$e_echo をひとつのjsonにまとめて echoする。 11 12 13function valid_a($a) 14{ 15 省略 16} 17 18function valid_a_echo($a) 19{ 20 省略 21 return json_encode(compact('a_echo')); 22} 23function valid_b($a) 24{ 25 省略 26} 27 28function valid_b_echo($a) 29{ 30 省略 31 return json_encode(compact('a_echo')); 32} 33function valid_c($a) 34{ 35 省略 36} 37 38function valid_c_echo($a) 39{ 40 省略 41 return json_encode(compact('a_echo')); 42} 43function valid_d($a) 44{ 45 省略 46} 47 48function valid_d_echo($a) 49{ 50 省略 51 return json_encode(compact('a_echo')); 52} 53function valid_e($a) 54{ 55 省略 56} 57 58function valid_e_echo($a) 59{ 60 省略 61 return json_encode(compact('a_echo')); 62} 63 64?> 65

投稿2018/04/02 09:11

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penginer

2018/04/03 06:13

御解答感謝します。 ただ、上にも書いたとおり解答とエラーメッセージの出力箇所を分けたいので そこのアドバイスを頂いてもよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問