PHP将$\u文件和$\u POST作为参数传递给函数

PHP将$\u文件和$\u POST作为参数传递给函数,php,file,upload,Php,File,Upload,我在网上搜索了一个使用ajax上传PHP图像的代码。我发现代码附在下面。问题是,为了让它在我的服务器上工作,我几乎没有做什么改动(细微的调整)。最初,它只是一个php页面(不是类或函数),用于处理从表单发布的数据。我把它放进了课堂,然后开始做函数。我现在正在关注OOP。我认为在从过程到OOP的转换过程中,最好的方法是将$\u文件和$\u POST传递给一个方法并在内部处理它们。我想这没用。请看这个例子,并就如何继续提供建议 function uploadImageChosen($_FILES,

我在网上搜索了一个使用ajax上传PHP图像的代码。我发现代码附在下面。问题是,为了让它在我的服务器上工作,我几乎没有做什么改动(细微的调整)。最初,它只是一个php页面(不是类或函数),用于处理从表单发布的数据。我把它放进了课堂,然后开始做函数。我现在正在关注OOP。我认为在从过程到OOP的转换过程中,最好的方法是将$\u文件和$\u POST传递给一个方法并在内部处理它们。我想这没用。请看这个例子,并就如何继续提供建议

function uploadImageChosen($_FILES, $_POST){
            $path = "../uploads/images/";
            $valid_formats = array("jpg", "png", "gif", "bmp");
            $connectionInstance = new ConnectionClass();
            $connectionInstance->connectToDatabase();
            $imgName;
            $imgURL;
            $imgSize;
            $imgDir = $_POST['directory'];
            if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")
            {
                $name = $_FILES['photoimg']['name'];
                $imgSize = $_FILES['photoimg']['size'];
                if(strlen($name))
                {
                    list($txt, $ext) = explode(".", $name);
                    if(in_array($ext,$valid_formats))
                    {
                        if($size<(1024*1024))
                        {
                            $imgName = time().substr(str_replace(" ", "_", $txt), 5).".".$ext;
                            $tmp = $_FILES['photoimg']['tmp_name'];
                            if(move_uploaded_file($tmp, $path.$imgName))
                            {
                                $imgURL = $path.$imgName;
                                $connectionInstance->query("INSERT INTO imagesupload(id, title, url, size, directory) VALUES (null, '$imgName','$imgURL', '$imgSize', '$imgDir')");
                                //echo "<img src='uploads/".$imgName."'  class='preview'>";
                            }
                            else{
                                echo "failed";
                            }
                        }else{
                            echo "Image file size max 1 MB";                    
                        }
                    }else{
                        echo "Invalid file format..";   
                    }
            }else{
                echo "Please select image..!";
            }           

          }//end of if      

        }//end of function
function uploadImageSelected($\u文件,$\u POST){
$path=“../uploads/images/”;
$valid_formats=数组(“jpg”、“png”、“gif”、“bmp”);
$connectionInstance=新的ConnectionClass();
$connectionInstance->connectToDatabase();
$imgName;
$imgURL;
$imgSize;
$imgDir=$_POST['directory'];
如果(isset($\u POST)和$\u服务器['REQUEST\u METHOD']=“POST”)
{
$name=$\u文件['photoimg']['name'];
$imgSize=$_文件['photoimg']['size'];
if(strlen($name))
{
列表($txt,$ext)=分解(“.”,$name);
if(在数组中($ext,$valid_格式))
{
if($sizequery(“插入到imagesupload(id、标题、url、大小、目录)中)值(null、$imgName'、$imgURL'、$imgSize'、$imgDir');
//回声“;
}
否则{
echo“失败”;
}
}否则{
echo“图像文件大小最大为1 MB”;
}
}否则{
回显“无效文件格式…”;
}
}否则{
echo“请选择图像…”;
}           
}//if结束
}//功能结束
至于调用类函数的页面,如下所示:

<?php
    require_once("../classes/UploadImages.php");
    $uploadInstance = new UploadImages();
    $uploadInstance->uploadImageChosen($_FILES, $_POST);
    //header("LOCATION:portfolio.php");
?>


非常感谢:)

尝试从IF语句中删除
$\u服务器['REQUEST\u METHOD']==“POST”
,看看它的作用。

$\u POST
$\u文件
是超全局数组,它们总是可用的,在函数或方法中重新定义它们是个坏主意

您可以这样做:

$uploadInstance->uploadImageChosen();
$uploadInstance->uploadImageChosen($_FILES, $_POST);

或者,如果您需要本地范围内的副本,请执行以下操作:

$uploadInstance->uploadImageChosen();
$uploadInstance->uploadImageChosen($_FILES, $_POST);


上面的脚本存在错误日志中未检测到的问题。这个问题是在我实例化connection类时首先出现的。我应该创建另一个变量,该变量将接收打开的连接,用于查询已解决的工作以及数据库中现在存在的数据。第二个问题是JPG格式不在可接受类型的数组中,因此我将其与JPG(变体)一起添加。这使得文件实际上转移到了上传文件夹。感谢大家的支持,并对由此带来的不便表示歉意:)

预期的行为是什么,实际的行为是什么?图像被移动到目录upload/images和img数据存储在dbIs中是预期的行为还是实际的行为?我下载的脚本正确地做到了这一点。除了存储位置,我没有改变更多的逻辑。所以,我猜你没有提供太多信息,你有什么错误吗?文件是否未保存?数据是否未存储在db中?即使类函数的调用位于表单提交到的页面之外的单独文件中,此操作是否有效?是。超全局阵列无处不在。第二个选项是使用参数调用函数,它不依赖于函数定义的位置。我遇到了问题。我还没有做你的编辑,但解决方案不同。无论如何,谢谢你:)