PHP 7.1/7.2版本下Smarty Gravatar函数代码无法运行求助
修复Smarty Gravatar函数的PHP兼容性与编码问题
我来帮你搞定这个在PHP7.1/7.2跑不动、最新PHP有编码bug的Gravatar函数。先拆解问题根源,再给出修复后的代码:
问题分析
- PHP7.1/7.2兼容性问题:原始代码里的
&$smarty引用传递,在PHP7.1+的严格模式下会触发警告甚至错误——现代Smarty版本已经不需要强制引用这个参数了。另外,参数校验不够严谨,比如rating参数如果传入非法值,会生成无效的Gravatar URL。 - 最新PHP编码问题:用
strtolower()处理邮箱时,遇到带非ASCII字符的国际化邮箱(比如Anna Müller@example.de)会处理出错,导致生成的Gravatar哈希值不正确,进而加载不到正确头像。
修复方案与代码
下面是修复后的完整代码,针对两个问题都做了处理:
<?php function smarty_function_gravatar($params, $smarty) { // 处理邮箱:多字节安全转小写,确保UTF-8编码,去除前后空格 $email = isset($params['email']) ? trim(mb_strtolower($params['email'], 'UTF-8')) : ''; // 校验评级参数,只允许Gravatar支持的合法值 $valid_ratings = ['G', 'PG', 'R', 'X']; $rating = isset($params['rating']) && in_array($params['rating'], $valid_ratings) ? $params['rating'] : 'R'; // 构建基础Gravatar URL $url = "https://www.gravatar.com/avatar/" . md5($email) . "?r=" . urlencode($rating); // 处理默认头像参数,确保编码正确 if (isset($params['default'])) { $url .= "&d=" . urlencode($params['default']); } // 处理尺寸参数,确保是正整数,避免非法值 if (isset($params['size']) && is_numeric($params['size']) && (int)$params['size'] > 0) { $url .= "&s=" . (int)$params['size']; } // 返回生成的URL(如果你的原始代码是直接输出,改成echo $url即可) return $url; } ?>
关键修改说明
- 移除
&$smarty的引用符号:解决PHP7.1+中引用传递的严格模式警告,现代Smarty版本不需要强制引用这个参数。 - 用
mb_strtolower()替代strtolower():支持多字节字符的邮箱地址,确保生成的Gravatar哈希值准确,解决最新PHP的编码问题。 - 增加参数合法性校验:对
rating和size参数做校验,避免生成无效的Gravatar URL,提升代码健壮性。 - 明确UTF-8编码:处理邮箱时指定编码,避免不同环境下的编码差异导致的错误。
内容的提问来源于stack exchange,提问作者Hendra Setyawan
相关产品推荐
相关产品推荐

