Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: headers already sent by ...
 
 автор: Jovidon   (02.10.2012 в 12:17)   письмо автору
 
 

Здарова народ
Извитите за названию темы

Чтобы зайти в админскую часть сайта изпользую этот скрипт

<?php
if (!isset($_SERVER['PHP_AUTH_USER']))

{
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
}

else {
        if (!
get_magic_quotes_gpc()) {
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
        }

        
$query "SELECT pass FROM system_lock WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
        
$lst = @mysql_query($query);

        if (!
$lst)
        {
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
        }

        if (
mysql_num_rows($lst) == 0)
        {
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }

        
$pass =  @mysql_fetch_array($lst);
        if (
$_SERVER['PHP_AUTH_PW']!= $pass['pass'])
        {
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }


}
?>

Когда сайт был на локалном компютере всё работал никакую ощибку не выдовал.

Вот только повесил в интерене выдаёт ощибку:
Warning: Cannot modify header information - headers already sent by (output started at /home/content/14/9917914/html/admin/index.php:1) in /home/content/14/9917914/html/admin/config/lock.php on line 8


Я начинаюши программист. Скажите пожалуйста в чом проблема?
Спасибо

  Ответить  
 
 автор: Lotanaen   (02.10.2012 в 13:28)   письмо автору
 
   для: Jovidon   (02.10.2012 в 12:17)
 

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

  Ответить  
 
 автор: Jovidon   (02.10.2012 в 13:54)   письмо автору
 
   для: Lotanaen   (02.10.2012 в 13:28)
 

Никоких пробелов даже это тоже ощибку выдаёт
<?php
  
////////////////////////////////////////////////////////////
  // 2005-2008 (C) Кузнецов М.В., Симдянов И.В.
  // PHP. Практика создания Web-сайтов
  // IT-студия SoftTime 
  // http://www.softtime.ru   - портал по Web-программированию
  // http://www.softtime.biz  - коммерческие услуги
  // http://www.softtime.mobi - мобильные проекты
  // http://www.softtime.org  - некоммерческие проекты
  ////////////////////////////////////////////////////////////
  // Выставляем уровень обработки ошибок 
  // (http://www.softtime.ru/info/articlephp.php?id_article=23)
  
error_reporting(E_ALL & ~E_NOTICE);

  
// Если пользователь не авторизовался - авторизуемся
  
