sprintf: Too few arguments
Discuz [function.sprintf]: Too few arguments 错误
今天一个客户反映论坛中一篇帖子打不开,其它帖子正常。
我打开看了下,详细错误信息是:
于是找到文件中错误代码的位置:
问题,只有这一篇,肯定跟帖子内容也有关系的。于是把相关的帖子导出来,并不多,看了下,果然帖子中有如
下一个图片地址:
,在 discuzcode 这个主函数里有几处
今天一个客户反映论坛中一篇帖子打不开,其它帖子正常。
我打开看了下,详细错误信息是:
PHP Warning: sprintf() [<a href='function.sprintf'>function.sprintf</a>]: Too few arguments in E:\wwwroot\bbs\include\discuzcode.func.php on line 369求助了下百度,谷哥,很多都是英文帖子,也看懂了一点,但还是没有头绪。
于是找到文件中错误代码的位置:
function bbcodeurl($url, $tags) {
if(!preg_match("/<.+?>/s", $url)) {
if(!in_array(strtolower(substr($url, 0, 6)), array('http:/', 'https:', 'ftp://', 'rtsp:/', 'mms://'))) {
$url = 'http://'.$url;
}
//这一行错误
return str_replace(array('submit', 'logging.php'), array('', ''), sprintf($tags, $url, addslashes($url)));
} else {
return ' '.$url;
}
}
查了下php手册,sprintf并没有很特殊的要求,只有字符串中的%要与参数一一对应。另外又想,既然其它帖子没问题,只有这一篇,肯定跟帖子内容也有关系的。于是把相关的帖子导出来,并不多,看了下,果然帖子中有如
下一个图片地址:
http://2012.zhenai.com/uploads/images/%E5%B7%85%E5%B3%B0.jpg看来问题在这里了。肯定是这个网址中的%没有编码就被传入到sprintf中了。调用到bbcodeurl函数的有几个地方
,在 discuzcode 这个主函数里有几处
if(!$bbcodeoff) {
if($parsetype != 1 && strpos($msglower, '[swf]') !== FALSE) {
$message = preg_replace("/\[swf\]\s*([^\[\<\r\n]+?)\s*\[\/swf\]/ies",
"bbcodeurl('\\1', ' <img src=\"images/attachicons/flash.gif\" align=\"absmiddle\" alt=\"\" /> <a
href=\"%s\" target=\"_blank\">Flash: %s</a> ')", $message);
}
if(strpos($msglower, '[/img]') !== FALSE) {
$message = preg_replace(array(
"/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies",
"/\[img=(\d{1,4})[x|\,](\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies"
), $allowimgcode ? array(
"bbcodeurl('\\1', '<img src=\"%s\" onload=\"thumbImg(this)\" alt=\"\" />')",
"parseimg('\\1', '\\2', '\\3')"
) : array(
"bbcodeurl('\\1', '<a href=\"%s\" target=\"_blank\">%s</a>')",
"bbcodeurl('\\3', '<a href=\"%s\" target=\"_blank\">%s</a>')"
), $message);
}
}
另外,这里也调用到了 parseimg函数, parseimg又调用了bbcodeurl
function parseimg($width, $height, $src) {
return bbcodeurl($src, '<img'.($width > 0 ? " width=\"$width\"" : '').($height > 0 ? "
height=\"$height\"" : '')." src=\"$src\" border=\"0\" alt=\"\" />");
}
看来问题就在这里了,这里直接把url替换进img标签中,又把整个标签传给 bbcodeurl,url中的%没有被编码。于是加了个replacefunction parseimg($width, $height, $src) {
return bbcodeurl($src, str_replace('%','%%','<img'.($width > 0 ? " width=\"$width\"" : '').($height > 0 ? " height=\"$height\"" : '')." src=\"$src\" border=\"0\" alt=\"\" />"));
}
上传覆盖旧文件,问题成功解决。