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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

1170閲覧

laravel:大量のURLパラメータの処理方法

iemon2022

総合スコア10

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2022/07/13 07:54

前提

レンタルサーバー上のデータベースにLaravelを介してアクセスするWindowsフォームアプリの開発を行っております。
開発環境は下記の通りです。

■開発環境
・MySQL 5.7
・PHP 8.0.18
・laravel 9.11.0
・vb.net (.NET Framework 4.7.2)

また、システムのおおまかな動きとして次の通りです。

  • vb側からlaravel側に必要なID等をURLパラメータとして渡して、データの取得、更新を行う。
  • vb側から直接データベースにアクセスは出来ない。
  • データの作成等、メインとなる処理はvb側、laravel側は、受け取ったパラメータを処理するだけ。

前述の場合、少量のパラメータを渡す分には問題が無いのですが一括更新処理等で、大量のパラメータを渡す場合、以下のエラーが発生します。

parse_str(): Input variables exceeded 1000

当方、このような構成でシステムを作成するのも初めてであり、基本的な設計が適切なのかどうかも含めてご教授いただければと思います。

実現したいこと

  • 大量のパラメータを渡す適切な方法を知りたい
  • 適切なシステムの設計方法を知りたい

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

parse_str(): Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. {"exception":"[object] (ErrorException(code: 0): parse_str(): Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. at C:\\xampp\\htdocs\\CramSchoolSystem\\vendor\\symfony\\http-foundation\\HeaderUtils.php:237)

試したこと

エラー内容を調べた結果、php.iniや、.htaccessを編集すれば回避できるとの情報がありましたが、脆弱性が増すとの情報もあり、別の方法をとりたいと考えています。

現在、当方で検討している方法は次の通りです。どの方法が適切なのかアドバイスをいただけないでしょうか。

  1. 必要最小限のパラメータを渡しデータの作成はlaravel側で行う
  2. パラメータを分割して渡す
  3. その他、別の方法

よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

GET パラメータだと制限があるので、POST で送信してください

投稿2022/07/13 08:14

phper.k

総合スコア3923

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

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

iemon2022

2022/07/14 07:42

ご回答いただきありがとうございます。 POST、PUTにて試してみました。 419エラー(CSRFトークンのエラー)が発生しましたので、Laravel側の設定で一時的にCSRF保護を除いて試しました。 「Input variables exceeded 1000」のエラーは発生しなくなりましたが、送信したパラメータが1000件で切り捨てられていました。 やはり、設計を見直したほうが良いでしょうか?
phper.k

2022/07/14 10:37

ini の post_max_size の値を変更すれば、上限を変えることが可能ですが、デフォルトでその値になっているということは、その範囲で足りるのが通常とも読み取れます。 設計の見直しをするのが賢明でしょう。
iemon2022

2022/07/15 00:33

php.iniの設定は変更しない方向で考えていますので、設計を見直したいと思います。 ありがとうございました。
guest

0

自己解決

自己解決しました。

■方法
・キー値等のパラメータの送信方法:従来通り
・大量のデータとなる部分    :CSVに変換してから送信

VB

Public Class cParameter Public Property Name As String Public Property Value As Object Sub New(name As String, value As Object) Me.Name = name Me.Value = value End Sub End Class Public Sub SendRequest() Dim url As String = "http://127.0.0.1:8000/" Dim param As New List(Of cParameter) Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8 Dim filePath As String Dim fileDirectory As String = "E:\" Dim fileName As String = "test.csv" filePath = fileDirectory & fileName '区切り文字列 Dim boundary As String = System.Environment.TickCount.ToString() Dim req As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest) req.Headers.Add("Authorization", "Bearer " & "事前に発行したLaravel SanctumのAPIトークン") req.Method = "POST" req.ContentType = "multipart/form-data; boundary=" + boundary 'POST送信するデータを作成 Dim postData As String = "" 'キー値等のパラメータ param.Add(New cParameter("id", 1)) For Each item As cParameter In param postData &= "--" & boundary & vbCrLf & "Content-Disposition: form-data; name=""" & item.Name & """" & vbCrLf & vbCrLf & item.Value.ToString() & vbCrLf Next postData &= "--" + boundary + vbCrLf + "Content-Disposition: form-data; name=""upfile""; filename=""" + fileName + """" + vbCrLf + "Content-Type: application/octet-stream" + vbCrLf + "Content-Transfer-Encoding: binary" + vbCrLf + vbCrLf 'バイト型配列に変換 Dim startData As Byte() = enc.GetBytes(postData) postData = vbCrLf + "--" + boundary + "--" + vbCrLf Dim endData As Byte() = enc.GetBytes(postData) '送信するファイルを開く Dim fs As New System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read) req.ContentLength = startData.Length + endData.Length + fs.Length 'データをPOST送信するためのStreamを取得 Using reqStream As System.IO.Stream = req.GetRequestStream() '送信するデータを書き込む reqStream.Write(startData, 0, startData.Length) 'ファイルの内容を送信 Dim readData(&H1000) As Byte Dim readSize As Integer = 0 While True readSize = fs.Read(readData, 0, readData.Length) If readSize = 0 Then Exit While End If reqStream.Write(readData, 0, readSize) End While fs.Close() reqStream.Write(endData, 0, endData.Length) reqStream.Close() End Using 'サーバーからの応答を受信するためのWebResponseを取得 Dim res As System.Net.HttpWebResponse = CType(req.GetResponse(), System.Net.HttpWebResponse) '応答データを受信するためのStreamを取得 Using resStream As IO.Stream = res.GetResponseStream() '受信して表示 Dim sr As New System.IO.StreamReader(resStream, enc) Console.WriteLine(sr.ReadToEnd()) '閉じる sr.Close() resStream.Close() End Using End Sub

そのままPOSTで送信すると、419エラー(CSRFトークンのエラー)が発生するので、「app/Http/Middleware/VerifyCsrfToken.php」に除外設定を追加。
※CSRFトークンの受け渡しが上手くいかなかったので。わかる方いたら教えて頂けると助かります。

 → リクエストにAPIトークンを含める事で解決しました
req.Headers.Add("Authorization", "Bearer " & "事前に発行したLaravel SanctumのAPIトークン")

■参考
https://dobon.net/vb/dotnet/internet/webrequestpost.html
https://www.suzu6.net/posts/219-laravel-excluding-uris-from-csrf-protection/
https://coinbaby8.com/php-csv-import-bulk-insert-laravel.html
https://reffect.co.jp/laravel/laravel-sanctum-token

投稿2022/07/19 07:36

編集2022/07/22 07:14
iemon2022

総合スコア10

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

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

phper.k

2022/07/19 07:44

> そのままPOSTで送信すると、419エラー(CSRFトークンのエラー)が発生する web.php じゃ無くて api.php にルーティングを設定します。
iemon2022

2022/07/22 07:04

教えて頂いた通りapi.php にルーティング設定をし、リクエスト時に事前に発行した、laravel sanctumの APIトークンを含めることで解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問