即使论证被传递,也会缺少论据?

时间:2012-08-05 23:39:14

标签: 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/www/vhosts/mysite.net/httpdocs/mp/upload.php和   在/var/www/vhosts/mysite.net/httpdocs/mp/includes/classes.php中定义   第26行上传文件时出错!

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

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

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!";
        }
    }

}

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

3 个答案:

答案 0 :(得分:2)

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

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

似乎PHP也提出反对意见:

  

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

我认为使用它作为方法参数意味着它是一个变量变量。

答案 1 :(得分:1)

错误消息不是说谎。如果它说“缺少DoUpload :: doUpload()的参数1 那个参数缺失。

因此,例如,如果未定义变量$_FILES,则会出现该错误。但是作为一个超级全局,它应该被定义 - 除非你在PHP的配置中禁用了文件上传。

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

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

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

不开动。请参阅此overview of PHP SuperglobalsDocs

答案 2 :(得分:0)

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

不知道这是否是导致问题的原因,而只是一个抬头。