PHP PDO - 为什么我的 fetchAll() 在使用 json_encode 时将所有值转换为字符串?

问题描述 投票:0回答:3

我正在对一个表执行一个全选 SQL 查询,并在 PHP 中的一个准备好的查询中运行它。然后我在 json_encode 中回显结果。结果是将每个值都作为一个字符串,甚至是一个 INT 的行 ID。你如何保留原始值类型?

    $sql = "SELECT * FROM `Type`";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($result);

输出如下:

[{"ID":"1","Type":"Classic Starters","Description":""},{"ID":"2","Type":"Special Starters","Description":""}]

想要的输出如下:

[{"ID":1,"Type":"Classic Starters","Description":""},{"ID":2,"Type":"Special Starters","Description":""}]

提前致谢<3

php
3个回答
5
投票
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

这解决了我的问题


0
投票

我遇到了与 Doctrine 相同的问题,所以基本上解决方法是针对 PDO,特别是如果您不想或不能配置它以避免转换为字符串。

创建班级

Class Entity {
    public int $ID;
    public string $Type;
    public string $Description;
}

然后将类名与 \PDO::FETCH_CLASS 一起传递

$sql = "SELECT * FROM `Type`";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(\PDO::FETCH_CLASS, Entity::class);

$result 将是这样的:

array:2 [
  0 => Entity {
    ID: 1
    Type: "Classic Starters"
    Description: ""
  }
  1 => Entity {
    ID: 1
    Type: "Special Starters"
    Description: ""    
  }
]

0
投票

我需要使用“动态类名”。所以这里有一个替代方案@Sergey Onishchenko的回答:

//I conditionally set the class name and sql statement.
$fetchClass='Entity';
$sql = "SELECT * FROM `Type`";

$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_CLASS, $fetchClass); //I removed the backslash in front of PDO::FETCH_CLASS, because I don't know it's purpose and it also works wihout a backlash.

而不是使用

Entity::class
或变量名,它当然也可以直接使用字符串:

$result = $stmt->fetchAll(PDO::FETCH_CLASS, 'Entity');
© www.soinside.com 2019 - 2024. All rights reserved.