Yii2 user组件 $identity->id 取出来是字符串的问题的追踪 [ 2.0 版本 ]
原文链接:Yii2 user组件 $identity->id 取出来是字符串的问题
发现该问题是由帖子:http://www.fecshop.com/topic/833
在产品收藏页面,从user组件中取出来的id是string,而不是int,
@myred08 追踪了好久,最终发现是表结果中,id列(主键),加入unsigned导致的
CREATE TABLE IF NOT EXISTS `customer` (
`id` int(20) unsigned NOT NULL AUTO_INCREMENT,
`password_hash` varchar(80) DEFAULT NULL COMMENT '密码',
unsigned
就是上面id后面的字符,如果是32位机器,加上了unsigned
,id就会变成字符串。
具体原因分析:
1.php的环境变量资料:
PHP_INT_SIZE
:表示整数integer值的字长
PHP_INT_MAX
:表示整数integer值的最大值
注:
输出下32位中PHP_INT_SIZE:4,PHP_INT_MAX:2147483647
输出下64位中PHP_INT_SIZE:8,PHP_INT_MAX:9223372036854775807
2.查看:yii\db\Schema
/**
* Extracts the PHP type from abstract DB type.
* @param ColumnSchema $column the column schema information
* @return string PHP type name
*/
protected function getColumnPhpType($column)
{
static $typeMap = [
// abstract type => php type
self::TYPE_TINYINT => 'integer',
self::TYPE_SMALLINT => 'integer',
self::TYPE_INTEGER => 'integer',
self::TYPE_BIGINT => 'integer',
self::TYPE_BOOLEAN => 'boolean',
self::TYPE_FLOAT => 'double',
self::TYPE_DOUBLE => 'double',
self::TYPE_BINARY => 'resource',
self::TYPE_JSON => 'array',
];
if (isset($typeMap[$column->type])) {
if ($column->type === 'bigint') {
return PHP_INT_SIZE === 8 && !$column->unsigned ? 'integer' : 'string';
} elseif ($column->type === 'integer') {
return PHP_INT_SIZE === 4 && $column->unsigned ? 'string' : 'integer';
}
return $typeMap[$column->type];
}
return 'string';
}
@
因此,在yii2中,当user表的id,新建表的时候加入了unsigned
,并且是32位机器,id就会被搞成string。
感谢 @myred08 研究了好长时间得出的结果。 很赞~
Fecshop 深圳
注册时间:2016-01-21
最后登录:2024-08-13
在线时长:73小时36分
最后登录:2024-08-13
在线时长:73小时36分
- 粉丝157
- 金钱2381
- 威望490
- 积分8011
共 2 条评论
Yii2 user组件 $identity->id 大多数用户取出来都是int类型,而某些用户取出来是字符串
通过上面的追踪排查出来问题,创建表的时候,对于递增字段id加上了unsigned,如果是32位机器,$identity->id就会变成字符串。
学到了 原来还有这样
是的,源于fecshop中对于产品加入收藏功能的bug解读:产品添加Add to Favorites 失败
http://www.fecshop.com/topic/833
Yii2开源电商商城fecshop:https://github.com/fecshop/yii2_fecshop