求助:strlen()参数类型错误(传入数组)问题解决
解决strlen()参数为数组的错误问题
这个错误逻辑很清晰:strlen()函数要求传入字符串类型的参数,但当前代码里的$value是一个数组,所以触发了警告。先看你给出的代码行:
if ((strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y')) {
问题根源
这段代码应该是在遍历$_GET、$_POST这类超全局变量的键值对,而其中某个$key对应的$value是数组类型——比如前端表单里的多选框,name属性写成了name="xxx[]",提交后就会生成数组类型的参数。当循环到这个键值对时,strlen($value)自然就会报错。
解决方案
这里有几种靠谱的处理方式,你可以根据业务需求选:
方式1:先判断类型,只处理字符串的value
给判断条件加个类型检查,非字符串直接跳过:
if (is_string($value) && (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y')) {
这种方式最稳妥,直接避开非字符串类型的参数,不会触发警告。
方式2:把数组转成字符串再处理(适合需要保留数组内容的场景)
如果你希望数组类型的参数也能被处理,可以先把数组转成字符串形式:
// 用逗号分隔数组元素,也可以换成其他分隔符或者用json_encode转成JSON $safe_value = is_array($value) ? implode(',', $value) : $value; if ((strlen($safe_value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y')) {
方式3:直接跳过数组类型的参数
如果业务逻辑里根本不需要处理数组参数,遍历的时候直接跳过就行:
// 先判断,是数组就跳过当前循环 if (is_array($value)) { continue; } if ((strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y')) {
额外小建议
你可以先打印一下当前遍历的变量(比如var_dump($_REQUEST)),看看具体是哪个键对应的$value是数组,这样能更精准地定位问题——大概率是前端表单的多选框或者批量提交的元素没处理好参数格式导致的。
内容的提问来源于stack exchange,提问作者gold1s
相关产品推荐
相关产品推荐

