2

このスクリプトに問題があります。これは画像アップロードスクリプトであり、同じことを言う2つのエラーが発生します。

警告:DoUpload :: doUpload()の引数1がありません。これは、8行目の/var/www/vhosts/mysite.net/httpdocs/mp/upload.phpで呼び出され、/ var / www / vhosts /mysite.net/で定義されています。 26行目のhttpdocs/mp / include / classes.phpファイルがアップロードされました!警告:DoUpload :: doUpload()の引数1がありません。これは、10行目の/var/www/vhosts/mysite.net/httpdocs/mp/upload.phpで呼び出され、/ var / www / vhosts /mysite.net/で定義されています。 26行目のhttpdocs/mp / include / classes.phpファイルのアップロード中にエラーが発生しました!

しかし、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();
4

3 に答える 3

2

$_FILES常に定義されているわけではありません、IIRC。何もアップロードしないか、ファイルを渡さずにページの送信ボタンを押すか、何もアップロードしないと、nullになるため、エラーが発生します。

また、$_FILESこれはスーパーグローバルPHP変数であるため、その正確な名前を独自の関数(パラメーター名)で再利用することはありません。PHPがそれに対してどのように動作するかわからない。

PHPもそれに対して一種のアドバイスをしているようです。

注:変数変数スーパーグローバルは、関数またはクラスメソッド内の変数変数として使用できません。

メソッドパラメータとして使用することは、それが変数変数であることを意味すると思います。

于 2012-08-05T23:43:13.607 に答える
1

エラーメッセージは嘘ではありません。「DoUpload::doUpload()の引数1がありません」と表示されている場合、その引数はありません。

したがって、たとえば、変数$_FILESが定義されていない場合、そのエラーが発生します。ただし、PHPの構成でファイルのアップロードを無効にしていない限り、スーパーグローバルとして定義する必要があります。

ただし、設定を解除することも可能であり、定義されていません。したがって、技術的には、これが発生する理由は多数あり、さらにデバッグする必要があります。

さらに$_FILES、それはいわゆるスーパーグローバルであることを忘れないでください。したがって、関数パラメータにそのような名前を付けないでください(!):

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

立ち入り禁止。PHPSuperglobalsDocsのこの概要を参照してください。

于 2012-08-05T23:45:19.593 に答える
0

$ _FILESはスーパーグローバルです。つまり、スコープに関係なく、スクリプトのどの部分でも使用できます。doUploadメソッドに引数を渡す必要はありません。メソッド定義内で$_FILES配列を引き続き使用できます。

これが問題の原因であるかどうかはわかりませんが、注意が必要です。

于 2012-08-05T23:46:22.700 に答える