记录一次中文逗号的神奇 bug

之前写了这样的代码

$result = $uploader->save($request->avatar, 'avatars', $user->id,362)

程序不报任何错误,一切功能正常运行,就是后面的 362 参数无论如何都不生效,之后在 save方法里写了个 1/0; 通过异常堆栈信息来查看实际的参数传入值

Arguments
    UploadedFile {#547 ▶}
    "avatars"
    null

$user->id竟然是null?362 竟然完全没传进去。

后来才发现$user->id,362使用了中文逗号,一般情况下使用中文逗号都会报错的,但这里似乎是符合语法规范的,$user->id,362相当于$user["id,362"] 然后我尝试写了下面的代码

$user->id,362= 1;
dd($user['id,362']);

还有下面的

$user->id,(。,?)362= 1;
dd($user['id,(。,?)362']);

结果都正常返回了1,往后应该小心$aaa->bbb代码后写入中文符号,对程序来说是完全符合语法的,甚至都完全不会报错,上面的代码一切都正常运行,如果我没去看上传图片的尺寸的话,我根本发现不了我写了一个中文逗号!

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

$user->后可以接任意字符,包括PHP保留字,中文字符,会导致出现一个上传图片名丢失前缀的BUG

解决办法:

  • 仔细检查$user->id后是否出现语法警告信息!
  • \App\Handlers\ImageUploadHandler::save 中 增加自动生成的前缀变量 $file_prefix 是否为null的判断,如下:

    // 如果上传的不是图片将终止操作
    if (!in_array($extension, $this->allowed_ext) || is_null($file_prefix)) {
        return false;
    }
    
5年前 评论

@hustnzj 主要是上诉情况中完全没有任何语法错误的提示,也许换一个严格的代码校验规范就提示错误了

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!