代码之家  ›  专栏  ›  技术社区  ›  Blagoh

上传到服务器后,json输出的所有数字都是字符串

  •  0
  • Blagoh  · 技术社区  · 7 年前

    我在我的loclahost成功地测试了一切。我现在上传到服务器。

    我在本地主机(XAMPP,Windows 10)中使用默认设置从phpMyAdmin导出,然后使用默认设置在远程phpMyAdmin上导入。

    当点击远程主机时,它现在会给出我在迁移中设置的所有字段,如下所示:

    $table->integer('extension_id')->unsigned();
    

    作为一个字符串,这很奇怪,因为当在localhost上时,它是作为一个数字给出的。

    在下面的数据中,请注意,在localhost中, displayname_id extensions_id 值没有用引号括起来。然而 id 不是,我不明白,它也是未签名的。我的目标是实现收支平衡 身份证件 列为字符串(如果不可能,则使 *_id 返回数字)。

    这里是远程:

    [
        {
            "id": 2,
            "name": "Stencil",
            "kind": "cws",
            "created_at": "2017-11-11 00:26:52",
            "updated_at": "2017-11-11 00:26:52",
            "thumbs_count": "1",
            "thumbs_yes_count": "0",
            "latest_comment": {
                "id": 1,
                "body": "huh?",
                "displayname_id": "1",
                "extension_id": "2",
                "created_at": "2017-11-11 00:26:56",
                "updated_at": "2017-11-11 00:26:56"
            }
        }
    ]
    

    这里是本地主机:

    [
        {
            "id": 2,
            "name": "Stencil",
            "kind": "cws",
            "created_at": "2017-11-11 00:26:52",
            "updated_at": "2017-11-11 00:26:52",
            "thumbs_count": "1",
            "thumbs_yes_count": "0",
            "latest_comment": {
                "id": 1,
                "body": "huh?",
                "displayname_id": 1,
                "extension_id": 2,
                "created_at": "2017-11-11 00:26:56",
                "updated_at": "2017-11-11 00:26:56"
            }
        }
    ]
    

    以下是我的博士的简历:

    我的远程phpMyAdmin是这个-

    这是我的地盘-

    这是表格结构的截图,请注意 身份证件 列也是无符号的,但它们不是 json_encode '插入字符串。

    以下是导出屏幕截图: https://screenshots.firefoxusercontent.com/images/51d1e47f-fe78-4cdc-8de4-b113d4b576a9.png

    https://screenshots.firefoxusercontent.com/images/ff112f86-1c1c-4554-b03c-4b15307c042a.png

    2 回复  |  直到 7 年前
        1
  •  2
  •   patricus    7 年前

    不同之处在于MySQL客户端驱动程序。您的本地计算机正在使用MySQL本机驱动程序( mysqlnd ),而您的远程服务器正在使用MySQL客户端库( libmysql ).

    本机驱动程序( mysqlnd )将数据库中的所有整数视为PHP中的整数。但是,客户端库( libmysql )将在PHP中将所有字段视为字符串。

    原因是 id 字段在两台服务器上都显示为整数,这是因为有一些Laravel魔法。Laravel使用模型的 $casts 属性在访问时将特定字段转换为特定类型。如果你的 $incrementing true (默认情况下是这样),Laravel会自动添加主键字段(默认) 身份证件 )到 $casts 属性定义的类型 $keyType 属性(默认值 int ). 因此,每当您访问 身份证件 字段,它将是一个PHP整数。

    mysqlnd )在远程服务器上。

    如果这不是一个选项,或者不可取,则可以使用 $casts

    protected $casts = [
        'displayname_id' => 'int',
        'extension_id' => 'int',
    ];
    

    现在,无论使用何种MySQL驱动程序,这两个字段都将被视为整数。

    如果你想要 要将其视为字符串,您有两个选项。

    首先,你可以改变 $keyType 价值到 string ,但这可能会产生意想不到的后果。例如 relationHasIncrementingId BelongsTo 类检查键是否递增以及键类型是否为 整数 ,因此如果更改 $keyType .

    'id' => 'string' 给你的 $casts 数组,作为 $casts 价值优先于 $keyType 访问属性时的值。这将比更改 $keyType 价值

    身份证件 要将其视为仅用于JSON转换的字符串,可以重写 jsonSerialize()

    public function jsonSerialize()
    {
        $data = parent::jsonSerialize();
    
        if (isset($data[$this->primaryKey])) {
            $data[$this->primaryKey] = $this->castAttribute('string', $data[$this->primaryKey]);
        }
    
        return $data;
    }
    
        2
  •  1
  •   YouneL    7 年前

    当然,这个问题来自您的数据库或旧版本的php<5.2.9

    但你可以试着传球 JSON_NUMERIC_CHECK 选择您的 json_encode

    本机PHP解决方案:

    echo json_encode($a, JSON_NUMERIC_CHECK);
    

    在线 的 Example

    Laravel解决方案:

    return response()->json($a, 200, [], JSON_NUMERIC_CHECK);