Консультация № 173966
04.11.2009, 15:43
0.00 руб.
0 6 1
У меня такая проблема, на странице регистрации
Код:
<?php
session_start();
include("include/user_register/functions.inc.php");
include_once("include/connectdb.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Виртуальная футбольная лига - VSOL</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<LINK media=screen href="index.css" type=text/css rel=stylesheet>
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<META content="MSHTML 6.00.6000.16448" name=GENERATOR>
<script language="javascript">
<!--
required = new Array("nick", "pass", "rpass", "mail", "komanda", "sid");
required_show = new Array("введите свой Логин!", "введите свой Пароль!","подтвердите свой Пароль!","введите свой E-mail!","введите название основной команды во ВСОЛе!", "введите контрольный код!");

function sendform() {
//функция проверки присутствия не заполненых полей
var i, j;

for(j=0; j<required.length; j++) {
for (i=0; i<document.forms[0].length; i++) {
if (document.forms[0].elements.name == required[j] && document.forms[0].elements[i].value == "" ) {
alert('Будьте бдительны: ' + required_show[j]);
document.forms[0].elements[i].focus();
return false;
}
}
}
//функция проверки мыла
p_email = document.getElementById('regForm').mail.value.toString();
if (p_email != "") {
t = p_email.indexOf("@");
if((p_email.indexOf(".") == -1) || (t == -1) || (t < 1) || (t > p_email.length - 5) || (p_email.charAt(t - 1) == '.') || (p_email.charAt(t + 1) == '.')) {
alert("Некорректно указан E-mail !");
document.getElementById('regForm').mail.focus();
return false;
}
}
return true;



}

//-->

</script>
</HEAD>
<BODY>
<DIV class=bl id=bl-top>ВСОЛ Daily - фан-сайт on-line менеджера - www.virtualsoccer.ru</DIV>
<DIV class=bl id=bl-head>
<TABLE>
<TBODY>
<TR>
<TH noWrap align=left width=280><A href="index.php"><B>ВСОЛ Daily</B><BR>фан-сайт</A> </TH>
<TD align=middle width="100%"></TD>
<TD noWrap align=right width=500>Счёт для пожертвований и спонсорской помощи
/<span style="color : red; font-size: 18">Я</span>41001245927522 /</TD></TR></TBODY></TABLE></DIV>
<DIV class=bl style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: 5px; PADDING-TOP: 5px; TEXT-ALIGN: left">
<DIV style="FLOAT: right; MARGIN-RIGHT: 5px"></DIV>
 <B>Главред: <span style="color : red">TOK</B></span>

</DIV>
<!--//================================================-->
<DIV class=bl id=bl-main>
<TABLE>
<TBODY>
<TR>
<TD id=tb-main-c>

<!--//================================================================-->
<center>
<div id="div-regForm">
<div class="form-title">РЕГИСТРАЦИЯ</div>
<?php
if(!$_POST['do'] OR $_POST['do'] =='') {
//Генерируем шестизначный ключ для капчи
if($_SESSION['uid'] =='') { $_SESSION['uid'] = mt_rand(100000,999999); }
echo '<div class="form-sub-title">Зарегистрируйся и наслаждайся!!!</div>
<form id="regForm" action="forma_register.php" method="post" onsubmit="return sendform();">
<table>
<tbody>
<tr>
<td><label for="name">Ваш логин:</label></td>
<td><div class="input-container"><input name="nick" id="nick" type="text" /></div></td>
</tr>
<tr>
<td><label for="password">Пароль:</label></td>
<td><div class="input-container"><input name="pass" id="pass" type="password" /></div></td>
</tr>
<tr>
<td><label for="password2">Подтвердите пароль:</label></td>
<td><div class="input-container"><input name="rpass" id="rpass" type="password" /></div></td>
</tr>
<tr>
<td><label for="email">Ваш Email:</label></td>
<td><div class="input-container"><input name="mail" id="mail" type="text" /></div></td>
</tr>
<tr>
<td><label for="komanda">Имя основной команды во ВСОЛе:</label></td>
<td><div class="input-container"><input name="komanda" id="komanda" type="text" /></div></td>
</tr>
<tr>
<td><img src="img/capcha/capcha.php?sid='.$_SESSION['uid'].'"/></td>
<td><div class="input-container"><input name="sid" id="sid" type="text" value="" /></div></td>
</tr>
<tr>
<td> </td>
<td><input name="do" type="submit" class="Button" value="Помчались..." /></td>
</tr>
</tbody>
</table>
</form>';
}
//Если данные отправлены
if($_POST['do'] !='') {
//Начинаем проверять входящие данные
if($_POST['sid'] == $_SESSION['uid']) {

//Создаем запрос к базе для проверки существования Пользователя

$nick = $_POST['nick'];
mysql_query("SELECT * FROM users WHERE nick='".$nick."'");
//Проверка результата запроса

if(mysql_affected_rows()==0) {
//Проверка ввведенных паролей

if($_POST['pass'] !='' AND $_POST['rpass'] !='' AND $_POST['pass'] === $_POST['rpass']){
//Проверяем на валидность электронный адрес
if(checkmail($_POST['mail']) !== -1) {

//Осуществляем регистарацию
//Генерируем uniq_id
$uniq_id = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].mktime());
$pass = $_POST['pass'];
$email = $_POST['mail'];
$komanda = $_POST['komanda'];
//Создаем запрос для записи данных в БД
$r = "INSERT INTO users(nick, password, email, komanda, uniq_id, status, last_date, date) VALUES('".$nick."','".md5($pass)."','".$email."','".$komanda."','".$uniq_id."',0,'".date("dmY")."','".date("dmY")."')";
mysql_query ($r) or die (mysql_error());

//После запроса отправляем письмо юзеру, для активации аккаунта
if($r) {

// Для отправки e-mail в виде HTML устанавливаем необходимый mime-тип и кодировку
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";

// Откуда пришло
$headers .= 'From: Сайт www.daily-vsol.hut.ru' . "\r\n";

//Здесь укажите электронный адрес, куда будут уходить сообщения
$mailto = $email;
$subject = "Подтверждение регистарции на сайте";
$message = 'Для активации аккаунта пройдите по следующей ссылке <a href="http://www.daily-vsol.hut.ru/forma_register.php?
activation='.$uniq_id.'" target="_blank">http://www.daily-vsol.hut.ru/forma_register.php?activation='.$uniq_id.'</a>';
$message .= 'или скопируйте ссылку в окно ввода адреса браузера и нажмите enter.';
//Отправляем сообщение
if(sendmail($mailto,$subject,$message,$headers) !== FALSE) {
echo 'Регистрация завершена, на введеный Вами e-mail было отправлено сообщение для активации аккаунта';
}
else {echo 'Регистрация невозможна: Повторите запрос позднее';}
}
else {echo 'Регистрация невозможна: Повторите запрос позднее';}
}
else {echo 'Регистрация невозможна: Электронный адрес должен соответствовать шаблону <b>name@domen.com</b><br/><a href="forma_register.php"/>назад</a>';}

}
else {echo 'Регистрация невозможна: Введенные пароли не совпадают<br/><a href="forma_register.php"/>назад</a>';}


}
else { echo 'Регистрация невозможна: Пользователь с таким именем уже существует<br/><a href="forma_register.php"/>назад</a>';}


session_destroy();
}
else { echo 'Регистрация невозможна: код подтверждения введен не верно<br/><a href="forma_register.php"/>назад</a>';}

}
//Модуль отвечающий за активацию аккаунта

