2

我在使用这个脚本时遇到了问题。这是一个图像上传脚本,我收到了两个相同的错误:

警告:DoUpload::doUpload() 缺少参数 1,在第 8 行的 /var/www/vhosts/mysite.net/httpdocs/mp/upload.php 中调用并在 /var/www/vhosts/mysite.net/ 中定义第 26 行的 httpdocs/mp/includes/classes.php 文件已上传!警告:DoUpload::doUpload() 缺少参数 1,在第 10 行的 /var/www/vhosts/mysite.net/httpdocs/mp/upload.php 中调用并在 /var/www/vhosts/mysite.net/ 中定义第 26 行 httpdocs/mp/includes/classes.php 上传文件时出错!

但正如您在upload.php 中看到的,我传递了一个参数:$_FILES 数组。

我该怎么办?(不寻找任何人来重写任何东西,我只需要一些关于我做错了什么的指导。:))

类.php

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'on');
require('config.php');

// Connect to database
// Does not handle anything else
class DatabaseCon {
    public $dbh;

    // Method to connect to database
    function dbConnect($config) {
        try {
            $this->dbh = new PDO("mysql:host=" . $config['host'] . ";dbname=" . $config['dbname'], $config['dbuser'], $config['dbpass']);
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }
}

class DoUpload {
    private $target_path = 'i/';
    public $_FILES;

    public function doUpload($_FILES) {
        $this->target_path .= basename($_FILES['file']['name']);

        if (move_uploaded_file($_FILES['file']['tmp_name'], $this->target_path)) {
            echo "The file has been uploaded!";
        }
        else {
            echo "An error occurred when uploading the file!";
        }
    }

}

上传.php

<?php
ini_set('display_errors', 1);
require_once('includes/config.php');
require_once('includes/classes.php');

$db = new DatabaseCon();
$db->dbConnect($config);

$upload = new DoUpload();

$upload->doUpload($_FILES);

$sth = $db->prepare("INSERT INTO images (filename) VALUES (?)");
$sth->bindParam(1, $_FILES['file']['tmp_name']);
$sth->execute();
4

3 回答 3

2

$_FILES并不总是被定义,IIRC。如果您不上传任何内容或只是点击页面上的提交按钮而不传递任何文件或上传任何内容,则它将为空,因此会导致错误。

此外,$_FILES它是一个超全局 PHP 变量,我不会在您自己的函数(参数名称)中重复使用该确切名称。不确定 PHP 将如何表现。

似乎 PHP 也反对它:

注意:变量变量 超全局变量不能用作函数或类方法中的变量变量。

我想将它用作方法参数意味着它是一个可变变量。

于 2012-08-05T23:43:13.607 回答
1

错误信息没有说谎。如果它显示“缺少 DoUpload::doUpload() 的参数 1”,则该参数丢失。

因此,例如,如果$_FILES未定义变量,您将收到该错误。然而,作为一个超全局,它应该被定义——除非你在 PHP 的配置中禁用了文件上传。

但是,也可以取消设置它,然后它就没有被定义。所以从技术上讲,发生这种情况可能有很多原因,这需要进一步调试。

另外请记住,这$_FILES是一个所谓的超全球。所以不要像这样(!)命名你的函数参数:

    ...
    public function doUpload($_FILES) {
                             ^^^^^^^

不行。请参阅PHP Superglobals Docs的概述

于 2012-08-05T23:45:19.593 回答
0

$_FILES 是一个超全局的,这意味着无论范围如何,它都可用于脚本的任何部分。您不需要将任何参数传递给您的 doUpload 方法,并且您仍然可以在方法定义中使用 $_FILES 数组。

不知道这是否是导致问题的原因,但只是提醒一下。

于 2012-08-05T23:46:22.700 回答