header location не фунциклирует

1. Virtuozzo (17.12.2016 / 14:50)
Всем привет! Есть страница регистрации.
Проблема в следующем.
После записи данных юзера в бд не получается создать перенаправление.

2. Александр (17.12.2016 / 14:53)
Кидай сюда код, посмотрим. Так никто ничем не поможет.

3. Virtuozzo (17.12.2016 / 14:53)
<?php

$title = 'Регистрация';
include_once($_SERVER["DOCUMENT_ROOT"].'/style/head.php');
ob_start();
?>
<div class="title">Регистрация</div>
<?
if(isset($_GET['ok'])){
	?>
	<div class="success">
		Вы успешно зарегистрировались!<br/>
		<a href="/" class="link">Перейти на сайт</a>
	</div>
	<?
	include_once($_SERVER["DOCUMENT_ROOT"].'/style/foot.php');
	exit();
}
mode('guest');
if(isset($_POST['ok'])){

	$_POST['nick']=guard($db->real_escape_string($_POST['nick']));
	$_POST['name']=guard($db->real_escape_string($_POST['name']));
	$_POST['email']=guard($db->real_escape_string($_POST['email']));
	
	if(empty($_POST['nick'])){
		$error = 'Введите ник!';
	}elseif(mb_strlen($_POST['nick']) < 2){
		$error = 'Ник должен содержать не менее двух символов!';
	}elseif(empty($_POST['password1'])){
		$error = 'Введите пароль!';
	}elseif(empty($_POST['password2'])){
		$error = 'Введите подтверждение пароля!';
	}elseif(empty($_POST['name'])){
		$error = 'Введите имя!';
	}elseif(mb_strlen($_POST['name']) < 2){
		$error = 'Имя должно содержать в себе хотя бы 2 символа!';
	}elseif(empty($_POST['email'])){
		$error = 'Введите E-Mail!';
	}elseif(mb_strlen($_POST['email']) < 5){
		$error = 'E-Mail должен содержать как минимум 5 символов!';
	}elseif($_POST['password1'] != $_POST['password2']){
		$error = 'Пароли не совпадают!';
	}elseif(!preg_match('/[0-9a-z_\-]+@[0-9a-z_\-^\.]+\.[a-z]{2,6}/i', $_POST['email'])){
		$error = 'Неверно введен E-Mail';
	}elseif($db->query("SELECT * FROM `users` WHERE `email`='".$_POST['email']."'")->num_rows != 0){
		$error = 'Пользователь с таким E-Mail уже существует!';
	}elseif($db->query("SELECT * FROM `users` WHERE `nick`='".$_POST['nick']."'")->num_rows != 0){
		$error = 'Пользователь с таким ником уже существует!';
	}elseif(mb_strlen($_POST['nick'])>40){
		$error = 'Длинна ника должна быть менее 40 символов!';
	}
	


4. Virtuozzo (17.12.2016 / 14:56)
	if(isset($error)){
		?>
		<div class="error"><?=$error?></div>
		<?
	}else{
		$db->query("INSERT INTO `users` SET `nick`='".$_POST['nick']."', `password`='".md5($_POST['password1'])."', `name`='".$_POST['name']."', `email`='".$_POST['email']."', `date_reg`='".time()."'");
		setcookie("nick", $_POST['nick'], time()+86000);
		setcookie("password", md5($_POST['password1']), time()+86000);
      header('location:?ok');
	}
}
?>
<div class="text">
	<form action="" method="POST">
		Придумайте ник:<br/>
		<input type="text" name="nick"><br/>
		Придумайте пароль:<br/>
		<input type="password" name="password1"><br/>
		Повторите пароль:<br/>
		<input type="password" name="password2"><br/>
		Введите имя:<br/>
		<input type="text" name="name"><br/>
		Введите ваш E-Mail:<br/>
		<input type="text" name="email"><br/>
		<input type="submit" name="ok" value="Зарегистрироваться">
	</form>
</div>
<?

include_once($_SERVER["DOCUMENT_ROOT"].'/style/foot.php');
?>


5. Удаленный (17.12.2016 / 15:03)
Вроде как setcookie() и header() не должны быть на одной странице.
Да и адрес в location надо указывать полностью вместе с http://

6. Virtuozzo (17.12.2016 / 15:06)
frasi, Но при "выходе" с сайта есть так-же удаление кукесов и
setcookie("nick", "");
	setcookie("password", "");
header('location:/');
и тут он работает как положено, не смотря на то что стоит с сеткуки

7. Удаленный (17.12.2016 / 15:08)
А вообще в таких случаях надо включать показ ошибок, чтоб не гадать на кофейной гуще

