Перейти к содержимому

Сервис обмена электронных валют


Регистрация на сайте

#1 cap4369

cap4369
  • Пользователь
  • 62 сообщений
  • Репутация: 1
0

Отправлено 17 Сентябрь 2013 - 10:41

Здравствуйте!
Помогите разобраться с проблемой. При создании регистрации на сайте, до момента внесения изменений в базу данных все происходит нормально. То есть регистрация проходит. Далее после задействования функции login($post) все "ломается", то есть исчезает правый сайдбар, в котором находится форма для входа на сайт и появляется ошибка:
Fatal error: Cannot redeclare link_article() (previously declared in Z:\home\blog.ru\www\functions.php:3) in Z:\home\blog.ru\www\functions.php on line 14
При этом, при вводе в адресной строке ссылки, полученной в почтовом эмуляторе, изменения в БД, а именно поле confirm (подтверждение регистрации) меняется с 0 на 1, то есть все работает нормально.
Код правого сайдбара:
<?php
session_start();
require "config.php";
require "functions.php";
if(isset($_POST['login']) && isset($_POST['password'])){

$msg = login($_POST);

if($msg === TRUE) {
  header("Location:index.php");
}
else{
  $_SESSION['msg'] = $msg;
  header("Location:".$_SERVER['PHP_SELF']);
}
exit();
}
?>
<!--   Правый сайдбар   -->
<div class="sidebar" id="sideRight">
<div id="bartable">
<div id="bartitle">
  Вход на сайт
</div><!--#bartitle-->
<div id="barcontent">
<p style="font-size: 11px; color: red;">
<?=$_SESSION['msg'];?>
<? unset($_SESSION['msg']); ?>
</p>
<form method="POST">
  <label style="font-size: 11px;">
   Логин:
   <input style="margin-left: 9px;" type="text" name="login">
  </label><br>
  <label style="font-size: 11px;">
   Пароль:
   <input type="password" name="password">
  </label><br>
  <label style="font-size: 11px;">
   Запомнить меня
   <input type="checkbox" name="member" value="1">
  </label><br>
  <input style="float:left; font-size: 11px;" type="submit" value="Вход"><br>
</form>

<form method="POST">
  <input style="margin-top: -18px; font-size: 11px;" type="submit" name="logout" value="Выход">
 
</form>
<p style="font-size: 10px; text-align: center;">
  <a href="registration.php">Регистрация</a> | <a href="returnpass.php">Забыли пароль?</a>
</p>   
</div><!-- #barcontent-->
</div><!-- #bartable-->
 
</div><!-- .sidebar#sideRight -->
<div id="clear"></div>
</div><!-- #middle-->

Код functions.php:
<?php
/* Регистрация пользователей */
function registration($post) {
$login = clean_data($post['reg_login']);
$password = trim($post['reg_password']);
$conf_pass = trim($post['reg_password_confirm']);
$email = clean_data($post['reg_email']);
$name = clean_data($post['reg_name']);

$msg = '';

if(empty($login)){
  $msg .= "Вы не ввели логин <br />";
}
if(empty($password)){
  $msg .= "Вы не ввели пароль <br />";
}
if(empty($email)){
  $msg .= "Вы не ввели Email <br />";
}
if(empty($name)){
  $msg .= "Вы не ввели имя <br />";
}
if($msg){
  $_SESSION['reg']['login'] = $login;
  $_SESSION['reg']['email'] = $email;
  $_SESSION['reg']['name'] = $name;
  return $msg;
}

if($conf_pass == $password){
  $sql = "SELECT `user_id` FROM `users` WHERE `login`='%s'"; // метка %s обозначает что необходимо вставить данные строкового типа
  $sql = sprintf($sql, mysql_real_escape_string($login));
 
  $result = mysql_query($sql);
 
  if(mysql_num_rows($result) > 0){
   $_SESSION['reg']['email'] = $email;
   $_SESSION['reg']['name'] = $name;
   return "Такой логин уже существует";
  }
 
  $password = md5($password);
  $hash = md5(microtime());
 
  $query = "INSERT INTO `users` (
		  `name`,
		  `login`,
		  `email`,
		  `password`,
		  `hash`)
	    VALUES (
		  '%s',
		  '%s',
		  '%s',
		  '%s',
		  '$hash'
		  )";
  $query = sprintf($query,
	    mysql_real_escape_string($name),
	    mysql_real_escape_string($login),
	    mysql_real_escape_string($email),
	    $password
	   );
  $result2 = mysql_query($query);
  if(!$result2){
   $_SESSION['reg']['login'] = $login;
   $_SESSION['reg']['email'] = $email;
   $_SESSION['reg']['name'] = $name;
   return "Ошибка при добавлении пользователя в базу данных".mysql_error();
  }
  else { // Отправляем сообщение пользователю о регистрации на сайте
   $headers = '';
   $headers .= "From: Admin <igor.nagay@mail.ru> \r\n";
   $headers .= "Content-Type: text/plain; charset=utf8";
  
   $tema = "Регистрация";
  
   $mail_body = "Вы успешно зарегистрировались на сайте. Ваша ссылка для подтверждения учетной записи: http://blog.ru/confirm.php?hash=".$hash;
  
   mail($email,$tema,$mail_body,$headers);
  
   return TRUE;
  
  }
}
else{
  $_SESSION['reg']['login'] = $login;
  $_SESSION['reg']['email'] = $email;
  $_SESSION['reg']['name'] = $name;
  return "Пароли не совпадают";
}
}
function clean_data($str) {
return strip_tags(trim($str));
}
function confirm(){

$new_hash = clean_data($_GET['hash']);

$query = "UPDATE `users` SET confirm = '1' WHERE `hash` = '%s'";

$query = sprintf($query,mysql_real_escape_string($new_hash));

$result = mysql_query($query);

if(mysql_affected_rows() == 1){
  return TRUE;
}
else {
  return "Неверный код подтверждения регистрации";
}
}
function check_user(){
return false;
}
function login($post){
if(empty($post['login']) || empty($post['password'])){istration
  return "Заполните поля";
}
}
?>

