PHP PDO :: FETCH_CLASS

时间:2017-06-17 03:31:24

标签: php mysql pdo casting php-7

我尝试使用PDO::FETCH_CLASS从状态表中获取数据,但它将int字段作为string

返回

MySQL表架构:

CREATE TABLE IF NOT EXISTS `INState` (
  `StateId` bigint(20) NOT NULL,
  `Name` varchar(255) NOT NULL
)

我的PHP代码:

class StateModel
{
    public $StateId;
    public $Name;
}

$stateArr = $db->query('SELECT StateId, Name FROM INState')->fetchAll(PDO::FETCH_CLASS, 'StateModel');

var_dump($stateArr);

上述代码的输出为

array(2) { 
    [0]=> object(StateModel)#4 (2) 
        { ["StateId"]=> string(1) "1" ["Name"]=> string(14) "Andhra Pradesh" } 
    [1]=> object(StateModel)#5 (2) 
        { ["StateId"]=> string(1) "2" ["Name"]=> string(10) "Tamil Nadu" }
)

在表架构中,列StateId标记为bigint,但代码端标记为string。如何使用StateIdint设置为string而不是PDO::FETCH_CLASS?请帮助我。

2 个答案:

答案 0 :(得分:0)

使用MySQLPHP数据库中选择数据时,数据类型将始终转换为string。您可以检查每个PDO Fetch method返回类型是否为mixed。您可以使用以下代码将其转换回整数:

$id = (int) $row['column'];

或者使用函数intval()

$id = intval($row['column']);

答案 1 :(得分:0)

偏离@Mayank是正确的,但我们可以在构造函数中显式设置属性数据类型。

class StateModel
{
    public $StateId;
    public $Name;

    public function __construct()
    {
        settype($this->StateId, 'integer');
    }
}

最后,您的代码输出为

array(2) { 
    [0]=> object(StateModel)#1 (2) 
        { ["StateId"]=>  int(1) ["Name"]=> string(14) "Andhra Pradesh" } 
    [1]=> object(StateModel)#2 (2) 
        { ["StateId"]=>  int(2) ["Name"]=> string(10) "Tamil Nadu" }
)