if($_GET['activation'] AND $_GET['activation']!='') {

$uniq_id = $_GET['activation'];
//Создаем запрос
$r=mysql_query("UPDATE users SET status=1 WHERE uniq_id='".$uniq_id."' AND status=0");
if($r) {echo '<h2>Ваша учетная запись активирована.</h2><br/> Теперь вы можете войти на сайт используя данные

указанные при регистрации. <a href="index.php">На главную</a>';}

else {echo 'Активация невозможна: профиль уже активирован';}

}?>

</center>
<!--//================================================================-->
</TD>
<TD id=tb-main-r>
<DIV class=menu>
<H4></H4>
<UL>
<LI><A href="index.php"><font size="+3">ВСОЛ Daily</font></A>
<LI>
<LI><A href="sigrannost.php">Сыгранность</A>
<LI><A href="http://dailyvsol.easyforum.ru/" TARGET="_blank">Форум</A>
<LI><A href="files/HelpVSOL_v.1.5(1.93Mb).exe">Скачать HelpVSOL_v.1.5(1.93Mb)</A>
</UL></DIV>
</TD></TR></TBODY></TABLE></DIV>
<DIV class=bl id=bl-sub>
<TABLE>
<TBODY>
<TR>
<TD noWrap></TD>
<TH width="100%">2009 © <A href="#">VSOL
Daily</A></TH></TR></TBODY></TABLE></DIV>
</BODY></HTML>


при переходе по ссылкам на другие страницы вылазит такое ругательство

[i]Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 6 in Z:\home\test1.ru\www\include\user_register\uni-auth.php on line 55

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\test1.ru\www\sigrannost.php:15) in Z:\home\test1.ru\www\include\user_register\uni-auth.php on line 25


