我正在对一个表执行一个全选 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
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
这解决了我的问题
我遇到了与 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: ""
}
]
我需要使用“动态类名”。所以这里有一个替代方案@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');