За последние 24 часа нас посетили 52507 программистов и 1794 робота. Сейчас ищут 826 программистов ...

Проблема с cookie

Тема в разделе "PHP для новичков", создана пользователем riaron, 18 май 2017.

  1. riaron

    riaron Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    247
    Симпатии:
    4
    Пишу часть сайта которая отвечает за регистрацию. столкнулся с ошибкой отправки куков:
    "Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\mysite1.local\index.php:1)"
    Проверял код в netbeans 8.1. Программа никаких ошибок не показала. Проверял множество раз вроде ошибок нет.
    подскажите в чем проблема.
    сайт состоит и з трех файлов index.php autorisation.inc.php и left.inc.php";
    Вот код index.php:
    PHP:
    1.  <?php include "lib/autorisation.inc.php";
    2. include "lib/left.inc.php";
    3. ?>
    вот код autorisation.inc.php :
    PHP:
    1. <?php
    2.   ini_set('display_errors', 1);
    3.   error_reporting(E_ALL);    
    4.   # Соединямся с БД
    5.  $link=mysqli_connect("localhost", "root", "", "shoplambo");
    6.   #Сложность хэша
    7.  $length=10;
    8.   #Проверка
    9.  $message="one";
    10.     class Autorise{
    11.     public $ssid;
    12.     public $schash;
    13.     public $server;
    14.     public $login;
    15.     public $password;
    16.     public $trigger;
    17.     #Функция отображения формы
    18.  
    19.      #Генератор хэша
    20.    public function generateCode($length) {
    21.       global $message;
    22.       $message.=" generateCode ";
    23.       $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    24.       $code = "";
    25.       $clen = strlen($chars) - 1;
    26.       while (strlen($code) < $length) {
    27.         $code .= $chars[mt_rand(0,$clen)];
    28.       }
    29.       return $code;
    30.     }
    31.     #Функция проверки залогинен ли пользователь  
    32.    public function login(){
    33.       global $link;
    34.       global $message;
    35.       $message.="login1";
    36.       global $link;  
    37.       global $length;  
    38.       $query = mysqli_query($link,"SELECT user_id, user_password FROM users WHERE user_login='".mysqli_real_escape_string($link,$this->login)."' LIMIT 1");
    39.       $data = mysqli_fetch_assoc($query);
    40.       #Сравниваем пароли
    41.      if($data['user_password'] === md5(md5($this->password))){
    42.         # Генерируем случайное число и шифруем его
    43.        $hash = md5($this->generateCode($length));
    44.         if(!@$trigger){
    45.          
    46.           #Переводим IP в строку
    47.          $insip = ", user_ip=INET_ATON('".$this->server."')";
    48.         }
    49.    
    50.         # Записываем в БД новый хеш авторизации и IP
    51.        mysqli_query($link, "UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
    52.    
    53.         # Ставим куки
    54.        setcookie("id", $data['user_id'], time()+60*60*24);
    55.         setcookie("hash", $hash, time()+60*60*24);
    56.         $message.="right pass";
    57.         header( "Location: index.php" );
    58.       }else{
    59.                 $message.="wrong pass";
    60.       }
    61.     }
    62.  
    63.              
    64.     public function check(){
    65.       global $message;
    66.       global $link;
    67.         $query = mysqli_query($link,"SELECT user_id, user_password FROM users WHERE user_login='".mysqli_real_escape_string($link,$this->loginl)."' LIMIT 1");
    68.         $data = mysqli_fetch_assoc($query);
    69.        if(($data['user_hash'] !== $this->schash) or ($data['user_id'] !== $this->ssid))    {
    70.            setcookie("id", "", time() - 3600*24, "/");
    71.            setcookie("hash", "", time() - 3600*24, "/");
    72.           #Хеш неправильный
    73.          $message.="hash wrong";
    74.           return false;
    75.        }else{
    76.           $message.="hash valid";
    77.           return true;
    78.        }
    79.     }
    80.      
    81.   }
    82.  
    83.   #Процедура авторизации
    84.  $myaqutor= new Autorise;
    85.   $myaqutor->ssid=filter_input(INPUT_COOKIE,"id");
    86.   $myaqutor->schash=filter_input(INPUT_COOKIE,"hash");
    87.   $myaqutor->server=filter_input(INPUT_SERVER,"REMOTE_ADDR");
    88.   $submit=filter_input(INPUT_POST,"submitlogin");
    89.  
    90.  
    91.   global $drawInputForm;
    92.     if(isset($submit)){
    93.       $myaqutor->login=filter_input(INPUT_POST,"loginlogin");
    94.       $myaqutor->password=filter_input(INPUT_POST,"passwordlogin");
    95.       $myaqutor->trigger=filter_input(INPUT_POST,"not_attach_ip");
    96.       $myaqutor->login();
    97.      
    98.     }else{
    99.      
    100.       if (isset($myaqutor->ssid) and isset($myaqutor->schash)){
    101.         if(!$myaqutor->check()){
    102.           global $drawInputForm;
    103.           $drawInputForm=true;
    104.           $message.="Check 2";
    105.         }
    106.         $message.="Check 1";
    107.         $drawInputForm=false;
    108.       }else{
    109.         global $drawInputForm;
    110.         global $message;
    111.         $message.="not isset";
    112.         $drawInputForm=true;
    113.       }
    114.      
    115.   }
    116.  
    117. ?>
    вот код: left.inc.php
    PHP:
    1. <?php
    2. global $drawInputForm;
    3.   function drawInput($drawInputForm){
    4.       global $message;
    5.       if($drawInputForm){
    6.         ?>
    7.           <form method="POST">
    8.           loginlogin <input name="loginlogin" type="text"><br>
    9.           passwordlogin <input name="passwordlogin" type="password"><br>
    10.           not_attach_ip(danger) <input type="checkbox" name="not_attach_ip"><br>
    11.           <input name="submitlogin" type="submit" value="submitlogin">
    12.           </form>
    13.         <?
    14.         $message.=" Drawing ";
    15.       }
    16.   }
    17.     echo " $message";
    18.     drawInput($drawInputForm);
    19.     ?>
     
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    а перевести не пробовали ошибку?
     
  3. riaron

    riaron Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    247
    Симпатии:
    4
    Не козыряйте знанием английского не прочитав код. В autorisation.inc.php нет ни одного echo и ни одного вызова функции setcookies которая помешала бы выполнению вызову setcookies(так как функции login и check не запускаются одновременно) в конце документа autorisation.inc.php.
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @riaron данная ошибка вам говорит что все заголовки должны быть отправлены до строения дом документа.
    это касаемо всех подключаемых файлов которые компилируются.
    Вы считаете себя умнее php компилятора ? Тогда не пользуйтесь им!
    --- Добавлено ---
    @riaron и ещё есть такая умная вещь которая помогает переводить google translate .
    И ещё советую почитай доку про отправление каких либо заголовков (headers) браузеру.
    https://secure.php.net/manual/en/function.header.php
    --- Добавлено ---
    и ещё простите но что это за чушь ?
    PHP:
    1.  function drawInput($drawInputForm){
    2.       global $message;
    3.       if($drawInputForm){
    4.         ?>
    5.           <form method="POST">
    6.           loginlogin <input name="loginlogin" type="text"><br>
    7.           passwordlogin <input name="passwordlogin" type="password"><br>
    8.           not_attach_ip(danger) <input type="checkbox" name="not_attach_ip"><br>
    9.           <input name="submitlogin" type="submit" value="submitlogin">
    10.           </form>
    11.         <?
    12.         $message.=" Drawing ";
    13.       }
    14.   }
    15.     echo " $message";
    16.     drawInput($drawInputForm);
    Кто показал или сами додумались?
    впервые вижу такое написание функций это вообще нормально отрабатывать должно ?