数组没有返回任何内容(但vardump显示数据存在)

时间:2015-08-01 08:21:30

标签: php arrays database oop download

我正在尝试从数据库下载文件,但我的文件始终为空。下面显示的我的vardump输出表明我的数据已正确上传,但当我使用标题下载时,我得到一个html文件,其名称是我的下载脚本而不是我的目标文件及其各自的名称。请帮我指出我的错误。

这是我的下载脚本:

$Download = new Download();
$result = array(); //store results of output
$row = array();
try {
//execute retrieval of files from database
$Download-> showDBFiles();
//pass results to output array 
$output = $Download->getMessages();
//var_dump($output);
//if id is set then get file from database
if (isset($_GET['id'])) {
    $id = $_GET['id'];
    //pump id into function getDBFiles to pull file with matching id
    $Download->getDBFiles($id);
    $row = $Download->getMessages();
    $fileName = $row[0]['name'];
    $fileType = $row[1]['type'];
    $fileContent = $row[2]['content']; //content of file
    $fileSize = $row[3]['size']; //file size
    header('Content-Type:"' . $type . '"');
    header('Content-length:"' . $size . '"');
    header('Content-Disposition: attachment; filename="' . $fileName . '"');
    echo $content;
    //var_dump($row);
    exit;
  }
} catch (Exception $e) {
     $result[] = $e->getMessages();
}

这里调用函数:

        protected $messages = array();

        public function showDBFiles() {
            global $database;
            //$sql = "SELECT resume_id, resume_title FROM ".self::$table_name." ORDER BY resume_id";
            $sql = "SELECT id, name FROM ".self::$table_name." ORDER BY id";
            $result = $database->query($sql);
            if(mysqli_num_rows($result)==0){
                 $this->messages[] = "Database is empty";
            }else{
                 while(list($id, $name) = mysqli_fetch_array($result, MYSQLI_BOTH)){
                     $this->messages[] = array('id'=>$id, 'name'=>$name);
                } 
            }
        }

        public function getDBFiles($id) {
            global $database;
            $sql = "SELECT * FROM ".self::$table_name." WHERE id = $id";
            $result = $database->query($sql);
            if ($row = $result->fetch_array(MYSQLI_ASSOC)) {     
                $name = $row['name'];
                $type = $row['type'];
                $content = $row['content']; //content of file
                $size = $row['size']; //file size
                $this->messages[] = array('name'=>$name, 'type'=>$type, 'content'=>$content, 'size'=>$size);
            }
        }

        public function getMessages(){
                return $this->messages;
        }

这是我的vardump输出:

array(1) { [0]=> array(4) { ["name"]=> string(14) "testing456.doc" ["type"]=> string(18) "application/msword" ["content"]=> string(86016) "...

1 个答案:

答案 0 :(得分:0)

好的(经过一些司法格式化......我知道我也讨厌wsywig。)看起来你正在建立一个标准的多维数组

array( 
   array( 'name' => 'blah' )
)

然后像这样访问它

$row['name']

当你真的想要这个时

$row[0]['name']

一行,而不是很多。

您会看到问题看看您如何返回return $messages;并设置为$this->messages[] = array('name'=>...如果您出现显示错误,那么var_dump array(1) { [0]=> array(4){ ["name"]=>中的Wont woont woont也很明显得到一个警告未定义的索引,该输出会破坏你的下载头。

然后你会从你的电脑中听到 array( [0]=> array( ["name"]=> "testing456.doc", ["type"]=> "application/msword", ) ) ,但是认真地说这是一个非常容易犯的错误,有时一双新眼睛会走很远的路。

<强>更新

记下阵列数据的呈现方式

array[0]['name']

所以你想要array[0]['type'] $sql = "SELECT id, name FROM ".self::$table_name." ORDER BY id LIMIT 1"; 。但正如我在评论中提到的那样,最好只将其设为一行,并限制它。这样就可以解决困惑并一起发布。你能有多行,这是一个很好的问题。

你可以像这样限制它

1

您现在恰好只有 $this->messages = array('name'=>$name, 'type'=>$type, 'content'=>$content, 'size'=>$size); 行,但将来您可以通过查询找到更多内容。如果您使用限制,则不会。

您保存数据的位置

[]

完全删除$this->messages,这只有在数据库中只有一个结果时才有用。然后将$this->message更改为$test = `svn cat ....` header("Content-Disposition: attachment; filename=" . urlencode($filename)); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Description: File Transfer"); echo $test;

是有意义的