Как избежать конфликта заголовков в php после создания сеанса после входа в систему? - PullRequest
1 голос
/ 20 июня 2011

Сегодня я впервые узнал, как создать простую систему входа в систему (благодаря советам StackExchange и ЭТОМУ ОБУЧЕНИЮ . Я пытаюсь использовать фреймворк PHPExcel создать файл Excel ТОЛЬКО для тех, кто успешно вошел в систему.

Я подошел очень близко, однако я получаю сумасшедшее сообщение о заголовках, а ниже - куча смешанного текста на жаргоне.

Warning: Cannot modify header information - headers already sent by (output started at     /home3/mydir/public_html/d23/members/loggedin.php:6) in     /home3/mydir/public_html/d23/members/create_excel.php on line 92

Warning: Cannot modify header information - headers already sent by (output started at      /home3/mydir/public_html/d23/members/loggedin.php:6) in     /home3/mydir/public_html/d23/members/create_excel on line 93

Warning: Cannot modify header information - headers already sent by (output started at /home3/mydir/public_html/d23/members/loggedin.php:6) in /home3/mydir/public_html/d23/members/create_excel on line 94
ÐÏࡱá;þÿ       þÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Я знаю, что из-за этих строк в файле "create_excel.php" происходит ошибка, потому что, когда я их закомментирую, ошибки нет. Но также не создается файл Excel.

 header('Content-Type: application/vnd.ms-excel');
 header('Content-Disposition: attachment;filename="userList.xls"');
 header('Cache-Control: max-age=0');

Я буду шаг за шагом описывать свой процесс - я новичок, поэтому держу пари, что это кому-то глупо просто.

STEP # 1 (login.php)

Вызывает файл «process_login.php» для аутентификации пароля, введенного в форму.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Login Please</title>
</head>

<body>

<form action="process_login.php" method="post">
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>

</body>
</html>

PAGE 2 (process_login.php)

Если все в порядке, он теперь перенаправит вас на «logged_in.php»,если нет - вы получите сообщение об отказе.

mysql_connect($host, $user, $pass);
mysql_select_db($database);


//$username = mysql_real_escape_string($_POST['username']);
$username = "person";
$password = hash('sha512', $_POST['password']);

$result = mysql_query("SELECT * FROM $table WHERE password = '$password'
");


if(mysql_num_rows($result))
{
  // Login
  session_start();
  $_SESSION['username'] = htmlspecialchars($username); // htmlspecialchars() sanitises     XSS
  // Redirect
header('Location: loggedin.php');
exit;
}
else
{
  echo '<p><strong>Error:</strong> Invalid username or password.</p>';
}
?>

ШАГ 3 (logged_in.php)

Теперь мы успешно вошли в систему, с уведомлением об утверждении, а также с запросом на запуск файла "create_excel.php",

<?php 
session_start();
if(isset($_SESSION['username']))
{
  // Logged in
  echo '<p>You are logged in as '. $_SESSION['username']. '.</p>';
   // require the PHPExcel file
require 'create_excel.php';

}
else
{
  // Not logged in
  echo '<p>You are not <a href="login.php">logged in</a>.</p>';
}
?>

ШАГ # 4 (create_excel.php)

Здесь возникает проблема с заголовком.Я попытался поместить скрипт сессии на этой странице в одиночку, но у меня та же проблема.Я думал, если бы он был вытащен со страницы "logged_in", все было бы хорошо, но нет.(В настоящее время, если я получаю доступ к этой странице напрямую, файл Excel генерируется и загружается без проблем).

<?php
/** Error reporting */
error_reporting(E_ALL);

date_default_timezone_set('Europe/London');

/** PHPExcel */
require_once 'Classes/PHPExcel.php';


// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
                             ->setLastModifiedBy("Maarten     Balliauw")
                             ->setTitle("Office 2007 XLSX Test     Document")
                             ->setSubject("Office 2007 XLSX Test     Document")
                             ->setDescription("Test document for         Office 2007 XLSX, generated using PHP classes.")
                             ->setKeywords("office 2007 openxml     php")
                             ->setCategory("Test result file");


// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Hello')
            ->setCellValue('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A4', 'Miscellaneous glyphs')
            ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');


// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);


// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

В вашем logged_in.php вы повторяете следующее:

echo '<p>You are logged in as '. $_SESSION['username']. '.</p>';

после опций вы включаете create_excel.php, где вы пытаетесь изменить заголовок:

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');

Но еслихотите изменить заголовок, это должно быть сделано первым!Если вы выводите что-то еще, вы получите ошибку при попытке изменить заголовок ...

1 голос
/ 20 июня 2011
  echo '<p>You are logged in as '. $_SESSION['username']. '.</p>';
  // require the PHPExcel file
  require 'create_excel.php';

В этом ваша проблема. Вы отправляете вывод клиенту, а затем хотите изменить заголовки и сделать что-то еще. Это не работает таким образом.

Подумайте об этом:

  echo '<p>You are logged in as '. $_SESSION['username']. '.</p>';
   // link to the PXPExcel file
  echo '<a href=\'create_excel.php\'>To Excel!</a>';

Или просто вывести файл excel без сообщения для входа:

  require 'create_excel.php';
1 голос
/ 20 июня 2011

Кажется, что есть какой-то вывод, прежде чем вы установите заголовки. Перед отправкой заголовков не должно быть никаких выводов.

Даже пустая строка может вызвать эту ошибку.

В вашем скрипте вы включаете loggedinn.php, а файл taht повторяет некоторую строку. Это вызывает ошибку, которую вы получаете.

php header() функция четко заявляет.

Помните, что header () должен быть вызван перед отправкой любого фактического вывода, либо обычными тегами HTML, пустым строки в файле или из PHP. Это очень распространенная ошибка при чтении кода include () или require (), функции или другая функция доступа к файлу, и есть пробелы или пустые строки, которые выводятся перед заголовком () вызывается. Такой же проблема существует при использовании одного Файл PHP / HTML.

Самый простой способ предотвратить это - перенаправить пользователей, не вошедших в систему, на страницу входа. По крайней мере, вам не следует продолжать создавать код Excel, если пользователь не вошел в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...