Я уже всё кажись перепробывал, но ничего не помогло. Подскажите как с этим бороться. Вот файл uni-auth.php

Код:
<?php
/*
Универсальный скрипт авторизации.
Используется сессии для хранения данных.
Скрипт типа "всё-в-одном" - его необходимо
включать в каждый файл для использования.
Распространяется по лицензии BSD.

+Требования:
+-Mysql & PHP5
+-Созданое подключение к MySQL и запущеная сессия =)

(c)2008 Vasilii B. Shpilchin
*/

##Определяем константы
define('USERS_TABLE','users');
define('SID',session_id());
##Определяем функции
//Функция выхода.
//Пользователь считается авторизированым, если в сессии присутствует uid
//см. "Действия - если пользователь авторизирован".
function logout() {
session_unregister('uid'); //Удаляем из сессии ID пользователя
die(header('Location:'.$_SERVER['PHP_SELF']));
}

//Функция входа.
//Все выбраные поля записываются в сессию.
//Таким образом, при каждом просмотре страницы не надо выбирать их заново.
//Для обновления информации из БД можно пользоваться этой же функцией - имя и пароль
//хранятся в сессиях
function login($username,$password) {
$result = mysql_query("SELECT * FROM `".USERS_TABLE."` WHERE `nick`='$username' AND `password`='$password';")
or die(mysql_error());
$USER = mysql_fetch_array($result,1); //Генерирует удобный массив из результата запроса
if(!empty($USER)) { //Если массив не пустой (это значит, что пара имя/пароль верная)
$_SESSION = array_merge($_SESSION,$USER); //Добавляем массив с пользователем к массиву сессии

mysql_query("UPDATE `".USERS_TABLE."` SET `sid`='".SID."' WHERE `uid`='".$USER['uid']."';")
or die(mysql_error());
return true;
}
else {
return false;
}
}

//Функция проверки залогинности пользователя.
//При входе, ID сессии записывается в БД.
//Если ID текущей сессии и SID из БД не совпадают, производится logout.
//Благородя этому нельзя одновременно работать под одним ником с разных браузеров.
function check_user($uid) {
$result = mysql_query("SELECT `sid` FROM `".USERS_TABLE."` WHERE `uid`='$uid';");
$sid = mysql_result($result, 0);
return $sid==SID ? true : false;
}

##Действия - если пользователь авторизирован
if(isset($_SESSION['uid'])) { //Если была произведена авторизация, то в сессии есть uid

//Константу удобно проверять в любом месте скрипта
define('USER_LOGGED',true);
//Создаём удобные переменные
//Все поля таблицы пользователей записываются в сесси (см. стр. 35-37)
//Таким образом, после добавления нового поля в таблицу надо дописать лишь одну строку
$UserName = $_SESSION['nick'];
$UserPass = $_SESSION['password'];
$UserID = $_SESSION['uid'];
}
else {
define('USER_LOGGED',false);
}

##Действия при попытке входа
if (isset($_POST['login'])) {

if(get_magic_quotes_gpc()) { //Если слеши автоматически добавляются
$_POST['user']=stripslashes($_POST['user']);
$_POST['pass']=stripslashes($_POST['pass']);
}
$user = mysql_real_escape_string($_POST['user']);
$pass = md5($_POST['pass']);
if(login($user,$pass)) {
header('Refresh: 0');
die('Вы успешно авторизировались!');
}
else {
header('Refresh: 3;');
die('Пароль неправильный!');
}

}

##Действия при попытке выхода
if(isset($_GET['logout'])) {
logout();
}?>


Кстати, сам автор файла аутентификации тоже в растерянности:(

Обсуждение

Неизвестный
04.11.2009, 16:25
общий
это ответ
Здравствуйте, vasja1601.
Скорей всего у Вас в функции check_user() результат запроса ничего не возвращает и поэтому $sid = mysql_result($result, 0); возвращает первый Warning
Попробуйте переписать функцию как указано в приложении

Приложение:
function check_user($uid) {
$result = mysql_query("SELECT `sid` FROM `".USERS_TABLE."` WHERE `uid`='$uid';");
if (($result)&&(mysql_num_rows($result)==1)){
$sid = mysql_result($result, 0);
return $sid==SID ? true : false;
} else {
return false;
}
}
5
Вы просто Бог php!!!
Неизвестный
04.11.2009, 17:02
общий
Selax:
Ещё бы с
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\test1.ru\www\sigrannost.php:15) in Z:\home\test1.ru\www\include\user_register\uni-auth.php on line 25

