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

Форум PHP

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

 

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

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

тема: COOKIE против повторной регистрации
 
 автор: tima2010   (16.12.2011 в 15:54)   письмо автору
 
 

Привет! Пишу регистрацию пользователей. Схема следующая:

<?php
if (isset($_COOKIE['check']))
{
    echo 
'Регистрироваться можно только 1 раз в сутки';
}
else {
// обработка данных, если ошибок нет записываем в базу данные
// при успешном добавлении данных в базу переменная $ok = 'true'
}

if(
$ok == 'true') { // если пользовательские данные успешно добавлены
    
setcookie ("check""1"time() + 86400); // вот тут проблема...
}

?>

<!-- здесь HTML форма добавления данных -->


как я могу присвоить cookie если успешный результат регистрации пользователя у меня осуществляется после объявления headers заголовков?

  Ответить  
 
 автор: cheops   (16.12.2011 в 16:16)   письмо автору
 
   для: tima2010   (16.12.2011 в 15:54)
 

>как я могу присвоить cookie если успешный результат регистрации пользователя у меня
>осуществляется после объявления headers заголовков?
Имеется в виду после вывода в окно браузера? Дело в том, что отправка HTTP-заголовков не мешает отправке других HTTP-заголовков (в данном случае Set-Cookie).

  Ответить  
 
 автор: tima2010   (16.12.2011 в 16:20)   письмо автору
 
   для: cheops   (16.12.2011 в 16:16)
 

Да но я получаю ошибку:
Вида: Warning: Cannot modify header information - headers already sent by

  Ответить  
 
 автор: Slo_Nik   (16.12.2011 в 16:22)   письмо автору
 
   для: tima2010   (16.12.2011 в 16:20)
 

если заголовки пытаетесь отправить после этой строки "echo 'Регистрироваться можно только 1 раз в сутки'; ", то будет выводится данное предупреждение.

  Ответить  
 
 автор: tima2010   (16.12.2011 в 16:28)   письмо автору
 
   для: Slo_Nik   (16.12.2011 в 16:22)
 

то есть если вообще что либо до объявления COOKIES выводится на экран то будет ошибка
В том то и проблема что страница выглядит так:


-Код страницы
--Код проверки данных
--Создаем переменную с успехом регистрации
--Если переменная успеха есть ставим куку
--Форма отображения данных
-Код страницы


По идеи нужно сделать так:


---------Если переменная успеха есть ставим куку
-Код страницы
--Код проверки данных
--Создаем переменную с успехом регистрации
--Форма отображения данных
-Код страницы


но как я узнаю успешно выполнилась операция или нет, если она объявляется после проверки условия есть она или нет ?

  Ответить  
 
 автор: Slo_Nik   (16.12.2011 в 16:41)   письмо автору
 
   для: tima2010   (16.12.2011 в 16:28)
 

отличный код, всё понятно до мелочей ))))

"--Создаем переменную с успехом регистрации" вот в этом месте используете header()?

  Ответить  
 
 автор: tima2010   (16.12.2011 в 16:48)   письмо автору
 
   для: Slo_Nik   (16.12.2011 в 16:41)
 

извиняюсь за столь непонятное описание.
Да там использую headers()

Более цивильный код:


<?php
if($ok == 'true') { // если пользовательские данные успешно добавлены 
    
setcookie ("check""1"time() + 86400); 

?>
<!DOCTYPE>
<html>
<head>
<title></title>
</head>
<body>

Вводный текст...

<?php 
if (isset($_COOKIE['check'])) 

    echo 
'Регистрироваться можно только 1 раз в сутки'

else { 
// обработка данных, если ошибок нет записываем в базу данные 
// если все хорошо -> 
$ok 'true';

?> 

<!-- здесь HTML форма добавления данных -->

</body>
</html>

  Ответить  
 
 автор: Slo_Nik   (16.12.2011 в 17:02)   письмо автору
 
   для: tima2010   (16.12.2011 в 16:48)
 

и где же в более цивильном коде использование header()? )))

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

У Вас есть и html и echo перед header(), вот Вам и причина предупреждения

  Ответить  
 
 автор: tima2010   (16.12.2011 в 17:48)   письмо автору
 
   для: Slo_Nik   (16.12.2011 в 17:02)
 

Спасибо! попробую разобраться почему ошибка! А разве условие сработает? если переменная еще не существует, а я ее уже проверяю. Тут вся проблема у меня в этом.

  Ответить  
 
 автор: Lotanaen   (16.12.2011 в 17:49)   письмо автору
 
   для: tima2010   (16.12.2011 в 17:48)
 

