【问题标题】:Undefined index, and undefined variable, but both are defined! (I think....)未定义的索引和未定义的变量,但两者都已定义! (我想....)
【发布时间】:2012-07-19 07:47:36
【问题描述】:

我正在使用下面的 HTML 表单将文件传递给 PHP 进行处理。但是 PHP 说索引是未定义的。

同样,我在 config.php 中定义的变量显示为未定义。

我在这里错过了什么?

classes.php

<?php
require('config.php');
error_reporting(E_ALL);
/*
 * Classes required by the script
 * 
 */

class database extends PDO
{
    public $conURL;

    public function __construct($config) {
        $conURL = "mysql:host=" . $config['host'] . ";dbname=" . $config['db'];
        try {
         parent::__construct($conURL, $config['user'], $config['pass']);
        } catch (PDOException $e) {
            $e->getMessage();
        }
    }       
}

class upload
{
    public $_FILES;

    public function uploadFile() {
        if ($_FILES['file']['size'] >= 2000000) {
           echo "File is too large!";
        }
        elseif (isset($_FILES['file'])) {
           $stmt = $this->prepare("INSERT INTO upload (name, type, size, content) VALUES (?, ?, ?, ?)");
           $stmt->execute(array($_FILES['file']['name'], $_FILES['file']['type'], $_FILES['file']['size'], $_FILES['file']['file']));
        }
    }
}

config.php

<?php
$config = array(
        'host' => 'localhost', // db host
        'user' => 'root', // db user
        'pass' => 'mypassword', //db pass
        'db' => 'files' // db name
);

上传.php

<?php
error_reporting(E_ALL);
require('config.php');
require('classes.php');

$dbh = new database($config);
$upload = new upload();
$upload->uploadFile();

HTML 表单

<form name="uploaddb" action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name="file" />
<br/>
<input type="submit" name="submit" value="Upload!" />
</form>

作为参考,以下是错误:

注意:未定义的变量:config in /Applications/MAMP/htdocs/files/classes.php 第 28 行

注意:未定义的索引:文件在 /Applications/MAMP/htdocs/files/classes.php 第 34 行

【问题讨论】:

  • 在数据库中存储文件不是一个好习惯。在数据库中存储文件的url并将文件保存到硬盘。

标签: php html oop pdo


【解决方案1】:

我非常希望你没有真正处理这个:&lt;input type="hidden" name="MAX_FILE_SIZE" value="2000000" /&gt;

另外,使用global $config;

【讨论】:

  • 哈哈。我不是,你可以看到上面的所有代码。有人告诉我,全球化变量是不好的。
  • 如果变量超出范围,有时您必须这样做。但是,由于您只在类文件中使用它,所以应该没问题,没有明显的冲突。
  • 你把它放在哪里了?课内还是课外?
  • 我把它放在config.php中,其中定义了变量本身。
  • @Dustin:它需要在 database 类的 __construct 中才能做任何有用的事情。
【解决方案2】:

我没有测试它,但这是我认为错误的地方:

  1. 在类文件中不需要config.php。您已经将$config 传递给database 构造函数。
  2. 不要在你的类上声明$_FILES,它是一个随处可用的超全局变量。

我还建议您将班级名称大写。

更新

很抱歉,我现在无法将所有内容放在一起。这是我看到的更多问题:

  1. $_FILES['file'] 上没有 file 键。不确定您要查找的密钥。
  2. 您不能像现在一样在upload 类上使用db 方法。 $this-&gt;prepare 不会导致错误吗?该类不扩展PDO。也许你应该在 db 类中有上传方法。

【讨论】:

  • 我现在将它们大写。谢谢。剩下的错误与这部分有关:$_FILES['file']['file']。我很困惑我应该用什么变量替换它以便将上传的文件插入数据库。
  • 谢谢。事实证明,如果我只用 $_FILES['file'] 替换 $_FILES['file']['file'],数据就会插入到数据库中,但我会收到关于数组到字符串转换的通知。跨度>
【解决方案3】:
public function __construct() {
    global $config;
    // Rest of the code here.
}

这不是一个很好的方法,但它应该可以工作。

【讨论】:

    【解决方案4】:

    您在 classes.php 文件中再次包含 config.php

    第二件事是执行的最后一个参数,文件内容存储在 $_FILES 中没有文件索引

     $_FILE['file']['tmp_name']
    
    
     $stmt->execute(array($_FILES['file']['name']
     , $_FILES['file']['type'], $_FILES['file']['size'], $_FILES['file']['tmp_name']));
    

    不要将文件存储在数据库中并且过大。

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      相关资源
      最近更新 更多