CodeIgniter4中调用base_convert报无效字符传入错误问题咨询
错误触发原因
microtime(false)为函数默认调用形式,返回值是空格分隔的字符串,格式为微秒小数部分 秒级Unix时间戳,典型返回值形如0.45678900 1718240000,字符串包含空格、小数点两类非数字字符。base_convert要求待转换字符串必须匹配指定源进制的合法字符范围,本次调用指定源进制为10,仅允许传入0-9的数字字符,空格、小数点均属于非法字符。PHP 7.4版本强化了该函数的参数校验逻辑,检测到非法字符时就会触发题目中的提示。- 原写法即使屏蔽警告,生成的ID重复概率极高,不适合作为主键:同一微秒时间片内的并发请求会生成完全相同的值。
解决方法
最小修改(消除报错)
给microtime传入参数true获取浮点数格式的高精度时间戳,移除小数点得到纯数字字符串后,再执行36进制转换即可消除报错:
$id = base_convert(str_replace('.', '', microtime(true)), 10, 36);
主键场景优化(避免ID重复)
作为主键使用时,需在时间串后拼接随机段,规避高并发场景下的ID重复问题:
// 微秒级时间戳转36进制作为ID前缀 $timePart = base_convert(str_replace('.', '', microtime(true)), 10, 36); // 生成2位定长36进制随机串,单时间片支持1296个不重复ID $randPart = str_pad(base_convert(random_int(0, 1295), 10, 36), 2, '0', STR_PAD_LEFT); $primaryId = $timePart . $randPart;
内容的提问来源于stack exchange,提问作者Habibi
相关产品推荐
相关产品推荐

