2014-09-27 3 views
0

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

Heres мой Войти Форма:

<form method="post" action="auth.php"> 
       User:<br /> 
       <input type="text" name="name" required><br /><br /> 
       Password:<br /> 
       <input type="password" name="pass" class="input" required><br /><br /> 
       <button>LOGIN</button> 

</form> 

И "auth.php":

include '../conection.php'; 

$user = $mysqli->real_escape_string($_POST['name']); 
$pass = sha1($mysqli->real_escape_string($_POST['pass'])); 

if(isset($user)){ 

$users = $mysqli->query("select * from admins where admin_user='".$user."' and admin_pass='".$pass."' "); 

if($users->fetch_object()){ 
     session_start(); 
     $_SESSION['user'] = $user; 
     //Im having troubles with this function 
     header('Location:control.php'); 
     exit; 

}else{ 
    echo 'Sorry no access<br /><br />'; 
    //if i remove the "//" to the next header function works in local and hosting 
    //header('Location:index.php'); 
} 

}else{ 
echo 'Sorry no access<br /><br />'; 
} 

$mysqli->close(); 

ПРЕДУПРЕЖДЕНИЯ: первая: session_start(): Не удается отправить ограничитель сессии кэш. 2nd: Невозможно изменить информацию заголовка.

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

За вашу помощь, спасибо.

+0

вам следует использовать подготовленные заявления http://php.net/manual/en/mysqli.prepare.php , и используйте [хеширование пароля] (http://php.net/manual/en/ref.password.php) PHP – Ghost

+0

попробуйте изменить имя вашего файла. вместо auth.php сделать его authenticate.php. Я получил эту странную проблему и до –

+0

@RobertDeanPantino Я не думаю, что имя файла имеет значение –

ответ

0

использовать код, который следует, я поставил код для запуска все самостоятельно, изменив действия на action="" и добавив isset() к новой кнопке отправки. После этого вы можете разделить их.

Не используйте <button>LOGIN</button> с условным заявлением if(isset($_POST['submit'])), это не сработает. Он основан на новой кнопке отправки, которую я включил ниже.

Для первого очертить ошибки:

if($us = $users->fetch_object()) - $us является бродячим переменным, которая ничего не делает; его необходимо удалить.

Линия должна читать как if($users->fetch_object())

также следующее должно быть удалено; есть не соответствующее if условие для этого:

else{ 
echo 'Sorry no access<br /><br />'; 
} 

Вы уже изложив его в: (но не использовать эхо с заголовком)

else{ 
    echo 'Sorry no access<br /><br />'; 
    //if i remove the "//" to the next header function works in local and hosting 
    header('Location:index.php'); 
} 

относительно headers already sent, что обусловлено с помощью эха и заголовка, а также проверьте, есть ли у вас место перед открытием тега <?php или byte order mark (сохраните ваши файлы как UTF-8 без спецификации). Это может быть фактором, если вы все еще получите эту ошибку после удаления эха.

Убедитесь, что над ним нет ничего. Возможно, вам удастся сменить ob_start(); после вашего открытия <?php.

echo $user вызывает это, поэтому просто удалите его и используйте заголовок. Держите echo только TEST, но при этом комментируйте заголовок. Вы не должны повторять что-либо выше заголовка, HTML и т. Д.

Это echo 'Sorry no access<br /><br />';, где вы должны удалить его. Это либо echo, либо header, вы не можете использовать их оба.

Вы можете прочитать на headers already sent здесь:

Код: (см комментарии в коде)

<?php 

include '../conection.php'; 

$user = $mysqli->real_escape_string($_POST['name']); 
$pass = sha1($mysqli->real_escape_string($_POST['pass'])); 

    if(isset($_POST['submit'])){ 

    $users = $mysqli->query("select * from admins where admin_user='".$user."' and admin_pass='".$pass."' "); 

    if($users->fetch_object()){ 
      session_start(); 
      $_SESSION['user'] = $user; 
      //Im having troubles with this function 
      header('Location:control.php'); 
       exit; 

    // echo $user; // don't use this with header 

    }else{ 
     // echo 'Sorry no access<br /><br />'; // don't use this with header 
     //if i remove the "//" to the next header function works in local and hosting 
     header('Location:index.php'); 
     exit; 
    } 


} // brace for if(isset($_POST['submit'])) 

$mysqli->close(); 

?> 

<form method="post" action=""> 
       User:<br /> 
       <input type="text" name="name" required><br /><br /> 
       Password:<br /> 
       <input type="password" name="pass" class="input" required><br /><br /> 
       <input type="submit" name="submit" value="Submit"> 
<br> 

</form> 
+1

Puuum! Фред, я очень ценю вашу помощь, ваш ответ был очень полезен и работает. Надеюсь когда-нибудь вернуть эту услугу. Еще один маленький вопрос: что вы рекомендуете мне продолжать учиться? С уважением. – Christian

+0

@ Христиан Ты очень рад Кристиану. Вы можете прочитать [** подготовленные заявления **] (http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php) или [** PDO с подготовленными заявлениями **] (http://php.net/pdo.prepared-statements), * они намного безопаснее *. Они немного больше работают, но хорошо стоят усилий, * поверьте мне *. Кроме того, если у вас есть что-то особенное, Stack - хорошее место, чтобы пройти через многие вопросы и * принять * ответы.Вы также можете использовать Google, который много раз, скорее всего, приведет вас сюда на Stack :) –

+0

@Christian Еще одна вещь, которую я рекомендую вам использовать, - [** CRYPT_BLOWFISH **] (http://security.stackexchange.com/q/36471) или PHP ['password_hash()'] (http://www.php.net/manual/en/function.password-hash.php). Для PHP <5.5 используйте ['password_hash() пакет совместимости'] (https://github.com/ircmaxell/password_compat). 'sha1' - не лучший метод хэширования; многим это больше не нравится. –

-1

Для того, чтобы начать с использованием подготовленных операторов Here

Во-вторых сделать это:

header('Location: control.php'); 
exit; 
+0

Спасибо, я использовал выход и не работает. Любая другая идея? – Christian

0

Функция заголовка() посылает заголовок HTTP сырой клиенту.

Важно заметить, что заголовок() должен вызываться перед любым фактическим выводом направляется

Смежные вопросы