ホームページ  >  に質問  >  本文

POST リクエストは成功しましたが、データが間違った方法で保存されました。

POST リクエストをエンドポイントに送信しようとしましたが、200 レスポンスを受け取りましたが、送信したデータはデータベースに誤って保存されました;

問題が投稿リクエストにあるのか、リクエストを処理するバックエンド コードにあるのかを知りたいです。

より具体的には、POST リクエストを Laravel MariaDB バックエンドに送信しています。私はバックエンド コードを記述しませんでした。取得したすべての「詳細」は次のとおりです:

投稿リクエストには 3 つのフィールドがあります:

  • user_id: 患者ID
  • パスワード: 患者パスワード (すべての患者に同じ)
  • ペイロード: 次の構造を持つ json ペイロード:
    • 'epoch_start' => '必須|番号',
    • 'epoch_end' => '必須|数値|gte:epoch_start',
    • 'サイズ' => '必須|数値|gt:0',
    • '温度' => '必須|配列|最小: サイズ',
    • '圧力' => '必須|配列|最小: サイズ',
    • '移動' => '必須|配列|最小: サイズ',

これはリクエストを処理するコントローラーです:

<?php

名前空間 App\Http\Controllers;

Illuminate\Http\Request を使用します。
バリデータを使用します。
応答を使用します。
App\Models\User を使用します。
App\Models\Sensor を使用します。
カーボン\カーボンを使用します。

クラス SensorController はコントローラーを拡張します
{
    パブリック関数storeData(Request $request) {
        if ($request->has(['user_id', 'password', 'payload'])) {
            $password = $request->get('パスワード');
            $user_id = $request->get('user_id');

            $user = User::where('id', $user_id)->firstOrFail();
            if($user->role != "患者") return new Response('Forbidden', 403);
            if($password != "HIDDENPASS") return new Response('Forbidden', 403);


            $ペイロード = $request->get('ペイロード');
            $data = json_decode($payload, true);

            $rules = [
                'epoch_start' => '必須|数値',
                'epoch_end' => '必須|数値|gte:epoch_start',
                'サイズ' => '必須|数値|gt:0',
                '温度' => '必須|配列|最小:サイズ',
                '圧力' => '必須|配列|最小:サイズ',
                '動き' => '必須|配列|最小:サイズ',
                '温度.*' => 「数値」、
                '圧力.*' => 「数値」、
                '動き.*' => 「数値」、
            ];

            $validator = Validator::make($data, $rules);

            if ($validator->passes()) {
                $s = 新しいセンサー;
                $s->user_id = $user->id;
                $s->epoch_start = Carbon::parse($data["epoch_start"]);
                $s->epoch_end = Carbon::parse($data["epoch_end"]);
                $s->size = $data["size"];
                $s->温度 = json_encode($data["温度"]);
                $s->pressure = json_encode($data["pressure"]);
                $s->movement = json_encode($data["movement"]);
                $s->save();
                response()->json(['success' => 'success'], 200);
            } それ以外 {
                dd($validator->errors());
            }

        } それ以外 {
            新しい応答を返します('禁止', 403);
        }
    }
}

Postman を使用してこの投稿リクエストを実行した場合 (curl と Python のリクエスト モジュールも使用しました)、200 個のリクエストに達し、データはこの方法でデータベースに保存されます。

「温度」、「圧力」、および「動作」フィールドで問題となるのは、より具体的には、数周の二重引数です。ネットワーク アプリケーション プログラムによって実行される、このデータに関する計算はすべて危険ですが、二重アドレス (PhpMyAdmin から) を手動で削除した場合、計算は正しくなります。

完全に理解するために、ここに表の構造を示します。

これらの文字列周围出现二重引数を回避するための法はありませんか?

私たちの POST 要求に問題があるか、それとも後端に関連する問題がありますか?

私は PHP に精通していませんが、私が承認されていない場合、これらのデータの処理はこれらの行管理によって行われます:

$s->温度 = json_encode($data["温度"]);
$s->pressure = json_encode($data["pressure"]);
$s->movement = json_encode($data["movement"]);

そして、json_encode は文字列を返すので、ここのバックエンド コードに何か問題があるのではないかと思い始めていますが、セカンドオピニオンが欲しいです。

###前もって感謝します###

編集:わかりました、@samuel-olufemiの回答と@sumitのコメントのおかげで、json_encodeとMariaDBで使用される長いテキストデータ型の組み合わせが主な問題であると結論付けることができます。 そこで、配列の値をエンコードせずに保存しようとしました。これらの 3 行を次のように変更しました。

$s->温度 = $data["温度"]; $s->圧力 = $data["圧力"]; $s->動き = $data["動き"];

そして、私の希望に従って、データは二重引用符なしで保存されます。皆さんのご協力と時間をありがとうございました。
P粉317679342P粉317679342259日前352

全員に返信(1)返信します

  • P粉794177659

    P粉7941776592024-02-27 17:25:09

    あなたの実装は正しいです。この問題は、Maria DB の長いテキスト データ型による JSON データの管理方法が原因で発生します。

    この回答をご覧ください

    https://dba.stackexchange .com/questions/192754/json-functions-double-quotes-added-when-going-through-a-variable

    返事
    0
  • キャンセル返事