Консультация № 181929
18.01.2011, 09:52
55.00 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас помочь решить следующую задачу.
Скрипт рассылки помещает информацию в текстовый файл в таком виде:
элемент1,элемент2,элемент3,элемент4,элемент5,элемент6,элемент7,элемент8 (элементы разделены запятыми, без пробелов; таких строк, ессно, сколько подписчиков, т. е., налицо двухуровневый массив: первый уровень - подписчики, второй - данные кокретного подписчика)
Теперь собственно задача.
Хочу поместить на страницах сайта форму авторизации пользователя, подписанного на рассылку: пользователь вводит в форму логин и e-mail, которые использовал при подписке - скрипт-обработчик формы в указанном выше текстовом файле проверяет, есть ли подписчик с такими данными и подтвердил ли он подписку (один из элементов массива - код подтверждения на подписку) - если нет, посылает подписываться или подтверждать подписку - если да, происходит переход на страницу, доступную только подписчикам рассылки.
Помогите, пожалуйста, написать фрагмент скрипта, где происходит поиск в массиве логина и e-maila, а также кода подтверждения подписки, и сравнения этих данных с введёнными в форму авторизации. Плюс - переход на секретную страницу, если соответствующие данные найдены.

Обсуждение

Неизвестный
18.01.2011, 10:21
общий
Код:
	function check($login,$email)
{
$fd=false;
$filename="Имя файла с данными рассылки";
if(file_exists($filename))
$fd=fopen($filename,'r');
if($fd !== false)
{
while(true)
{
$rd=fgets($fd);
if($rd===FALSE)break;
$fields=explode(',',$rd);
//номера полей подставьте из вашего файла
if(($fields[1]==$login)&&($fields[2]==$email)&&($fields[3]=="1"))
{
fclose($fd);
return true;
}
}
fclose($fd);
}
return false;
}

Но гораздо лучше будет хранить такую информацию в базе. Хотя бы sqlite.
Неизвестный
18.01.2011, 20:06
общий
Vladisslav, в таком виде скрипт не работает совсем. То есть, если вместо return true; и return false; подставить хотя бы просто вывод соответствующего сообщения, то ничего не выводится, и вообще не происходит. Чистый экран.
Стал удалять отдельные элементы скрипта, в результате он кое-как заработал только в таком виде:
$filename = "путь к файлу-базе";
$fd=fopen($filename,'r');
while(true)
{
$rd=fgets($fd);
if($rd===FALSE)break;
$fields=explode(',',$rd);
//номера полей подставьте из вашего файла
if(($fields[2]==$aname)&& ($fields[3]==$email)&&($fields[6]== "2"))
//тогда выводим сообщение
{
echo "<p>Вы подписаны на рассылку</p>";
fclose($fd);
}
}
Скрипт находит пользователя, если он есть в базе, но при этом ещё и вылезает сообщение об ошибке в строке $rd=fgets($fd);
При вводе в форму несуществующих данных никаких сообщений не появляется, как я ни пробовал менять код.
Неизвестный
19.01.2011, 09:48
общий
Должен работать. По крайней мере тот скрипт, из которого была взята функция и переделана под ваши условия, работает нормально.
Код:
function check($login,$email)
{
$fd=false;
$filename="Имя файла с данными рассылки";
if(file_exists($filename))
$fd=fopen($filename,'r');
if($fd !== false)
{
while(!feof($fd))
{
$rd=fgets($fd);
if($rd===FALSE)break;
$fields=explode(',',$rd);
//номера полей подставьте из вашего файла
if(($fields[2]==$login)&&($fields[3]==$email)&&($fields[6]=="2"))
{
fclose($fd);
return true;
}
}
fclose($fd);
}
return false;
}
//проверка
if(check("user","user@localhost"))
print "Found user!";
else
print "Did not found user!";

Неизвестный
20.01.2011, 17:07
общий
Благодарю, теперь работает
Неизвестный
20.01.2011, 17:26
общий
это ответ
Здравствуйте, Посетитель - 359051!
Можно сделать так, но гораздо лучше в плане производительности использовать для таких целей БД.

Приложение:
function check($login,$email)
{
$fd=false;
$filename="Имя файла с данными рассылки";
if(file_exists($filename))
$fd=fopen($filename,'r');
if($fd !== false)
{
while(!feof($fd))
{
$rd=fgets($fd);
if($rd===FALSE)break;
$fields=explode(',',$rd);
//номера полей подставьте из вашего файла
if(($fields[2]==$login)&&($fields[3]==$email)&&($fields[6]=="2"))
{
fclose($fd);
return true;
}
}
fclose($fd);
}
return false;
}
//проверка
if(check("user","user@localhost"))
print "Подписан";
else
print "Не подписан";
5
Форма ответа