8. Virtuozzo (17.12.2016 / 15:13)
frasi, Включены. Но ничего не показывает. Получается что у меня после нажатия кнопки заносятся данные в бд и стр. просто обновляется с чистыми формами для ввода.

9. Удаленный (17.12.2016 / 15:22)
Virtuozzo, куки записываются?

10. Virtuozzo (17.12.2016 / 15:25)
frasi, Пардон D Закомментировал показ ошибок.

Warning: Cannot modify header information - headers already sent by (output started at /home/user/site.ru/htdocs/www/modules/login/reg.php:1) in /home/user/site.ru/htdocs/www/modules/login/reg.php on line 89

Warning: Cannot modify header information - headers already sent by (output started at /home/user/site.ru/htdocs/www/modules/login/reg.php:1) in /home/user/site.ru/htdocs/www/modules/login/reg.php on line 90

Warning: Cannot modify header information - headers already sent by (output started at /home/user/site.ru/htdocs/www/modules/login/reg.php:1) in /home/user/site.ru/htdocs/www/modules/login/reg.php on line 91

Нет. Кукесы не записывает

11. Нариман (17.12.2016 / 15:26)
У тебя header уже отдается текущая страница, судя по всему та, что подключена в
include_once($_SERVER["DOCUMENT_ROOT"].'/style/head.php');

12. Удаленный (17.12.2016 / 15:28)
Значит у тя перед header() идет вывод хтмл-кода. Так делать нельзя

Добавлено через 00:52 сек.
Пиши хтмл-вывод только с помощью echo '';

13. Virtuozzo (17.12.2016 / 15:49)
Roberto, Ну по идее он должен отправить на эту же страницу из reg.php в reg.php?ok но он не отправляет никуда. + ругается на
эти три строки
  setcookie("nick", $_POST['nick'], time()+86000);
		setcookie("password", md5($_POST['password1']), time()+86000);
      header('location:?ok');


14. Удаленный (17.12.2016 / 15:52)
Я ж говорю, у тя вывод перед хедером. Поставь ob_start(); в самом начале файла шапки или перед инклудом

15. Артур (17.12.2016 / 15:54)
Файл /style/head.php в студию

16. Virtuozzo (17.12.2016 / 16:00)
frasi, У меня там он прописан

17. Александр (17.12.2016 / 16:03)
Судя по всему у тебя пишет уже в шапке что-то.

18. Virtuozzo (17.12.2016 / 16:04)
Башка,
<?php

ob_start();

include_once($_SERVER["DOCUMENT_ROOT"].'/system/function.php');
?>
<!DOCTYPE HTML>
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title><?=$title?></title>
	<link rel="shortcut icon" href="/style/images/icons/favicon.ico">
	<link rel="stylesheet" href="/style/css/style.css" type="text/css" />
</head>
<div class="head">
<a href="/"><img src="/style/images/logo.png"></a>
</div>
<?

if(!isset($user)){
	
	?>
	<div class="nvg">
		<a href="/login">Авторизация</a><br/>
		<a href="/reg">Регистрация</a>
	</div>
	<?
}else{

?>
<div class="nvg">
	<a href="/cabinet">Личный кабинет</a><br/>
	<a href="/exit">Выход</a>
</div>
<?
}
?>


19. Александр (17.12.2016 / 16:06)
http://cannot-modify-header-information.ru/

Добавлено через 01:38 сек.
И header('location:?ok'); укажи с header('location: reg.php?ok');

20. Артур (17.12.2016 / 16:08)
где то в начале файла какой нить пробельный символ запрятался, или UTF BOM.

21. ramzes (17.12.2016 / 23:00)
<?php

$title = 'Регистрация';
include_once($_SERVER["DOCUMENT_ROOT"].'/style/head.php');
ob_start();
?>
тут надо поменять местами подключение шапки и включение буфферизации. шапка генерирует ответ сервера до включения ob_start, соответственно, ниже шапки ни какие заголовки отправленны не будут. в т.ч. и куки и редиректы

22. Virtuozzo (18.12.2016 / 11:58)
ramzes, Спасибо. Только надо было в начале стр. добавить
Header("Content-Type: text/html; charset=utf8"); 
А менять буфер с шапкой пробовал, выдавало только белую страницу.

Добавлено через 03:37 сек.
ramzes, Сейчас всё работает как часы.

23. Александр (18.12.2016 / 18:24)
Так запись у тебя шла после заголовков. Дал ведь ссылку там все описано и как раз твой случай был.

24. Virtuozzo (18.12.2016 / 20:34)
Randy, Ну вот я ж оттуда и нашёл решение. За что спасибо ^_^

URL: https://visavi.net/topics/43306