Массив ничего не возвращает (но vardump показывает, что данные есть)

1

Я пытаюсь загрузить файл из базы данных, но мой файл всегда пуст. Мой выходной файл 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) "...

  • 0
    Откуда выводится vardump? Я пропустил это там>
  • 0
    Мой вывод vardump - array (1) {[0] => array (4) {["name"] => string (14) "testing456.doc" ["type"] => string (18) "application / msword "[" content "] => строка (86016)"
Показать ещё 1 комментарий
Теги:
database
arrays
oop
download

1 ответ

0
Лучший ответ

Хорошо (после некоторого судебного форматирования.. Я знаю, что я тоже ненавижу wsywig.) Похоже, что вы строите стандартный многомерный массив

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

И затем доступ к нему вот так

$row['name']

Когда вы действительно этого хотите

$row[0]['name']

Один ряд, а не многие.

Вы видите, что проблема связана с возвратом return $messages; и set $this->messages[] = array('name'=>... Также очевидно в вашем var_dump как array(1) { [0]=> array(4){ ["name"]=> если у вас были ошибки отображения, вы, вероятно, получите предупреждение undefined index, и этот вывод уничтожит ваши заголовки загрузки.

Тогда вы услышите 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.

  • 0
    Вы правы, я получил бы неопределенные предупреждения индекса, если бы я сделал это таким образом. Я обновил свои коды, чтобы отразить ваше предложение, и я все еще получаю их, хотя
  • 0
    Вы изменили его в обоих методах класса, которые устанавливают сообщения? видите, вам не нужен этот $row[1] , его все $row[0]['name'] , $row[0]['type'] т. д., лучше изменить класс, чтобы хранить только одно сообщение, а затем использовать LIMIT 1 в вашем sql, не могли бы вы иметь более одного сообщения, который хороший вопрос, чтобы спросить себя
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню