Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使HHVM的MySQL驱动程序以整数形式返回ID?_Php_Mysql_Ubuntu_Laravel_Hhvm - Fatal编程技术网

Php 如何使HHVM的MySQL驱动程序以整数形式返回ID?

Php 如何使HHVM的MySQL驱动程序以整数形式返回ID?,php,mysql,ubuntu,laravel,hhvm,Php,Mysql,Ubuntu,Laravel,Hhvm,我注意到我的laravelapi没有将实体标识符(主键)作为整数返回 在Api\PostController.php::show()中: 返回类似于: [{ "id": "1", "title": "Post one", ... },{ "id": "2", "title": "Post two", ... }] 这打乱了我的表排序(因为ID将被排序为字符串:1、10、11、2等) 转储实体本身还表明id属性是一个字符串 如前所述,可能的原因是M

我注意到我的laravelapi没有将实体标识符(主键)作为整数返回

在Api\PostController.php::show()中:

返回类似于:

[{
    "id": "1",
    "title": "Post one",
    ...
},{
    "id": "2",
    "title": "Post two",
    ...
}]
这打乱了我的表排序(因为ID将被排序为字符串:1、10、11、2等)

转储实体本身还表明
id
属性是一个字符串

如前所述,可能的原因是MySQL驱动程序没有以适当的类型返回值

我在Ubuntu 14.04服务器上使用HHVM3.3.1。有没有什么方法可以将本机MySQL库(如php5 mysqlnd)用于HHVM

我可以用它来解决这个问题。但在我看来,这更像是一种黑客行为

请帮忙


参考资料:



编辑:我已经确认它不是Laravel的ORM层。PDO实例已将id作为字符串返回。

在Post类中为id创建一个访问器

class Post extends Eloquent {

    public function getIdAttribute($value)
    {
        return (int)$value;
    }

}

我没有设置HHVM进行测试,但PHP中的修复方法是禁用PDO::ATTR_EMULATE_。例如,在数据库配置文件中,添加:

'connections' => [
    'mysql' => [
        // ...
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => false
        ]
    ],
]

您需要在/etc/hhvm/php.ini文件中设置键入的结果


hhvm.mysql.typed_results=true

更改数据库驱动程序只是为了在应用程序级别获取int似乎很奇怪:对于一个真正简单的修复来说,这是一项繁重的任务,也是一个漫长的过程。在PHP级别强制执行类型(如ORM或应用程序代码)更有意义。@MarkFox我不同意,因为类型转换开销(int>string>int)。这会花费时间并可能导致错误(例如浮点转换)。您确定这是数据库驱动程序本身而不是ORM层吗?@mauvm是一个老问题,但只是想知道您是否解决了这个问题?HHVM似乎将mysqlnd列为兼容的本机PHP驱动程序。应该只是在服务器上安装它,就像使用PHP一样?还没有。从那时起,我使用了@slapyo提出的修复方法。它仍然困扰着我,所以如果你找到了解决方案,请让我知道!请注意,该页面上次更新是在5个月前。也许新版本的HHVM不再存在这个问题。正如我所说,使用模型访问器更像是一种黑客行为。MySQL返回的是数据,而不是类型。有人说,如果你在Ubuntu上,你可以安装MySQL本机驱动程序,它将返回类型为的数据。根据这篇文章,您可以在Ubuntu中运行本机驱动程序。如果这对你有用,那就太好了,但这只会对Ubuntu上的人有所帮助。否则,Laravel需要实现类似的功能:以正确的类型返回值。通常,当您从框架访问
SQL
时,您将以
数组
对象
字符串
的形式返回数据。如果您希望数据以
int
的形式返回,可以建立自己的特殊连接+查询,或者键入将返回的数据转换为
int
。这不是黑客行为,这是从查询返回数据的正常现实。创建包装不是黑客行为。这是一个非常好的设计决定。不幸的是,没有这样的运气。手册还说,“如果驱动程序无法成功准备当前查询,它将始终返回到模拟准备好的语句。”也许这就是它出错的地方。谢谢你的建议!
'connections' => [
    'mysql' => [
        // ...
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => false
        ]
    ],
]