Php 即使参数已传递,仍缺少参数?

Php 即使参数已传递,仍缺少参数?,php,mysql,oop,pdo,php-5.3,Php,Mysql,Oop,Pdo,Php 5.3,我对这个脚本有问题。这是一个图像上传脚本,我得到两个错误,说明了相同的事情: 警告:中调用的DoUpload::DoUpload()缺少参数1 /第8行的var/www/vhosts/mysite.net/httpdocs/mp/upload.php和 在/var/www/vhosts/mysite.net/httpdocs/mp/includes/classes.php中定义 在第26行,文件已上载!警告:缺少的参数1 DoUpload::DoUpload(),在中调用 /第10行的var/w

我对这个脚本有问题。这是一个图像上传脚本,我得到两个错误,说明了相同的事情:

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

但是正如您在upload.php中看到的,我传递了一个参数:$\u文件数组

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

classes.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
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();

$\u文件
并不总是定义的,IIRC。如果您不上传任何内容,或者只点击页面上的提交按钮而不传递任何文件或上传任何内容,那么它将为空,从而导致错误

另外,
$\u FILES
是一个超全局PHP变量,我不会在您自己的函数中重复使用这个确切的名称(参数名)。不确定PHP将如何处理这个问题

PHP似乎也建议不要这样做:

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


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

错误消息没有说谎。如果它说“DoUpload::DoUpload()”缺少参数1,则缺少该参数

例如,如果未定义变量
$\u FILES
,则会出现该错误。然而,作为一个超全局的,它应该被定义——除非您在PHPs的配置中禁用了文件上传

但是,也可以取消设置它,然后不定义它。因此,从技术上讲,出现这种情况的原因可能有很多,这需要进一步调试

另外,请记住,
$\u文件
是所谓的超全局文件。因此,不要将函数参数命名为(!):


不行。请参见此图。

$\u文件是一个超全局文件,这意味着它将可用于脚本的任何部分,无论其作用域如何。您不需要向doUpload方法传递任何参数,并且仍然可以在方法定义中使用$\u FILES数组


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

我正在上传一个文件。我有一个表单,但我认为它不重要,所以我没有包含它。呵呵,刚刚编辑了我的帖子,加入了关于不要命名函数参数的警告,比如
$\u FILES
:)是的,你通常更快。我仍然想知道当你这么做时会发生什么,但无论如何我不建议你这么做。同样,这里也不知道PHP对在内部类中使用超级全局变量(顺便说一句,谢谢你帮我找到了var的正确术语)会有什么反应。我现在已经测试过了,
$\u文件
通常可用,除非您在配置中禁用它或取消设置它。不安是有用的。对于函数参数,当你传递一个参数的时候,你就知道了超全局的值,所以这实际上是用它本身来代替它。不过,我郑重建议不要在内部类中使用超全局。我还有什么其他选择,@favoretti?我试着跟随DRY,而不是像$file=$\u FILES['file']['tmp\u name']这样说<代码>$my\u files=$\u files;doUpload($myu文件)
并将
doUpload()
的参数从
$\u文件
重命名为类似
$my\u文件
    ...
    public function doUpload($_FILES) {
                             ^^^^^^^