Ну так делайте сначала все проверки, а потом уже страницу отдавайте.

  Ответить  
 
 автор: Slo_Nik   (16.12.2011 в 18:21)   письмо автору
 
   для: tima2010   (16.12.2011 в 17:48)
 

Да тут и разбираться нечего, я написал в чём у Вас проблема, скорей всего.
можно использовать вместо header()
<html><head><meta http-equiv="refresh" content='0; url=адрес_страницы_куда_переход /></head></html> предупреждения не будет

  Ответить  
 
 автор: Slo_Nik   (16.12.2011 в 16:19)   письмо автору
 
   для: tima2010   (16.12.2011 в 15:54)
 

пользователь может почистить куки и регистрироваться столько, сколько ему захочется раз в сутки...

  Ответить  
 
 автор: tima2010   (16.12.2011 в 16:20)   письмо автору
 
   для: Slo_Nik   (16.12.2011 в 16:19)
 

да эта смешная "защита" делается просто для того чтобы она была, а тот кому очень нужно всегда найдет лазейку

  Ответить  
 
 автор: ladan   (16.12.2011 в 22:53)   письмо автору
 
   для: Slo_Nik   (16.12.2011 в 16:19)
 

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


<?
$proverka 
mysql_query("SELECT id FROM users");
$proverka2 mysql_fetch_array($proverka);
do
{
/* ищем совпадения ip пользователя с ip в таблице users */
if($proverka2['ip'] == $_SERVER['REMOTE_ADDR']) {exit("<p align='center'>Вы уже регистрировались!</p>");}
}
while(
$proverka2 mysql_fetch_array($proverka));

/* IP пользователя не найден в базе, делаем запись в бд */
mysql_query("INSERT INTO users (name,surname, ip) VALUES('$name', '$surname', '$_SERVER['REMOTE_ADDR']')")


?>


Ну так сказать тоже защита неизящна, но человеку придется подумать как ip сменить :) Да и если есть желание, думаю можно сделать возможную регистрацию через сутки, как ты хочешь. Тут вместо куки пользователя выступает его ip, мне кажется так лучше будет + гемороя с ошибками не будет!

  Ответить  
 
 автор: Slo_Nik   (17.12.2011 в 00:02)   письмо автору
 
   для: ladan   (16.12.2011 в 22:53)
 

а как быть с динамическими ip ?

  Ответить  
 
 автор: ladan   (17.12.2011 в 00:06)   письмо автору
 
   для: Slo_Nik   (17.12.2011 в 00:02)
 

вот у меня динамический ip, выключил, включил модем и защита от регистрации полетела :) но кому надо тот все равно зарегистрируется, обойдя любую защиту, просто если через ip ограничение делать, то все же защита получше чем куки, я так думаю...


А можно, вместо ip проверять почту..., что самое оптимальное. Пользователь регистрируется, идет запись в бд + организовать модерацию(активацию) через его почту(подтверждение регистрации), как-то так. Будет потребность сделать регистрацию, пойду таким путем :) Да и кому охото будет 50 ящиков создавать

  Ответить  
 
 автор: Slo_Nik   (17.12.2011 в 00:52)   письмо автору
 
   для: ladan   (17.12.2011 в 00:06)
 

>вот у меня динамический ip.......................

и не только у Вас может быть такой ip, и другой человек, который пользуется услугами одного и того же провайдера вместе с Вами не сможет в этот день зарегистрироваться, ни разу....

это как на depositfile раньше было, заходишь скачать какую-то мелочь, а тебе сообщают, что "с Вашего ip уже идёт скачка....", хотя и на заходил и не качал я с этого сайта уже неделю например...)))

>А можно, вместо ip проверять почту..., что самое оптимальное.

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

  Ответить  
 
 автор: ladan   (17.12.2011 в 01:59)   письмо автору
 
   для: Slo_Nik   (17.12.2011 в 00:52)
 

>тоже не согласен. у меня оплачен хостинг и есть возможность создать неограниченное кол-во почтовых аккаунтов.... было бы только желание и время... хотя можно написать скрипт и пить чай, пока создаются ящики ....

Ну если так рассуждать, то вообще никакой защиты ставить не нужно :)) Вы и еще 1-2% на земле смогут написать скрипт, а так большинство людей- обычные пользователи пк :)

  Ответить  
 
 автор: tima2010   (17.12.2011 в 01:10)   письмо автору
 
   для: ladan   (17.12.2011 в 00:06)
 

Почта проверяется, нужно просто скрыть форму регистрации если сегодня пользователь уже регистрировался...

  Ответить  
Rambler's Top100
вверх

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