1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

queryStringのクエリにランダムな英数字を入れるとごく稀にINFになる

Last updated at Posted at 2022-09-14

↑の関連

前提

LivewireのComponentでは$queryStringという変数をオーバーライドすることでURLにクエリを付与したり書き換えたり出来ます。
https://laravel-livewire.com/docs/2.x/query-string

例えば、web.phpで↓のようにコンポーネントへのルーティングを行い、

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', \App\Http\Livewire\Item::class );

それからComponentで$qs$queryStringへ追加してから

<?php

namespace App\Http\Livewire;

class Item extends \Livewire\Component
{
    public string $qs = ''; // URLのクエリ名

    protected $queryString = ['qs']; // 対象の変数名を文字列で設定

    public function mount()
    {
        var_dump( $this->qs ); // 出力
    }
}

http://localhost/?qs=123456とかにアクセスすると

string(6) "123456"

クエリqsに渡した値をプロパティ$qsに代入してくれます。

注意点

普通に使っていれば割と便利なこの機能ですが、残念ながら
http://localhost/?qs=123e456
とかやってしまうと123e456が指数表記と解釈されてしまうため、上記のクエリでは↓の出力結果になってしまいます。

string(3) "INF"

ちなみにhttp://localhost/?qs=10e2とかだと↓

string(4) "1000"

うーん、なんとも気味の悪い挙動

回避策としては「http://localhost/?qs="123e456"でアクセスする」とか「そもそもそんな短いランダム文字列を使わない」とかが有効です。

これが原因の不具合にぶつかったときも「テストデータだしランダムなコードも6文字ぐらいで良いか」的な感じのノリだったので、今後は気を付けたい。

おまけ

Q. なんでこんなことが起こるのか?

A. なんかLivewireが受け取った値をjson_decodeに通してるから(↓の41行目)

多分バグですねこれ

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?