Muggles
Muggles

Reputation: 1556

Laravel 5 controller sending JSON integer as string

On my development server the JSON response from the Laravel 5 controller shows the data in the correct types.

e.g

imdb_rating: 7.6
imdb_votes: 6271

But on the production server, the JSON response is sent back as strings.

imdb_rating: "7.60"
imdb_votes: "6271"

Both development and production have the same version of PHP installed (5.6.11-1).

Any ideas on what may be causing this behaviour?

Upvotes: 41

Views: 27883

Answers (5)

mili
mili

Reputation: 3792

Same issue happened to me too, Laravel was returning all numerical data as string after I published to a shared hosting. But everything is working fine on my localhost. So found this solution.

Goto cPanel --> Select PHP Version --> Extensions tab

then uncheck pdo_mysql and check nd_pdo_mysql extension. See following screenshot of my cPanel extensions list cPanel extensions list

I found this solution by comparing phpInfo of my localhost and shared hosting server. see following 2 screenshots of phpInfo page before and after I made the change.

Before the fix Before the fix

After the fix enter image description here

Thanks for the answer by DavidDomain and it opens my eyes to find this solution

I hope my answer will help to someone.

Upvotes: 26

Hadi Note
Hadi Note

Reputation: 1414

I think this can help too in order to make it easier! I'm using laravel v9.x.

Put the function in BaseController:

class Controller extends BaseController {
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public static function json($json) {
        return response()->json($json, 200, [], JSON_NUMERIC_CHECK);
    }

}

Now in your model or whatever you use:

return self::json($all);

Upvotes: 0

MH Fuad
MH Fuad

Reputation: 775

you can return the integer with typecasting like

return (int)Post::find(1)->id;

Upvotes: 0

davidmyersdev
davidmyersdev

Reputation: 1166

I just ran into this same issue! For those of you looking for a more appropriate solution, you might want to check out the $casts property for Eloquent models.

The accepted solution will work, but it will also convert fields that you may not want converted. I would recommend adding this to your Eloquent model:

protected $casts = [ 'imdb_rating' => 'float', 'imdb_votes' => 'integer' ];

This will convert the values directly in your model object, so you won't need to worry about updating multiple endpoints. I hope this helps others as it did me!

Upvotes: 74

DavidDomain
DavidDomain

Reputation: 15293

Make sure to use MySQL Native Driver which will support native data types.

It is possible to convert integer and float columns back to PHP numbers by setting the MYSQLI_OPT_INT_AND_FLOAT_NATIVE connection option, if using the mysqlnd library. If set, the mysqlnd library will check the result set meta data column types and convert numeric SQL columns to PHP numbers, if the PHP data type value range allows for it. This way, for example, SQL INT columns are returned as integers.

MySQL Client Library will return all fields as strings.

Another solution would be to use json_encode options with JSON_NUMERIC_CHECK.

For example:

return response()->json(["foo" => "bar"], 200, [], JSON_NUMERIC_CHECK);

Upvotes: 58

Related Questions