разобраться. Читал про это здесь http://phpfaq.ru/headers, у меня вроде всё правильно написано.
Неизвестный
04.11.2009, 17:26
общий
vasja1601:
Судя по строке эта ошибка вылазит в функции logout().
По идее функция die() это аналог функции exit(). Они завершают текущий скрипт и выводят сообщение указанное в параметре функции. Вы же параметром функции передаете вывод заголовка. Может я и не прав, но такой конструкции я не встречал. Попробуйте просто написать header('Location:'.$_SERVER['PHP_SELF']); без die(...)
Если же ошибка все равно будет, то просмотрите внимательно на то место где применяется функция logout(). Скорей всего до этой функции пишется какое-либо сообщение (например, что пользователь уже залогинен) или выводятся тэги HTML. К сожалению на странице регистрации у вас нет примера авторизации пользователей.
P.S. Кстати строки:
$nick = $_POST['nick'];
mysql_query("SELECT * FROM users WHERE nick='".$nick."'");
являются отличной дырой для sql-инъекций. Вы подставляете необработанное значение переменной $nick в sql-запрос. А в этой переменной может быть все что угодноСделайте $nick = mysql_real_escape_string($_POST['nick']);
Неизвестный
04.11.2009, 17:53
общий
Selax:
Вот страница с функцией logout()
Код:
<?php
session_start();
include("include/user_register/functions.inc.php");
include_once("include/connectdb.php");
include('include/user_register/uni-auth.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Виртуальная футбольная лига - VSOL</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<META content="MSHTML 6.00.6000.16448" name=GENERATOR>
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<LINK media=screen href="index.css" type=text/css rel=stylesheet>
<script type="text/javascript" src="js/jquery-1.3.1.js"></script>
<script type="text/javascript" src="js/jquery.autocomplete.js"></script>
<script language="javascript">
<!--
function createXMLHttp() {
if(typeof XMLHttpRequest != "undefined") { // для браузеров аля Mozilla

return new XMLHttpRequest();
} else if(window.ActiveXObject) { // для Internet Explorer (all versions)
var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0",
"MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp",
"Microsoft.XMLHttp"
];
for (var i = 0; i < aVersions.length; i++) {
try { //
var oXmlHttp = new ActiveXObject(aVersions[i]);

return oXmlHttp;
} catch (oError) {

}
}
throw new Error("Невозможно создать объект XMLHttp.");
}
}
/* Очень важная функция, обратите на неё внимание.
Формирует строку запроса "name1=value1&name2=value2&name3...".
Принимает один аргумент - ссылку на форму.
*/

function getRequestBody(oForm) {
var aParams = new Array();
for(var i = 0; i < oForm.elements.length; i++) {
var sParam = encodeURIComponent(oForm.elements[i].name);
sParam += "=";
sParam += encodeURIComponent(oForm.elements[i].value);
aParams.push(sParam);
}
return aParams.join("&");
}


/* В этой ф-ции мы создаём объект XmlHttp, формируем запрос, инициализируем перехватчик состояний
onreadystatechange, и посылаем наш запрос.

Обратите внимание, что во втором аргументе метода open(..) мы передаём
ссылку на oForm.action, это сделано как из соображений безопасности, так и ради
того что-бы сценарий можно-было бы использовать для работы с несколькими страницами.

Так-же, стоит отметить факт отправки дополнительного заголовка: "appilaction/x-www-form-urlencoded"
Большинство языков (в том числе и PHP), требуют этого, для корректного выполнения
синтаксического анализа пришедших данных. Этот момент очень важен.

*/

function sendRequest() {
var oForm = document.forms[0];
var sBody = getRequestBody(oForm);
var oXmlHttp = createXMLHttp();

oXmlHttp.open("POST",oForm.action, true);
oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

oXmlHttp.onreadystatechange = function() {
if(oXmlHttp.readyState == 4) {
if(oXmlHttp.status == 200) {
saveResult(oXmlHttp.responseText);
} else {
saveResult("Ошибка: " + oXmlHttp.statusText);
}
}
};

oXmlHttp.send(sBody);
}

function saveResult(sText) {
var sElem = document.getElementById("divStatus");
sElem.innerHTML = sText;
}

