28

大きなJSON投稿をメインデータとして受け入れる必要があるRESTSのようなサービスをPHPで構築しています(ここで説明したのと同じようにデータを送信および読み取ります:http://forums.laravel.io/viewtopic.php?id=900

問題は、PHP が次の警告を表示することです。

<b>Warning</b>:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in <b>Unknown</b> on line <b>0</b><br />

PHP で入力変数をカウントしないようにする方法はありますか (または、起動時の警告を抑制する必要がありますか)。

4

10 に答える 10

20

何かが間違っています。1000 個の変数は必要ありません。1000 個のキーを持つ 1 つの変数配列を受け入れるようにプログラムを修正します。これは、推奨される方法で行っていないことを警告するためのエラーです。無効にしたり、拡張したり、非表示にしたりしないでください。

于 2016-03-17T12:49:49.460 に答える
18

これを変える

; max_input_vars = 1000

これに

max_input_vars = 3000

php.iniファイルのコメント行は

;
于 2018-05-28T10:59:12.470 に答える
15

json データを PHP で ( 経由で) 直接処理する正しい方法file_get_contents('php://input')は、リクエストが適切なコンテンツ タイプContent-type: application/json、つまり HTTP リクエスト ヘッダーに設定されていることを確認することであることがわかりました。

私の場合、このコードでcurlを使用してphpからページをリクエストしています:

function curl_post($url, array $post = NULL, array $options = array()) {
  $defaults = array(
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_URL => $url,
    CURLOPT_FRESH_CONNECT => 1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FORBID_REUSE => 1,
    CURLOPT_TIMEOUT => 600
  );
  if(!is_null($post))
    $defaults['CURLOPT_POSTFIELDS'] = http_build_query($post);
  $ch = curl_init();
  curl_setopt_array($ch, ($options + $defaults));
  if(($result = curl_exec($ch)) === false) {
    throw new Exception(curl_error($ch) . "\n $url");
  }
  if(curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) {
    throw new Exception("Curl error: ". 
      curl_getinfo($ch, CURLINFO_HTTP_CODE) ."\n".$result . "\n");
  }
  curl_close($ch);
  return $result;
}

$curl_result = curl_post(URL, NULL,
    array(CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
      CURLOPT_POSTFIELDS => json_encode($out))
    );

部分に注意してくださいCURLOPT_HTTPHEADER => array('Content-Type: application/json')

受信側では、次のコードを使用しています。

$rawData = file_get_contents('php://input');
$postedJson = json_decode($rawData,true);
if(json_last_error() != JSON_ERROR_NONE) {
  error_log('Last JSON error: '. json_last_error(). 
    json_last_error_msg() . PHP_EOL. PHP_EOL,0);
}

max_input_vars変数を変更しないでください。正しいヘッダーを設定するようにリクエストを変更して以来、私の問題はmax_input_varsなくなりました。どうやら PHP は、特定が設定されている投稿変数を評価しませんContent-type

于 2016-03-21T08:16:40.173 に答える
5

PHPマニュアル によるとmax_input_varsphp.ini役割は次のとおりです。

受け入れられる入力変数の数 (制限は$_GET$_POSTおよび$_COOKIEスーパーグローバルに個別に適用されます)。このディレクティブを使用すると、ハッシュ衝突を使用するサービス拒否攻撃の可能性が軽減されます。このディレクティブで指定されたよりも多くの入力変数がある場合は、E_WARNINGが発行され、それ以降の入力変数は要求から切り捨てられます。この制限は、多次元入力配列の各入れ子レベルにのみ適用されます。

あなたmax_input_varsはあなたのphp.ini.

于 2013-05-09T20:32:45.920 に答える
4

max_input_vars本当に、ファイルを使用した変更.htaccessは機能していますが、Apache サービスを再起動する必要があります。

完全なプロセスに従います。

  1. に行くC:\xampp\apache\conf\httpd.conf
  2. ファイルを開くhttpd.conf
  3. ファイルで探しますxampp/htdocs
  4. 少し下に、次のような行が表示される場合があります。AllowOverride
  5. 削除する#前にこの行が表示される場合AllowOverride#
  6. AllowOverride挿入後の次の行php_value max_input_vars 10000
  7. ファイルを保存して閉じます
  8. 最後に、Apache を停止して再起動します (Apache を再起動した直後に動作します)。
于 2016-03-17T12:39:51.883 に答える
1

php.ini で max_input_vars を変更してもうまくいきませんでした

.htaccess ファイルを使用した max_input_vars の変更は機能しています。

.htaccess ファイルを使用して「max_input_vars」を変更する場合は、C:\xampp\apache\conf\httpd.conf ファイル (xampp 内) に移動し、.htaccess ファイルに次のコードを追加します。

php_value max_input_vars 10000

于 2015-12-28T15:16:21.207 に答える
1

応答データを使用して別の AJAX 呼び出しを行うときにスラッシュの問題が発生し、それを回避するためにstripslashes()関数を使用しました。

Javascript AJAX:

course_data: JSON.stringify(response.data)

PHP バックエンド:

$course_data = json_decode(stripslashes($_POST['course_data']));
于 2021-10-30T19:05:05.550 に答える
0

私も同じ問題を抱えていました。POST データで 2Mb ファイルを送信していたことがわかりました。これは、JSON として奇妙に解釈されることがあり、これらすべての変数を検出します。

ファイルパラメータを使用して情報を送信することになりましたが、ファイルの内容はまだ POST データのままでした。

curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_INFILE, ($fp = fopen("filename.txt", "r")));
fclose($fp);
于 2021-06-07T06:51:24.020 に答える