教你如何解决wordpress报错Warning: strpos() expects parameter 1 to be string, array given in /wp-includes/functions.php on line 3133
wordpress版本:3.X
比较老了
报错代码在/wp-includes/functions.php 第 3133 行
解决方法
找到第3133行如下代码:
function validate_file( $file, $allowed_files = '' ) {
if ( false !== strpos( $file, '..' ) )
return 1;
if ( false !== strpos( $file, './' ) )
return 1;
if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files ) )
return 3;
if (':' == substr( $file, 1, 1 ) )
return 2;
return 0;
}
错误消息 Warning: strpos() expects parameter 1 to be string, array given in /www/wwwroot/test1217/wp-includes/functions.php on line 3133
是因为 strpos()
函数的第一个参数 $file
被传递了一个数组而不是一个字符串,而 strpos()
期望的是字符串类型。
解决方案
问题在于 $file
可能是一个数组而非字符串,您需要检查 strpos()
调用前 $file
的类型,确保它始终是字符串。如果 $file
可能是数组,您应该在调用 strpos()
之前对它进行处理。
在您的代码中,可以加入类型检查,或者修改传递给 strpos()
的参数,使其始终为字符串。
方案 1:增加类型检查
可以在调用 strpos()
之前检查 $file
是否为字符串。如果 $file
是数组,您可以选择如何处理,通常是取数组的某个元素或将其转换为字符串。
修改后的代码:
function validate_file( $file, $allowed_files = '' ) {
// 如果$file是数组,取第一个元素(可以根据实际需求调整)
if ( is_array( $file ) ) {
$file = $file[0]; // 这里假设你只想处理数组的第一个元素
}
// 确保$file是字符串
if ( ! is_string( $file ) ) {
return 1; // 如果不是字符串,直接返回错误或其它处理
}
// 进行原来的验证
if ( false !== strpos( $file, '..' ) )
return 1;
if ( false !== strpos( $file, './' ) )
return 1;
if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files ) )
return 3;
if ( ':' == substr( $file, 1, 1 ) )
return 2;
return 0;
}
方案 2:确保传递给 strpos()
的 $file
是字符串
如果您不想处理数组,而是希望 $file
必须是字符串,可以提前检查 $file
的类型,确保它总是传递一个字符串。
function validate_file( $file, $allowed_files = '' ) {
// 如果$file是数组,转换为字符串
if ( is_array( $file ) ) {
$file = implode( ',', $file ); // 将数组元素合并为一个字符串(用逗号分隔)
}
// 如果$file还是不是字符串,返回错误
if ( ! is_string( $file ) ) {
return 1;
}
// 进行原来的验证
if ( false !== strpos( $file, '..' ) )
return 1;
if ( false !== strpos( $file, './' ) )
return 1;
if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files ) )
return 3;
if ( ':' == substr( $file, 1, 1 ) )
return 2;
return 0;
}
说明:
is_array( $file )
:检查$file
是否为数组。如果是数组,可以选择取数组的某个元素(例如,$file[0]
)或将整个数组合并成一个字符串(使用implode()
)。is_string( $file )
:确保$file
是字符串类型,如果不是字符串,可以根据需要处理错误。
PHP 版本与兼容性
您提到使用的是 PHP 5.6 和 WordPress 3.3,这个版本的 PHP 对类型检查支持良好,但不支持一些新特性(如类型提示)。因此,类型检查(is_string
和 is_array
)是确保代码兼容性的好做法。
最终推荐
如果您不确定 $file
是否可能为数组,建议采用方案 1,因为它能够灵活处理不同情况并避免错误。如果您确信 $file
始终应该是字符串,方案 2 是更简单的选择。