You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:15:37