Код registration.php- вывод страницы с формой регистрации работает без проблем. Поэтому его не показываю.

 

 

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Сентябрь 2013 - 12:04

Ошибка:

Fatal error: Cannot redeclare link_article() (previously declared in Z:homeblog.ruwwwfunctions.php:3) in Z:homeblog.ruwwwfunctions.php on line 14

"говорит" о том, что функция link_article() уже была объявлена в файле функций на 3-ей строке... повторно объявлять (редикларировать) одну и ту же функцию - нельзя.
  • 0


#3 cap4369

cap4369
    Topic Starter
  • Пользователь
  • 62 сообщений
  • Репутация: 1

Отправлено 17 Сентябрь 2013 - 13:01

Но ведь я ее повторно нигде не объявлял, она нужна один раз для реализации постраничной навигации. Как же тогда выходит, что выводится такая ошибка? Может из за того, что в файле confirm.php(подтверждение регистрации) я вначале прописываю подключение файла functions.php, в котором перед реализацией функций регистрации и авторизации идут функции постраничной навигации и может есть смысл разнести их по разным файлам, сделать например что- то вроде functions_reg.php и подключать в нужных файлах?
  • 0

#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Сентябрь 2013 - 13:20

Но ведь я ее повторно нигде не объявлял...

Интерпретатор считает иначе...

Может из за того, что в файле confirm.php(подтверждение регистрации) я вначале прописываю подключение файла functions.php, в котором перед реализацией функций регистрации и авторизации идут функции постраничной навигации...

Если проблема в том, что файл с данной функцией подключается несколько раз, то, думаю, вполне достаточно ограничить его подключение одним разом, используя выражение require_once вместо require:
require_once "functions.php";

...и может есть смысл разнести их по разным файлам, сделать например что- то вроде functions_reg.php и подключать в нужных файлах?

Если выражение require_once не решит проблемы, то тут уж вам виднее... поскольку вы создаете приложение, то и должны быть знакомы с его структурой, в отличие от нас.
  • 0


#5 cap4369

cap4369
    Topic Starter
  • Пользователь
  • 62 сообщений
  • Репутация: 1

Отправлено 17 Сентябрь 2013 - 14:40

Да, require_once помогло решить проблему, спасибо! И я разнес функции по разным файлам. Честно говоря и не обратил на это внимания, упуская из виду что такие "мелочи" как раз и портят жизнь начинающим, не говоря уже о досадных опечатках или забывчивости в объявлении переменных и вызове функций. Еще раз спасибо!
  • 0

#6 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Сентябрь 2013 - 15:04

Пожалуйста.
  • 0


#7 cap4369

cap4369
    Topic Starter
  • Пользователь
  • 62 сообщений
  • Репутация: 1

Отправлено 17 Сентябрь 2013 - 16:23

Что- то сегодня проблема за проблемой! Не пойму почему при проверке заполнения полей функцией login($post), появляется ошибка:
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\blog.ru\www\index.php:15) in Z:\home\blog.ru\www\right.php on line 15
15-я строка файла right.php, это header()- перенаправление на текущую страницу:
<?php
session_start();
require_once "config.php";
require_once "functions_reg.php";
if(isset($_POST['login']) && isset($_POST['password'])){

$msg = login($_POST);

if($msg === TRUE) {
  header("Location:admin/index.php"); // переход на страницу панели администратора в папке admin
}
else{
  $_SESSION['msg'] = $msg;
  header("Location:".$_SERVER['PHP_SELF']); // перенаправление на текущую страницу, с которой осуществлялась регистрация
}
exit();
}
?>

Функция login:
function login($post){
if(empty($post['login']) || empty($post['password'])){
  return "Заполните поля";
}

  • 0

#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Сентябрь 2013 - 17:47

Проблема стара, как мир. В этой статье перечислены варианты ее решения. Если вкратце, то перед использованием функции редиректа не должно быть никакого вывода в браузер... а он у вас есть, и не в файле right.php, а в файле index.php в районе 15-ой строки.
Наиболее частые ее причины:
1) банальный пробел или перенос строки (это все - вывод в браузер) в html-коде (вне тегов php)
2) файл сохранен в кодировке UTF-8 with BOM... нужно пересохранить в кодировке UTF-8 without BOM (если используется юникод)
В общем, знакомимся со статьей выше.
  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru