Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с куками и ссесиями
 
 автор: tokmak   (13.02.2007 в 13:54)   письмо автору
 
 

Как можно сделать, чтобы после регистрации нового пользователя и при выходе на этот сайт не надо было выполнять вход вводя пароль и логин. И было разделение на модераторов, администраторов и простых юзеров.

   
 
 автор: Loki   (13.02.2007 в 15:20)   письмо автору
 
   для: tokmak   (13.02.2007 в 13:54)
 

Хранить данные авторизации в куках а статус в БД

   
 
 автор: tokmak   (13.02.2007 в 16:09)   письмо автору
 
   для: Loki   (13.02.2007 в 15:20)
 

Я в базе данных создал статус юзер. А как с помощью сессии и cookies можно сделать авторизацию. Хотя бы на примере. Или может темка была подобная. Ввобще как оно должно происходить. Вот например новый пользователь регистрируется. При последнем этапе регистрации его данные заносятся в БД и на компьютер автоматически отправляется куки и автоматически происходит ссесия.
В общем вопросики такие: 1) Как создать куки с именем пользователя и праолем
2) как осуществить условие "если user не зарегистрирован, то писать например здравствуй гость; если user зарег. и его статус пользователь, то писать здравствуй $user ваш статус пользователь; если user зарег. и его статус модератор или админ, то писать соответсвенно понятно.
Я приблизительно знаю что куки создается с помощью функции setcookies() Хотелось бы узнать ответы на мои вопросы.

   
 
 автор: tokmak   (13.02.2007 в 16:43)   письмо автору
 
   для: tokmak   (13.02.2007 в 16:09)
 

Ну про помогите я просто с куками и ссесиями не работал. Хотя бы скажите на что надо ориентрироваться. Ну хотя бы так можно написать. Если ты не зарег. то пишет привет гость; если ты зарег. то пишет привет $name. если ты покинул сайт, а затем вернулся например через час, то авторизация не нужна. Плизз помогите очень нужно. Я пишу пишу один только ответил. а что-то больше никто.

   
 
 автор: Sl   (13.02.2007 в 17:29)   письмо автору
 
   для: tokmak   (13.02.2007 в 16:43)
 

Если делать с куками, то можно написать например

setcookie("name",$_REQUEST['name'])

Здесь у нас имя отправленное из формы, отправляется в куки, но только до закрытия браузера. Чтобы на долго запомнить куки, нужно еще время указать, но я не помню как его указывать надо
Потом чтобы узнать, зарегистрировался ли раньше пользователь или нет, нужно проверить куки на существование. Если куки с именем 'name' не существует то выводим допустим - Привет гость, если куки существует то выводим например - Привет $_COOKIE['name']
Вот возможо так будет выглядеть


<?
if(!isset($_COOKIE['name']))
{
?>
Привет <b>Гость</b>
<form action="" method=post>
<input type=text name='name'>
<input type=submit name="doGo">
</form>
<?
}
else  echo 
"Привет <b>".$_COOKIE['name']."</b>"
?>
<?
if(isset($_REQUEST['doGo']))
{
    
setcookie("name",$_REQUEST['name'],time()+3600); # Запомнили куки на час
}
?>

Скрипт не проверял. Находу написал.
Посмотри, авось работает =)

   
 
 автор: tokmak   (13.02.2007 в 20:06)   письмо автору
 
   для: Sl   (13.02.2007 в 17:29)
 

Что-то не хочет работать пишет

Warning: Cannot modify header information - headers already sent by (output started at z:\home\www.agnet.ru\www\in.php:10) in z:\home\www.agnet.ru\www\in.php on line 17

что это может быть? Заранее спасибо. Жду ответа.

   
 
 автор: Whi-teOoS   (13.02.2007 в 20:15)   письмо автору
 
   для: tokmak   (13.02.2007 в 20:06)
 

> ...headers already sent by...

Перед выставлением куков или юзанием header(), НИЧЕГО не должно выводиться в браузер.

в вашем случае вы что-то выводите на 17 строке, скрипта in.php

   
 
 автор: Whi-teOoS   (13.02.2007 в 20:19)   письмо автору
 
   для: Sl   (13.02.2007 в 17:29)
 

Разве if так рвать можно?

   
 
 автор: tokmak   (13.02.2007 в 20:25)   письмо автору
 
   для: Whi-teOoS   (13.02.2007 в 20:19)
 

Ну исходя из данного кода написанный Sl как я вижу никакого вывода нет. setcookie() это же не вывод, вы сами это знаете. А больше я ничего не изменял. Ну конечно пробовал, но все равно тоже самое выходило сообщение, с помощью include тоже самое. Whi-teOoS ты бы сам как поступил в данном случае, может быть ты предложишь свой вариант.

   
 
 автор: Whi-teOoS   (13.02.2007 в 20:29)   письмо автору
 
   для: tokmak   (13.02.2007 в 20:25)
 

я бы if рвать не стал

<? 
if(!isset($_COOKIE['name'])) 

   echo(
"Привет Гость 
   <form method=post> 
   <input type=text name=\'name\'> 
   <input type=submit name=\"doGo\"> 
   </form> "
);

else  echo 
"Привет <b>".$_COOKIE['name']."</b>";   
if(isset(
$_POST['name'])) 

    
setcookie("name",$_POST['name'],time()+3600); # Запомнили куки на час 

?>

   
 
 автор: Trianon   (13.02.2007 в 20:30)   письмо автору
 
   для: tokmak   (13.02.2007 в 20:25)
 

Интересно... а

Привет <b>Гость</b> 
- это не вывод?

   
 
 автор: tokmak   (13.02.2007 в 20:35)   письмо автору
 
   для: Trianon   (13.02.2007 в 20:30)
 

Whi-teOoS ты проверял свой скрипт? Он вообще пишет всегда "привет гость".

   
 
 автор: Whi-teOoS   (13.02.2007 в 20:59)   письмо автору
 
   для: tokmak   (13.02.2007 в 20:35)
 

во первых код не мой, а во вторых

<?
error_reporting
(E_ALL);
if(isset(
$_POST['fname']))  
{  
    
setcookie("name",$_POST['fname'],time()+3600,"/"); # Запомнили куки на час  
}
if(!isset(
$_COOKIE['name']) || !isset($_POST['fname']))  
{
    echo(
"<HTML>
        <BODY>
            Привет Гость  
            <form action=\"\" method=\"post\">
                <input type=text name=\"fname\">
                <input type=submit value=\"send\">
            </form> 
        </BODY>
    </HTML>"
); 
}
else
{
    echo 
"Привет <b>".$_COOKIE['name']."</b>";
}
?>


П.С. незабудте обновить страницу.

   
 
 автор: tokmak   (13.02.2007 в 21:14)   письмо автору
 
   для: Whi-teOoS   (13.02.2007 в 20:59)
 

Попробовал и этот код. Все равно пишет

Warning: Cannot modify header information - headers already sent by (output started at z:\home\www.agnet.ru\www\in.php:2) in z:\home\www.agnet.ru\www\in.php on line 6
Привет гость
поле и кнопка

Whi-teOoS он выдает эту ошибку и пишет привет гость. что-то не то, а случайно в php.ini не надо ничего менять. И как раз на линии 6 раположен код

setcookie("name",$_POST['fname'],time()+3600,"/"); # Запомнили куки на час

Ничего не пойму, что ему теперь нужно.

   
 
 автор: bronenos   (13.02.2007 в 21:39)   письмо автору
 
   для: tokmak   (13.02.2007 в 21:14)
 

Такие вещи как header(), setcookie(), session_***() и некоторые другие ТРЕБУЮТ, чтобы они вызывались ДО любого вывода вроде echo, print и даже лишних пробелов перед <?php
Так что проверьте свой скрипт на отсутствие таковых мест, у вас ошибка именно на такое и указывает
Или в крайнем случае в самом начале ставьте
ob_start();
а в самом конце
ob_end_flush();

Так этих ошибок не будет

   
 
 автор: Ralph   (14.02.2007 в 00:01)   письмо автору
 
   для: bronenos   (13.02.2007 в 21:39)
 

Кстати,вопрос на тему "Убить куки -2".Вот аборигены сьели куки,а у меня ну никак...Вроде все просто до омерзения-ссылка "Выход" перекидывает на exit.php,код которого начинается как
<?php

setcookie
('name','',1000);

setcookie('name')...
.Ну никак не хотят умирать,собаки :(

   
 
 автор: Ralph   (14.02.2007 в 00:07)   письмо автору
 
   для: Ralph   (14.02.2007 в 00:01)
 

Никакого вывода перед ними,как видите-нет,а если бы и прокрался левый символ,то на период тестирования я всегда выставляю E_ALL.Может,это как-то связано с тем,что я работаю через OperaMini ? ( time()-чего то не предлагать-не помогает :) ) Жду Ваших мнений...

   
 
 автор: Whi-teOoS   (14.02.2007 в 00:22)   письмо автору
 
   для: Ralph   (14.02.2007 в 00:07)
 

tokmak, когда писал не поленился, проверил, все работает, вероятно как указал Броненос у вас перед <?php стоят "лишние" символы, потому как строка на которую вы указали не 6 а 5.
Ralph, под оперой у меня куки мрут только после
setcookie("current_user",$_COOKIE['current_user'],time() - 6356800,"/",false);

   
 
 автор: tokmak   (14.02.2007 в 09:30)   письмо автору
 
   для: Whi-teOoS   (14.02.2007 в 00:22)
 

Whi-teOoS , в принцепи код заработал, ошибка была в том, что и в правду не надо делать лишних символов. У меня строка <?php начиналась со второй строки. Поднял на первую и скрипт заработал. мне теперь осталось сделать разделение на пользователей, модераторов и администраторов. Это скорее всего и будет проверка с помощью БД. А чтобы посетитель мог спокойно ходить по страницам то что нужно писать session_start() и все или нет?

   
 
 автор: tokmak   (14.02.2007 в 12:29)   письмо автору
 
   для: tokmak   (14.02.2007 в 09:30)
 

Посмотрите пожалуста вот этот код.

<?
include("config.php");

if (isset(
$_COOKIE['name'])) {
    echo 
"Привет <b>".$_COOKIE['name']."</b>";
    
$cook $_COOKIE['name'];
mysql_connect($hostname,$login,$password$db) or die("No connect");
mysql_select_db("$db") or die("No select DB");
$query="select * from authors where name like '$cook%' AND statususer like '$statususer%'";

$result=mysql_query($query);
$i=0;
$user_name=mysql_result($result,$i,"statususer");
if  (
$user_name == 2) {
    echo(
"Ваш статус админ"); } else { echo("Ваш статус пользователь"); }

    } else
    {
error_reporting(E_ALL);
if(isset(
$_POST['fname']))   {
if (isset(
$cook)) {  setcookie("name"); }
 
setcookie("name",$_POST['fname'],time()+3600,"/"); # Запомнили куки на час
}
if(!isset(
$_COOKIE['name']) || !isset($_POST['fname']))
{
    echo(
"<HTML>
        <BODY>
            Привет Гость
            <form action=\"\" method=\"post\">
                <input type=text name=\"fname\">
                <input type=submit value=\"send\">
            </form>
        </BODY>
    </HTML>"
);
}
else
{
    echo 
"Привет <b>".$_COOKIE['name']."</b>";
}
     }
?>


Кто нибудь может написать скрипт типо этого, чтобы происходило сравнение если в бд статус например 2, то писать привет админ имя, если например 1 то привет пользователь имя
В общем чтобы голову не морочить никому, пример такой "как на данном форуме существует при открытии этого форумма он мне сразу пишет привет токмак. Но еще плюс нужно чтобы писало статус пользователь, а кто админ или модератор писал соответсвующее. Может у кого есть готовый или в моем что-то можно изменить, а то че то ни как не вьеду.

   
 
 автор: tokmak   (14.02.2007 в 12:45)   письмо автору
 
   для: tokmak   (14.02.2007 в 12:29)
 

Люди подскажите пжалуста. Loki <<Хранить данные авторизации в куках а статус в БД
Вот насчет этого я и прошу показать хотя бы примерно.

   
 
 автор: tokmak   (14.02.2007 в 12:55)   письмо автору
 
   для: tokmak   (14.02.2007 в 12:45)
 

Либо никто не знает на мой вопрос ответ, либо знает не не хочет отвечать, либо просто не хочет думать, либо никого на форуме нет. cheops может ты знаешь как поступить с данным скриптом. Как сделать чтобы он работал? я всего лишь несколько месяцев изучаю PHP многое уже запомнил и усвоил, но с этой темой беда какая-то, хотя можети не беда, просто если знаешь это то и легко сделать. Уже кучу скачал книг и справочников. Может кто-нибудь ответит мне. Плиз.

   
 
 автор: Loki   (14.02.2007 в 13:15)   письмо автору
 
   для: tokmak   (14.02.2007 в 12:29)
 

<?
$statuses
=array(0=>"гость"1=>"юзер"2=>"админ");
$status=0;
if (
$_SERVER['REQUEST_METHOD']=="POST")
{
if (!
get_magic_quotes_gpc())
{
$name=mysql_escape_string($_POST['name']);
$pass=mysql_escape_string($_POST['pass']);
}
else
{
$name=$_POST['name'];
$pass=$_POST['pass'];
}
$result=mysql_query("SELECT user_status FOM users WHERE login='$name' AND pass='$pass'");
if (
mysql_num_rows($result)==1)
{
 
$status=mysql_result($result0);
}
}
echo 
"Привет ".$statuses[$status]." ".$_POST['name'];

   
 
 автор: tokmak   (14.02.2007 в 13:31)   письмо автору
 
   для: Loki   (14.02.2007 в 13:15)
 

В общем я постараюсь объяснить свой вопрос. Можно ли так сделать
При открытии страницы index.php если посетитель не зарегистрирован Вы ходит строка «привет гость» если посетитель зарегистрирован то пишет «привет $name – ваш статус пользователь, модератор, администратор».
Ни как я не пойму.
Ну вот например на всех форумах так есть, есть и свои ограничения.
Может тогда кто нибудь может сбросить ссылку или файл как писать форумы или Интернет-магазины доски объявлений.
Или может уроки какие-нибудь есть по данной тематике.
Спасибо за прочтение моей большущей теме. Заранее спасибо за ответ. Жду.

   
 
 автор: Loki   (14.02.2007 в 13:43)   письмо автору
 
   для: tokmak   (14.02.2007 в 13:31)
 

в таблице пользователей проставляется статус пользователя, либо принадлежность к группе. Если используются группы, то права доступа проставляются для группы, а если нет, то для статусов (или даже для отдельных пользователей, но это реже).

   
 
 автор: Sl   (14.02.2007 в 13:47)   письмо автору
 
   для: tokmak   (14.02.2007 в 13:31)
 

tokmak, ты хочешь целый форум написать ? =)

   
 
 автор: tokmak   (14.02.2007 в 13:53)   письмо автору
 
   для: Sl   (14.02.2007 в 13:47)
 

Sl, нет я изучаю язык php чтобы затем писать какие-либо web-приложения. А про учебники я написал потому что в тех же форумах так и так используются эти функции, скорее всего там и написанно как правильнос ними работатть. Ну что нету, да? Если можете обьясните на примере. как это работает.

   
 
 автор: tokmak   (14.02.2007 в 15:05)   письмо автору
 
   для: tokmak   (14.02.2007 в 13:53)
 

Loki может ответишь на мой вопрос

   
 
 автор: Loki   (14.02.2007 в 16:44)   письмо автору
 
   для: tokmak   (14.02.2007 в 15:05)
 

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

Все. Вся наука.

   
 
 автор: tokmak   (14.02.2007 в 18:56)   письмо автору
 
   для: Loki   (14.02.2007 в 16:44)
 

Можно узнать что это за ошибка.

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 7 in z:\home\www.agnet.ru\www\sc2.php on line 19


   
 
 автор: alek_chita   (15.02.2007 в 15:33)   письмо автору
 
   для: tokmak   (14.02.2007 в 18:56)
 

Вы пытаетесь извлечь не существующую запись. Для предотвращения такой ошибки удобно воспользоваться функцией mysql_num_rows();

<?php
$test 
mysql_query($query);
if(
mysql_num_rows($test) > 0) echo mysql_result($test);
?>


Источник: MYSQL5 в подлиннике. Кузнецов. Сидянов. из-во BHV стр.861

   
 
 автор: Loki   (15.02.2007 в 16:53)   письмо автору
 
   для: alek_chita   (15.02.2007 в 15:33)
 

лучше

f(mysql_num_rows($test) == 0)

   
 
 автор: tokmak   (15.02.2007 в 16:56)   письмо автору
 
   для: Loki   (15.02.2007 в 16:53)
 

А вы не могли бы составить код по моей проблеме?

   
 
 автор: alek_chita   (15.02.2007 в 18:16)   письмо автору
 
   для: tokmak   (15.02.2007 в 16:56)
 

Я тоже только начинаю изучать сессии и куки, поэтому не уверен, в правильности, те не менее попробуйте:
пароль в базе лучше хранить зашифрованным ассиметричным методом (MD5 например) и посылать пользователю хеш отпечаток.


<?php
 
if(isset($_COOKIE)) 
{
  
name mysql_escape_string($_COOKIE['name']);
  
pass mysql_escape_string($_COOKIE['pass']);
  
mysql_connect($hostname,$login,$password$db) or die("No connect");
  
mysql_select_db("$db") or die("No select DB");
  
$query "SELECT status FROM authors WHERE name = ".$name." AND pass = ".$pass;
  
$stat mysql_query($query);
  if(
mysql_num_rows($stat) > 0$status mysql_result($stat,0); else $status 'Гость';
  echo 
"Привет, $name! Ваш статус $status";
?>



Сессии подделать сложнее намного, но и их можно проверить

   
 
 автор: tokmak   (15.02.2007 в 19:03)   письмо автору
 
   для: alek_chita   (15.02.2007 в 18:16)
 

Спасибо что ответили. Можно ли считать с последнего столбца бд строку.
Например таким образом.

$query = "SELECT * FROM `authors` WHERE `statususer`'";
$stat = mysql_query($query);
$status = mysql_result($stat,0);

Мне нужно чтобы происходило сравнение. Такого типа.

if ($status = "admin") { скрипт }

Просто у меня в БД есть строки в последнем столбце у меня существует строка admin. А как сравнить. равна ли она данной.

   
 
 автор: alek_chita   (16.02.2007 в 08:06)   письмо автору
 
   для: tokmak   (15.02.2007 в 19:03)
 

Вопрос какой-то запутанный. Приведите листинг создания таблицы.

   
 
 автор: tokmak   (16.02.2007 в 11:48)   письмо автору
 
   для: alek_chita   (16.02.2007 в 08:06)
 

Вот код SQL создание таблицы

CREATE TABLE authors (
  id_author int(6) NOT NULL auto_increment,
  name text,
  passw text,
  email text,
  url text,
  icq text,
  about text,
  photo text,
  time datetime default NULL,
  last_time datetime default NULL,
  themes text,
  statususer text,
  PRIMARY KEY (id_author)
) TYPE=MyISAM;

 В этом столбце у меня существует запись admin
statususer text,

в этом столбце и пользователя.

name text,

Нужно сравнить если кук существет то проверить к какому классу(типу) отсносится пользователь и писать привет $name Ваш статус $statususer или Привет гость ваш статус $statususer. ; $statususer должна иметь несколько значений. Как можно сделать.

   
 
 автор: alek_chita   (18.02.2007 в 17:14)   письмо автору
 
   для: tokmak   (16.02.2007 в 11:48)
 


<?php
$query 
"SELECT statususer FROM authors WHERE name = $name AND pass = $pass";
$stat mysql_query($query);
if(
$stat$status mysql_result($stat0); else exit(mysql_error());
echo 
"Привет $name твой статус $status";
?>


Или если вы хотите выполнять что-то если $status = 'админ' вместо echo пишите:

<?php 
  
if($status == 'админ'
  {
  
     
// Выполнение нужных операторов

  
}
?>

   
 
 автор: tokmak   (18.02.2007 в 17:35)   письмо автору
 
   для: alek_chita   (18.02.2007 в 17:14)
 

Спасибо всем за ответы я разработал код который мне нужен.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования