前提・実現したいこと
株のポートフォリオを管理できるwebアプリを作っています。
ユーザー入力に対してバリデーションを実装したいです。
OS mac10.13
PHP7.1.14
laravel 5.6
発生している問題・エラーメッセージ
https://teratail.com/questions/133952
以前の質問後に私なりに色々と学び、ある程度バリデーションの実装ができました。
今回質問したいのは、1回目のフォーム送信にだけバリデーションが機能しないということです。
作成しているアプリでは、存在しない証券コード(上場企業のidのようなものです)をデータベースに記録できないようにしたいです。
ですが、1回目のフォーム送信ではそのまま記録出来てしまいます。
↓画像で言うと証券コード9999というのは存在しませんが、記録出来てしまいます。
しかし、2回目以降はきちんとバリデーション出来ます。(証券コード1234も存在しません)
該当のソースコード
バリデーションの実装はフォームリクエストを利用しています。
//App\Http\Requests\addStockRequest //今回の質問に関わらないと思われるコードは省略 class addStockRequest extends FormRequest { public function authorize(){ if($this->path() == 'make/add'){ return true; }else{ return false; } } public function rules(){ return [ 'stock_code' => 'filled|digits:4|integer', 'codeDataBaseCheck' => 'different:stock_code', 'codeExistCheck' => 'numeric' ]; } public function messages(){ return[ 'stock_code.filled' => '入力してください!', 'stock_code.digits' => '4桁の数字を入力してください!', 'stock_code.integer' => '整数を(半角で)入力してください!', 'codeDataBaseCheck.different' => 'その証券コードは既に入力されています!', 'codeExistCheck.numeric' => 'その証券コードは読み取れません!' ]; } }
ビューのコードも載せます。
証券コードが存在するかどうかは、グーグルファイナンスの非公式APIを利用して判別しています。
簡潔に言うと、証券コードを引数にして、その株価が返り値となるような関数を作成しています。
もし存在しない証券コードを引数に渡すと、'DATA='という文字列が返るようになっています。
//resources\views <form method="POST" action="/make/add"> {{ csrf_field() }} @if($errors->has('codeExistCheck')) <tr><td>{{$errors->first('codeExistCheck')}}</td></tr> @elseif($errors->has('codeDataBaseCheck')) <tr><td>{{$errors->first('codeDataBaseCheck')}}</td></tr> @elseif($errors->has('stock_code')) <tr><td>{{$errors->first('stock_code')}}</td></tr> @endif <tr><th>証券コード: </th><td><input type="text" name="stock_code" value="{{old('stock_code')}}"></td></tr> //省略 //以下、@endphpまでグーグルファイナンスのAPIを利用した関数を作成しています @php function getStockPrice($code){ $url = "https://www.google.com/finance/getprices?&x=TYO&i=1800&p=2d&f=c&q=$code"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); $stockPrice = explode("\n", $html); return current(array_slice($stockPrice, -2, 1, true)); } @endphp //$itemsはユーザーテーブルと株に関するテーブルがリレーションされたモデルクラスが代入されています @foreach($items as $item) <input type="hidden" name="codeDataBaseCheck" value="{{$item->stock_code}}"> <input type="hidden" name="codeExistCheck" value="{{getStockPrice($item->stock_code)}}"> @endforeach </form>
試したこと
原因が全くわからず、何から試したら良いのかわからない状況です。
他に載せた方が良いソースコードがあれば教えてください。
7/7追記
別の問題が発生したので追記いたします。
複数の情報をフォーム送信すると、直前のデータに対するバリデーションしか機能しません。
↓の画像で言うとKDDIの証券コードである9433を入力しようとするとバリデーションが機能し、「その証券コードは既に入力されています!」と表示されます。
しかし、それ以外の2162や3475は入力できてしまいます。
色々と調べると、バリデーションルールにdifferentにしているのが間違いだと思いました。
参考URL -> https://qiita.com/fagai/items/9904409d3703ef6f79a2
(自分でもcodeDataBaseCheckって書いてますしね(^_^;)。データベースを利用したバリデーションルールを設定しないといけないですよね)
上記のページを参考にしながら、修正していきたいと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。