if(!isset($_SERVER['PHP_AUTH_USER']) || (!empty($_GET['logout']) && $_SERVER['PHP_AUTH_USER'] == $_GET['logout'])) 
  { 
    
Header("WWW-Authenticate: Basic realm=\"Control Page\""); 
    
Header("HTTP/1.0 401 Unauthorized"); 
    exit(); 
  } 
  else 
  { 
    
// Утюжим переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'],
    // чтобы мышь не проскочила
    
if (!get_magic_quotes_gpc())
    {
      
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
      
$_SERVER['PHP_AUTH_PW']   = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
    }
    
    
$query "SELECT pass FROM system_lock WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
    
$lst = @mysql_query($query); 
    
// Если ошибка в SQL-запросе - выдаём окно
    
if(!$lst)
    {
      
Header("WWW-Authenticate: Basic realm=\"Control Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
    
// Если такого пользователя нет - выдаём окно
    
if(mysql_num_rows($lst) == 0)
    {
      
Header("WWW-Authenticate: Basic realm=\"Control Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
    
// Если все проверки пройдены, сравниваем хэши паролей
    
$account = @mysql_fetch_array($lst);
    if(
md5($_SERVER['PHP_AUTH_PW']) != $account['pass'])
    {
      
Header("WWW-Authenticate: Basic realm=\"Control Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
  }
?>


Warning: Cannot modify header information - headers already sent by (output started at /home/content/14/9917914/html/admin/index.php:1) in /home/content/14/9917914/html/admin/config/lock.php on line 18

Warning: Cannot modify header information - headers already sent by (output started at /home/content/14/9917914/html/admin/index.php:1) in /home/content/14/9917914/html/admin/config/lock.php on line 19

  Ответить  
 
 автор: confirm   (02.10.2012 в 14:00)   письмо автору
 
   для: Jovidon   (02.10.2012 в 13:54)
 

Вы не просто читайте сообщение об ошибке, а анализируйте их, так как в них указано в каких строках уже был вывод.

  Ответить  
 
 автор: Jovidon   (02.10.2012 в 17:03)   письмо автору
 
   для: confirm   (02.10.2012 в 14:00)
 

но как?
на локалном компе не выдовал ощибок

  Ответить  
 
 автор: confirm   (02.10.2012 в 17:42)   письмо автору
 
   для: Jovidon   (02.10.2012 в 17:03)
 

Проверяйте условия свои, у вас получается выполнение условия, передача заголовка и опять выполнение условия, после которого опять передача заголовка. Судя по сообщениям это так, вот и ищите причину.

  Ответить  
 
 автор: Jovidon   (02.10.2012 в 23:43)   письмо автору
 
   для: Jovidon   (02.10.2012 в 13:54)
 

Народ скажите пожалуйста.
Как исправить эту ощибку?

  Ответить  
 
 автор: Sfinks   (03.10.2012 в 00:56)   письмо автору
 
   для: Jovidon   (02.10.2012 в 23:43)
 

Прикрепите для этого к сообщению свой файл /admin/index.php
(только поудаляйте из него, если есть, персональные и секретные данные - логины, пароли и т.п.)
Только не скопипастите, а именно прикрепите. Можно сделать копию файла и удалить из него все, что ниже строки:
<?php

  Ответить  
 
 автор: confirm   (03.10.2012 в 08:31)   письмо автору
 
   для: Sfinks   (03.10.2012 в 00:56)
 

Ошибка гласит, что передача заголовка ..... lock.php

  Ответить  
 
 автор: Sfinks   (03.10.2012 в 09:58)   письмо автору
 
   для: confirm   (03.10.2012 в 08:31)
 

Ошибка гласит, что lock.php не может передать заголовки на строках 18,19 (и их мы видим в теме), т.к. вывод начат файлом index.php на строке 1.
И раз ТС сам не может найти этот вывод, очень похоже, что речь идет о каком-то непечатаемом символе.
Поэтому и прошу прикрепить файл, а не скопипастить его код.

  Ответить  
 
 автор: confirm   (03.10.2012 в 21:35)   письмо автору
 
   для: Sfinks   (03.10.2012 в 09:58)
 

Видимо да, то, что он тут выставил скорее похоже на lock.php.

  Ответить  
 
 автор: Jovidon   (04.10.2012 в 22:59)   письмо автору
 
   для: Sfinks   (03.10.2012 в 00:56)
 

Прикрепите для этого к сообщению свой файл /admin/index.php
(только поудаляйте из него, если есть, персональные и секретные данные - логины, пароли и т.п.)
Только не скопипастите, а именно прикрепите. Можно сделать копию файла и удалить из него все, что ниже строки:


Зделат так.
файл index.php
<?php
    
// Соединение с БД
    
require_once("config/connect.php"); 
    
// Замок
    
require_once("config/lock.php");
?>


файл lock.php

<?php
  error_reporting
(E_ALL & ~E_NOTICE);

  
// Если пользователь не авторизовался - авторизуемся
  
if(!isset($_SERVER['PHP_AUTH_USER']) || (!empty($_GET['logout']) && $_SERVER['PHP_AUTH_USER'] == $_GET['logout'])) 
  { 
    
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
    
Header("HTTP/1.0 401 Unauthorized"); 
    exit(); 
  } 
  else 
  { 
    
// Утюжим переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'],
    // чтобы мышь не проскочила
    
if (!get_magic_quotes_gpc())
    {
      
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
      
$_SERVER['PHP_AUTH_PW']   = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
    }
    
    
$query "SELECT pass FROM system_lock 
              WHERE user='"
.$_SERVER['PHP_AUTH_USER']."'";
    
$lst = @mysql_query($query); 
    
// Если ошибка в SQL-запросе - выдаём окно
    
if(!$lst)
    {
      
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
    
// Если такого пользователя нет - выдаём окно
    
if(mysql_num_rows($lst) == 0)
    {
      
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
    
// Если все проверки пройдены, сравниваем хэши паролей
    
$account = @mysql_fetch_array($lst);
    if(
md5($_SERVER['PHP_AUTH_PW']) != $account['pass'])
    {
      
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
  }
?>


Ощибка.
Warning: Cannot modify header information - headers already sent by (output started at /home/content/14/9917914/html/admin/index.php:1) in /home/content/14/9917914/html/admin/config/lock.php on line 7

Warning: Cannot modify header information - headers already sent by (output started at /home/content/14/9917914/html/admin/index.php:1) in /home/content/14/9917914/html/admin/config/lock.php on line 8


А можеть у меня проблема с хостингом?

  Ответить  
 
 автор: cheops   (05.10.2012 в 09:18)   письмо автору
 
   для: Jovidon   (04.10.2012 в 22:59)
 

У вас какая кодировка используется? UTF-8? Проследите, чтобы в файле index.php в первой строчке не было невидимого BOM-символа, который некоторые редакторы подставляют в UTF-8-файлы (а он судя по всему там есть).

  Ответить  
 
 автор: Jovidon   (06.10.2012 в 00:33)   письмо автору
 
   для: cheops   (05.10.2012 в 09:18)
 

изменял всё на без BOM-символи ощибку не показываеть но выважу логин и пароль не могу зайти
да вроде всё правилно заполняю. Папробовал через другой user тоже также.

В чем проблема не могу понять

Скажите плиз

  Ответить  
 
 автор: cheops   (06.10.2012 в 08:46)   письмо автору
 
   для: Jovidon   (06.10.2012 в 00:33)
 

А в config/connect.php BOM тоже удален?

  Ответить  
 
 автор: Jovidon   (06.10.2012 в 11:50)   письмо автору
 
   для: cheops   (06.10.2012 в 08:46)
 

Да.

На локальном компютере работает а на сервере нет

  Ответить  
 
 автор: mihdan   (07.10.2012 в 12:30)   письмо автору
 
   для: Jovidon   (06.10.2012 в 11:50)
 

На сервере РНР установлен как CGI или как модуль Apache? Данный способ эффективен только тогда, когда PHP функционирует в качестве модуля веб-сервера Apache. Если на вашем хостинге PHP работает в режиме CGI/FastCGI и описанный выше метод работать не будет, поскольку переменные PHP_AUTH_USER и PHP_AUTH_PW не будут передаваться внутрь скрипта.

Решение есть через mod_rewrite:


RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]


Подробнее...

  Ответить  
 
 автор: Jovidon   (07.10.2012 в 16:45)   письмо автору
 
   для: mihdan   (07.10.2012 в 12:30)
 

Сработала :)

Спасибо всем, чтобы у вас руки не болели икогда

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования