strpos() 期望参数 1 为字符串,数组给定

strpos() expects parameter 1 to be string, array given

我在上传功能时收到此警告,但我不明白为什么。我已经查看了相同错误的其他问题,但无法获得解决方案。

function upload($name,$old,$dir=NULL,$autoid,$number)
{
    global $def_dir;
    if(!$dir)$dir="../".$GLOBALS["logo"];


    if($_FILES[$name]['name']){
        if( is_file($dir.$old) ) unlink($dir.$old);
        $ext=substr($_FILES[$name]['name'],strpos($_FILES[$name]['name'],$name),strlen($_FILES[$name]['name']));
        $file=$autoid.'_'.$number.$ext;

        move_uploaded_file($_FILES[$name]['tmp_name'],$dir.$file);

    }else{
        $file=$old;
    }

    return($file);
}

我试过了var_dump($_FILES[$name]['name'] 结果是 string(24) "generic-project-icon.png"

我试过 print_r($_FILES[$name]['name']) 结果是 generic-project-icon.png

我是瞎了还是没有数组?

我只是想不通为什么会这样。 任何帮助深表感谢。谢谢。

  1. 函数签名($name,$old,$dir=NULL,$autoid,$number)带默认值的参数移至末尾($name,$old,$autoid,$number,$dir=NULL)
  2. 尽量不要使用 global 变量将它们作为参数传递

并回答你的问题 $_FILES[$name]['name'] 当你上传多个文件时可以是数组。 Documentation

如果您不确定有多少文件即将到来,您可以将数据自动转换为数组并循环播放。如果只有一个字符串,那么它将变成一个单元素数组,只循环一次。 Technique Demo

查看内联评论...

代码(未测试):

function upload($name,$old,$autoid,$dir=NULL,$number=1){  // move parameters with default values to the end 
    // remove global variable, it is unused/pointless
    if(!$dir)$dir="../".$GLOBALS["logo"];

    if(isset($_FILES[$name]['tmp_name'])){  // check that the element isset()
        foreach((array)$_FILES[$name]['tmp_name'] as $n){  // loop all elements
            if( is_file($dir.$old) ) unlink($dir.$old);
            $file=$autoid.'_'.$number.strstr($name, '.');  // use strstr() to get "dot & extension"
            move_uploaded_file($n,$dir.$file);
         }
    }else{
        $file=$old;
    }

    return($file);
}