2012-08-05 2 views
1

이 스크립트에 문제가 있습니다. 그것은 이미지 업로드 스크립트 있고 난 똑같은 말을 두 가지 오류가 무엇입니까 : /var/www/vhosts/mysite.net/에서 호출, DoUpload :: doUpload()에 대한 누락 된 인수 1 :인수가 합격 되었더라도 누락 된 인수가 있습니까?

경고 httpdocs/mp/upload.php 온라인 및 /var/www/vhosts/mysite.net/httpdocs/mp/includes/classes.php에 정의 됨 on line 26 파일이 업로드되었습니다! 경고 : DoUpload :: doUpload()에 대한 인수 1이 누락되었습니다. /var/www/vhosts/mysite.net/httpdocs/mp/upload.php on line 10 및 /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(); 

답변

0

$ _FILES는 범위에 관계없이 스크립트의 어느 부분에서나 사용할 수있는 슈퍼 글로벌입니다. doUpload 메소드에 인수를 전달할 필요는 없으며 메소드 정의 내에서 $ _FILES 배열을 사용할 수 있습니다.

이것이 문제의 원인인지 아닌지는 모르지만 머리가 위로 올지는 않습니다.

+0

내부 클래스에서 super-globals를 사용하는 것에 대해 진지하게 조언하고 싶습니다. – favoretti

+0

다른 옵션은 @favoretti입니까? 나는 DRY를 따르려고 노력하고 있는데 $ file = $ _FILES [ 'file'] [ 'tmp_name']; –

+0

'$ my_files = $ _FILES; doUpload ($ my_files);'를 호출하고'doUpload()'의 매개 변수를'$ _FILES'에서'$ my_files' 같은 이름으로 변경합니다. – favoretti

2

$_FILES이 항상 정의되지는 않습니다. IIRC. 파일을 넘기거나 아무것도 업로드하지 않고 아무것도 업로드하지 않거나 페이지의 제출 버튼을 누르면 null이되고 오류가 발생합니다.

또한 $_FILES은 초 글로벌 (superglobal) PHP 변수이므로 사용자 고유의 함수 (매개 변수 이름)에서 정확한 이름을 다시 사용하지 않을 것입니다. PHP가 어떻게 동작하는지 확신 할 수 없습니다.

그것은 일종의 PHP를 것뿐만 아니라 그것에 대하여 조언 :

참고 : 가변 변수 슈퍼 전역 변수 변수로 사용할 수 없습니다.

메소드 매개 변수로 사용하는 것이 가변 변수임을 의미합니다.

+0

파일을 업로드 중입니다. 나는 형식을 가지고 있지만 중요하지 않다고 생각하여 포함시키지 않았습니다. –

1

오류 메시지가 거짓말 아닙니다. DoUpload :: doUpload()에 대해 누락 된 인수 1이 인 경우 인수가 없습니다.

예를 들어 변수 $_FILES이 정의되지 않은 경우 해당 오류가 발생합니다. 그러나 슈퍼 글로벌 (superglobal)으로 정의해야합니다 - PHP 구성에서 파일 업로드를 비활성화하지 않은 경우.

그러나 설정을 해제해도 정의되지 않습니다. 이렇게 기술적으로 많은 이유가있을 수 있으며, 디버깅이 더 필요합니다.

또한 $_FILES은 소위 말하는 슈퍼 글로벌입니다. 따라서 함수 매개 변수의 이름을 다음과 같이 지정하지 마십시오 (!) :

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

No-Go.이 내용은 overview of PHP SuperglobalsDocs을 참조하십시오.

+0

Hehe, 방금'$ _FILES'와 같은 함수 매개 변수의 이름을 지정하지 않는 것에 대한 경고를 포함하도록 내 게시물을 편집했습니다. – favoretti

+0

예 일반적으로 빠릅니다. 나는 당신이 그 일을 할 때 어떤 일이 벌어 질지 아직도 궁금해하지만, 어쨌든 나는 그렇게 할 것을 제안하지 않는다. – hakre

+0

동일합니다. PHP가 내부 전역에서 super-globals (btw, var에 적절한 용어를 찾도록 도와 주셔서 감사합니다)를 사용하는 방법에 대한 단서가 없습니다. – favoretti