// функция скрывающая список выбора через 200мс после вызова
function hide() {
setTimeout("$('#suggestions').hide()", 200); }
// hide вызывается при изменении поля ввода
function lookup(inputString) {
if(inputString.length == 0) {
// если длина в поле ввода нулевая то скрываем блок выбора
hide();
} else {
// посылаем данные методом post на сервер
$.post("select_players.php", {q: ""+inputString+""}, function(data){
// функция срабатывающая при получении ответа
if(data.length > 0) {
// если вообще какие то данные получены то просто их отображаем
$('#suggestions').show();
$('#autoSuggestionsList').html(data);
}
});
}}
// lookup эта функция вызывается когда произошел клик по списку выбора городов
function fill(thisValue) {
// заполняет input занчением
$('#inputString').val(thisValue);
// скрывает список
hide();
}
// fill
//-->
</script>


</HEAD>
<BODY>
<DIV class=bl id=bl-top>ВСОЛ Daily - фан-сайт on-line менеджера - www.virtualsoccer.ru </DIV>
<DIV class=bl id=bl-head>
<TABLE>
<TBODY>
<TR>
<TH noWrap align=left width=280><A href="index.php"><B>ВСОЛ Daily</B><BR>фан-сайт</A> </TH>
<TD align=middle width="100%"></TD>
<TD noWrap align=right width=500>Счёт для пожертвований и спонсорской помощи
/<span style="color : red; font-size: 18">Я</span>41001245927522 /</TD></TR></TBODY></TABLE></DIV>
<DIV class=bl style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: 5px; PADDING-TOP: 5px; TEXT-ALIGN: left">
<DIV style="FLOAT: right; MARGIN-RIGHT: 5px"></DIV>
 <B>Главред: <span style="color : red"></B></span>

 <i><b>Юзер:</b> <?php
if(USER_LOGGED) {
if(!check_user($UserID)) logout();
echo $UserName;
echo '<h4><a href="?logout"><i> Выход</i></a></h4>';
}?></i>
</DIV>
<DIV class=bl id=bl-main>
<TABLE>
<TBODY>
<TR>
<TD id=tb-main-c>
<DIV class=text>
<h2 align="center"> Расчёт состава </h2>
<?php
include_once("sigr_forma.php");
?>
</DIV>
</TD>
<TD id=tb-main-r>
<?php
if(USER_LOGGED) {//тут ничего не нано
}
else {
echo '<DIV class=menu>
<H4></H4><A href="forma_register.php">Регистрация</A> / <A
href="#">Забыли?</A><BR>
<TABLE width=200 align=center>
<FORM class=flog action="';
echo $_SERVER['PHP_SELF'];
echo '" method=post>
<TBODY>
<TR>
<TD>Логин</TD>
<TD colSpan=2><INPUT style="WIDTH: 100%" name="user"></TD></TR>
<TR>
<TD>Пароль</TD>
<TD colSpan=2><INPUT style="WIDTH: 100%" type=password
name="pass"></TD></TR>
<TR>
<TD></TD>
<TD><INPUT class=inp_ch id=inp_ch_id type=checkbox name=l-rem></TD>
<TD><LABEL for=inp_ch_id>Запомнить</LABEL></TD></TR>
<TR>
<TD align=right colSpan=3><INPUT style="FONT-WEIGHT: bold; FONT-SIZE: 10px" type=submit value=ВОЙТИ name="login">
</TD></TR></FORM></TBODY></TABLE></DIV>';}?>
<DIV class=menu>
<H4></H4>
<UL>
<LI><A href="index.php"><font size="+3">ВСОЛ Daily</font></A>
<LI>
<LI><A href="sigrannost.php">Сыгранность</A>
<LI><A href="http://dailyvsol.easyforum.ru" TARGET="_blank">Форум</A>
<LI><A href="files/HelpVSOL_v.1.5(1.93Mb).exe">Скачать HelpVSOL_v.1.5(1.93Mb)</A>
</UL>
</DIV>
</TD></TR></TBODY></TABLE></DIV>
<DIV class=bl id=bl-sub>
<TABLE>
<TBODY>
<TR>
<TD noWrap></TD>
<TH width="100%">2009 © <A href="index.php">VSOL
Daily</A></TH></TR></TBODY></TABLE></DIV>
</BODY></HTML>


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

За дыру, отдельное спасибо, думал что уже везде проверил, ан нет, эту страницу пропустил.
Неизвестный
04.11.2009, 18:31
общий
vasja1601:
Вставьте шестой строчкой следующий код(чтобы он был ДО вывода DOCTYPE)
Код:
if ((USER_LOGGED)&&(!check_user($UserID))) {
logout();
}

А там где вы выводите юзера строку if(!check_user($UserID)) logout(); уберите
Неизвестный
04.11.2009, 19:10
общий
Selax:
Не, ну вы просто волшебник
Форма ответа