Создан виртуальный диск Ζ. Там хранятся все файлы Denwer'а.
В папке home создан новый домен Forma (папка), в ней папка www.
В данной папке есть html документ - index.html
Его содержимое:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>
<body>
<form name="form1" method="POST" action="script.php">
<input name="formtext1" type="text" style="position:absolute;width:200px;left:22px;top:42px;z-index:1">
<input name="formbutton1" type="submit" style="position:absolute;left:23px;top:82px;z-index:2">
<input name="formtext2" type="text" style="position:absolute;width:200px;left:22px;top:13px;z-index:3">
</form>
</body>
</html>
В той же папке лежит пустой файл script.php.
Необходимо, чтобы данные из двух полей формы (formtext1 и formtext2) при нажатии кнопки "Submit"
записывались каждый раз в новый файл с любым именем в папку "Data". И после нажатия этой же кнопки осуществлялся
бы переход на страницу "page.html".
Какой код должен быть в файле script.php.
Помогите, пожалуйста.
Очень выручите.
Спустя 2 минуты, 33 секунды (10.01.2010 - 22:37) Guest написал(а):
Уточнение. Нужно, чтобы файлы сохранялись на сервере в папке data, которая расположена в папке www домена Forma.
Спустя 11 часов, 1 минута, 14 секунд (11.01.2010 - 09:38) Dezigo написал(а):
Цитата |
Какой код должен быть в файле script.php. |
свои мысли по поводу кода где?
Спустя 6 часов, 49 минут, 39 секунд (11.01.2010 - 16:28) Guest написал(а):
<?php
$file = 'info.txt';
$mytext = $_POST['formtext1'].$_POST['formtext2'];
file_put_contents($file, implode("\n", $mytext), LOCK_EX);
file_put_contents($file, $mytext);
header('Location: success.htm');
?>
Это для записи в один файл. И то для перезаписи - так более точно сказать. Данные перезаписыватся.
Спустя 1 час, 3 минуты, 17 секунд (11.01.2010 - 17:31) ИНСИ написал(а):
Спустя 3 часа, 36 минут, 38 секунд (11.01.2010 - 21:08) Guest написал(а):
Спасибо за ссылки.
Но если возможно, то я прошу, подскажите более конкретно.
Я не специалист, поэтому получать сколько-нибудь углубленные знания не имеет смысла. Это разовая задача.
Если имеете достаточные знания в данной теме для помощи в данном вопросе, то помогите пожалуйста. Но в замен, увы, кроме выражения своей благодарности ничего дать, не имею возможности.
Но если возможно, то я прошу, подскажите более конкретно.
Я не специалист, поэтому получать сколько-нибудь углубленные знания не имеет смысла. Это разовая задача.
Если имеете достаточные знания в данной теме для помощи в данном вопросе, то помогите пожалуйста. Но в замен, увы, кроме выражения своей благодарности ничего дать, не имею возможности.
Спустя 43 минуты, 52 секунды (11.01.2010 - 21:51) ИНСИ написал(а):
Guest, что-то примерно такое:
$uploadPath = 'data/'; // тут путь, в какую папку надо загружать файл
$nameFile = uniqid(); // создаем случайное имя для файла
$text = $_POST['formtext1'] . '\n' . $_POST['formtext2']; // записываем в переменную то, что послали с формы
if($text != '') { // если текст не пустой
$file = fopen($uploadPath . $nameFile . '.txt', 'w'); // создаем файл
$wrrite = fwrite($file, $text); // записываем в него текст
$close = fclose($file); // закрываем
if($wrrite == true and $close == true) { // если запись и закрытие прошло успешно, то перенаправляем
header('Location: page.html'); // перенаправляем на нужную страницу
}
}
Спустя 1 час, 18 минут (11.01.2010 - 23:09) Guest написал(а):
Спасибо. Помогло.
Разовью тему.
Как сделать, чтобы пользователь не смог второй раз ввести данные в форму, если он уже это сделал?
Я полагаю, определить его IP-адрес. Записать его в текстовый файл, в котором хранятся данные из формы. И поставить условие на запись в файл: если такая-то цифра (ip) в нем присутствует, то вывести такую-то страницу, где будет нужное сообщение.
Разовью тему.
Как сделать, чтобы пользователь не смог второй раз ввести данные в форму, если он уже это сделал?
Я полагаю, определить его IP-адрес. Записать его в текстовый файл, в котором хранятся данные из формы. И поставить условие на запись в файл: если такая-то цифра (ip) в нем присутствует, то вывести такую-то страницу, где будет нужное сообщение.
Спустя 10 часов, 30 минут, 56 секунд (12.01.2010 - 09:40) ИНСИ написал(а):
Guest, надеюсь то, что снизу, тебе поможет. Если что, пиши...
$uploadPath = 'data/'; // тут путь, в какую папку надо загружать файл
$nameFile = uniqid(); // создаем случайное имя для файла
$text = $_POST['formtext1'] . '\n' . $_POST['formtext2']; // записываем в переменную то, что послали с формы
$foundIp = false; // флажок о найденом IP ставим false
$fileIpUsers = 'ipuser.txt'; // файл, в котором IP пользователей
$openFile = fopen($fileIpUsers, 'rb'); // открываем файл со списком IP
$allIp = fread($openFile,filesize($fileIpUsers)); // считываем информацию в файле
$arr = explode('||',$allIp); // делим все IP
foreach($arr as $list) { // обходим циклом все IP
if($list == $_SERVER['REMOTE_ADDR']) $foundIp = true; // если пользователь уже писал, то флаг $foundIp приравниваем к true
}
fclose($openFile); // закрываем файл
if($text != '' and $foundIp == false) { // если текст не пустой, и пользователь не писал
$openFileWrite = fopen($fileIpUsers, 'a'); // открываем файл и ставим в конец указатель для записи
fwrite($openFileWrite, '||' . $_SERVER['REMOTE_ADDR']); // записываем свой IP адрес
fclose($openFileWrite); // закрываем файл
$file = fopen($uploadPath . $nameFile . '.txt', 'w'); // создаем файл
$wrrite = fwrite($file, $text); // записываем в него текст
$close = fclose($file); // закрываем
if($wrrite == true and $close == true) { // если запись и закрытие прошло успешно, то перенаправляем
header('Location: page.html'); // перенаправляем на нужную страницу
}
} else {
header('Location: error.html'); // перенаправляем на сообщение о том, что пользователь уже писал
}
Спустя 23 минуты, 2 секунды (12.01.2010 - 10:03) VolCh написал(а):
Цитата (Guest @ 11.01.2010 - 23:09) |
Как сделать, чтобы пользователь не смог второй раз ввести данные в форму, если он уже это сделал? Я полагаю, определить его IP-адрес. |
Никогда (по крайней мере пока IPv6 везде не стоит) не привязывайтесь к IP адресу, если не хотите терять потенциальных посетителей, которые:
- пользуются услугами провайдеров, не предоставляющих внешний IP или предоставляющие его за отдельную плату (мало кто платит)
- выходят в инет с работы
- используют домашнюю сеть
- по тем или иным причинам используют прокси/нат
- ....
Спустя 3 часа, 20 минут, 23 секунды (12.01.2010 - 13:24) Guest написал(а):
Спасибо всем за помощь, осбобенно welbox2.
welbox2, на основании вашего кода сделал вот что. Только изменил названия текстовых полей для ввода с formtext1 и formtext2 на surname и address соответственно. И запись всех данных из формы сделал в один файл.
Здесь есть один мелкий нюанс. Если запись делается в первый раз в оба файла, то браузер выдает ошибку в 10-й строчке кода. Если в обоих файлах на первых строчках есть хоть по букве или просто курсор перенесен на вторую строчку, то все работает стабильно. Мелочь, но, на всякий случай, как это исправить на уровне кода?
И еще вопрос как сделать так, чтобы на компьютере пользователя проверялось введены ли данные в эти два текстовых поля или нет. Для начала элементарная проверка на пустоту данных полей.
Мои мысли по этому поводу таковы:
Прописал в теге формы onsubmit = "return validation()"
прописал Java скрипт в теле html, текст скрипта уже стер, сейчас попробую восстановить. Но в любом случае он не работал. Выводил всплывающее окно с предупреждением о неправильном вводе. После чего функция должна была возвратить false и остановить отправку данных на сервер. Но данные отправлялись все равно.
Последние задумки по этому поводу.
Вывести нередактируемое пользователем пустое текстовое поле. При нажатии кнопки в котором бы появлялось замечание по поводу ввода. При ошибке №1 - текст № 1, при ошибке № 2 - текст № 2. И только если все данные были бы верны, они отправлялись бы на сервер.
welbox2, на основании вашего кода сделал вот что. Только изменил названия текстовых полей для ввода с formtext1 и formtext2 на surname и address соответственно. И запись всех данных из формы сделал в один файл.
<?php
$filename = 'info.txt';
$surname = $_POST['surname'];
$address = $_POST['address'];
$alltext = $_POST['surname'].'\n'.$_POST['address'];
$date = date('c');
$foundIP = false;
$UsIP = 'UsIP.txt';
$openFile = fopen($UsIP, 'rb');
$allIP = fread($openFile, filesize($UsIP));
$arr = explode ('||',$allIP);
foreach($arr as $list) {if($list == $_SERVER['REMOTE_ADDR']) $foundIP = true;}
fclose ($openFile);
if($alltext != '' and $foundIP == false){
$handle1 = fopen ($UsIP, 'at');
fwrite ($handle1, '||'.$_SERVER['REMOTE_ADDR']);
fclose($handle1);
$handle = fopen ($filename, 'at');
$wrrite = fwrite ($handle, "\r\n".$surname."|".$address."|".$date."||".$_SERVER['REMOTE_ADDR']);
$close = fclose ($handle);
if($wrrite == true and $close == true){
header('Location: success.htm');
}}
else {header('Location: alreadywrote.htm');}
?>
Здесь есть один мелкий нюанс. Если запись делается в первый раз в оба файла, то браузер выдает ошибку в 10-й строчке кода. Если в обоих файлах на первых строчках есть хоть по букве или просто курсор перенесен на вторую строчку, то все работает стабильно. Мелочь, но, на всякий случай, как это исправить на уровне кода?
И еще вопрос как сделать так, чтобы на компьютере пользователя проверялось введены ли данные в эти два текстовых поля или нет. Для начала элементарная проверка на пустоту данных полей.
Мои мысли по этому поводу таковы:
Прописал в теге формы onsubmit = "return validation()"
прописал Java скрипт в теле html, текст скрипта уже стер, сейчас попробую восстановить. Но в любом случае он не работал. Выводил всплывающее окно с предупреждением о неправильном вводе. После чего функция должна была возвратить false и остановить отправку данных на сервер. Но данные отправлялись все равно.
Последние задумки по этому поводу.
Вывести нередактируемое пользователем пустое текстовое поле. При нажатии кнопки в котором бы появлялось замечание по поводу ввода. При ошибке №1 - текст № 1, при ошибке № 2 - текст № 2. И только если все данные были бы верны, они отправлялись бы на сервер.
Спустя 38 минут, 43 секунды (12.01.2010 - 14:02) Guest написал(а):
Вот текст скрипта. Но он не работает. Данные, как я и сказал, все равно отсылаются.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>
<body>
<form name="form1" method="POST" action="form.php" onsubmit="return SendForm()">
<input name="surname" type="text" style="position:absolute;width:200px;left:23px;top:42px;z-index:1">
<input name="address" type="text" style="position:absolute;width:200px;left:23px;top:13px;z-index:3">
<input name="formbutton1" type="submit" style="position:absolute;left:23px;top:82px;z-index:2">
</form>
<script language="javascript">
function SendForm(){
if (document.forms[0].surname.value == "") {
alert('Введите данные в форму № 1');
document.mailform.name.focus();
return false;}
return true;
};
</script>
</body>
</html>
Спустя 16 минут, 39 секунд (12.01.2010 - 14:19) ИНСИ написал(а):
Guest по проблеме в 10 строке, не знаю точно почему, но попробуй это заменить:
а по поводу другого вопроса, то не совсем вас понял. могли бы еще объяснить
$openFile = fopen($UsIP, ''r+');
а по поводу другого вопроса, то не совсем вас понял. могли бы еще объяснить
Спустя 1 минута, 28 секунд (12.01.2010 - 14:21) ИНСИ написал(а):
Guest то есть вы хотите проверить, отправляет ли пользователь пустые поля или заполненные? Если пустые, то предупреждение ?
Спустя 3 минуты, 42 секунды (12.01.2010 - 14:24) Guest написал(а):
Да. Предупреждение, нужно прервать отправку данных на сервер для обработки скриптом.
Спустя 1 минута, 44 секунды (12.01.2010 - 14:26) ИНСИ написал(а):
вот форма:
вот яваскрипт
<form name="form1" method="POST" action="form.php" onsubmit="return checkForm(this)">
<input name="surname" type="text" style="position:absolute;width:200px;left:23px;top:42px;z-index:1">
<input name="address" type="text" style="position:absolute;width:200px;left:23px;top:13px;z-index:3">
<input name="formbutton1" type="submit" style="position:absolute;left:23px;top:82px;z-index:2">
</form>
вот яваскрипт
<script language="JavaScript">
<!--
function checkForm(form)
{
var err="";
var errSurname = checkSurname(form.surname.value);
if (errSurname) err += errSurname+"\n";
var errAddress = checkAddress(form.address.value);
if (errAddress) err += errAddress+"\n";
if (err=="") return true;
else
{
alert(err);
return false;
}
function checkSurname(value)
{
if(!value.match(/[^\s]/g)) return "Введите фамилию"
return false;
}
function checkAddress(value)
{
if(!value.match(/[^\s]/g)) return "Введите адрес"
return false;
}
}
//-->
</script>
Спустя 4 минуты, 21 секунда (12.01.2010 - 14:30) Guest написал(а):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>
<body>
<form name="form1" method="POST" action="form.php" onsubmit="return SendForm()">
<input name="surname" type="text" style="position:absolute;width:200px;left:23px;top:42px;z-index:1">
<input name="address" type="text" style="position:absolute;width:200px;left:23px;top:13px;z-index:3">
<input name="formbutton1" type="submit" style="position:absolute;left:23px;top:82px;z-index:2">
</form>
<script language="javascript">
function SendForm(){
if (document.forms[0].surname.value == "") {
alert('Введите данные в форму № 1');
document.mailform.name.focus();
return false;}
return true;
};
</script>
</body>
</html>
Этот скрипт выводит предупреждение - то, что нужно.
После нажатия кнопки ОК, строчка, где данные введены неправильно не подсвечивается, а выводится страница, которая указана в скрипте. Т.е. скрипт все равно получает данные для обработки. А эти данные со страницы, которую просматривает пользователь не должны уходить на сервер и обрабатываться, пока эти данные не будут удовлетворять нужному условию. В данном случае оно простое - поля должны быть не пустыми.
Спустя 1 минута, 5 секунд (12.01.2010 - 14:31) ИНСИ написал(а):
Guest попробуй использовать то, что я дал. там точно должно работать
Спустя 21 минута, 18 секунд (12.01.2010 - 14:53) Guest написал(а):
Спасибо. То, что надо. Все работает.
И еще последнее.
Думаю поставить элементарную защиту.
На объем файла info.txt. Чтобы в случае достижения заданного объема например 10 Мб запись в файл не велась и в папке где находится файл info.txt создавался еще один файл warning с любым текстом, только один раз по достижении указанного объема файлом info.txt, который бы предупреждал о необхходимости почистить файл info.txt.
И еще последнее.
Думаю поставить элементарную защиту.
На объем файла info.txt. Чтобы в случае достижения заданного объема например 10 Мб запись в файл не велась и в папке где находится файл info.txt создавался еще один файл warning с любым текстом, только один раз по достижении указанного объема файлом info.txt, который бы предупреждал о необхходимости почистить файл info.txt.
Спустя 1 час, 7 минут, 10 секунд (12.01.2010 - 16:00) Guest написал(а):
Вставил блокировку на файлы при работе с ними.
Посмотрите, пожалуйста, верно?
В этой связи вопрос. Что случится если в данный момент одни данные одного пользователя записываются и другой пользователь тоже отправит данные?
Нужно ли использовать fflush?
Посмотрите, пожалуйста, верно?
<?php
$filename = 'info.txt';
$surname = $_POST['surname'];
$address = $_POST['address'];
$alltext = $_POST['surname'].'\n'.$_POST['address'];
$date = date('c');
$foundIP = false;
$UsIP = 'UsIP.txt';
$openFile = fopen($UsIP, 'rb');
flock ($openFile, LOCK_EX);
$allIP = fread($openFile, filesize($UsIP));
$arr = explode ('||',$allIP);
foreach($arr as $list) {if($list == $_SERVER['REMOTE_ADDR']) $foundIP = true;}
flock ($openFile, LOCK_UN);
fclose ($openFile);
if($alltext != '' and $foundIP == false){
$handle1 = fopen ($UsIP, 'at');
flock ($handle1, LOCK_EX);
fwrite ($handle1, '||'.$_SERVER['REMOTE_ADDR']);
flock ($handle1, LOCK_UN);
fclose($handle1);
$handle = fopen ($filename, 'at');
flock ($handle, LOCK_EX);
$wrrite = fwrite ($handle, "\r\n".$surname."|".$address."|".$date."||".$_SERVER['REMOTE_ADDR']);
flock ($handle, LOCK_UN);
$close = fclose ($handle);
if($wrrite == true and $close == true){
header('Location: success.htm');
}}
else {header('Location: alreadywrote.htm');}
?>
В этой связи вопрос. Что случится если в данный момент одни данные одного пользователя записываются и другой пользователь тоже отправит данные?
Нужно ли использовать fflush?
Спустя 5 минут, 39 секунд (12.01.2010 - 16:06) ИНСИ написал(а):
Guest что, то в роде этого наверное получится, то есть файл создается на сервере, потом проверяется его размер. Если он больше 10МБ, то он удаляется и т.д. в общем, есть комментарии, посмотрите сами.
И еще. Я поставил знак подавления ошибки, сейчас не должна быть ошибка.
И еще. Я поставил знак подавления ошибки, сейчас не должна быть ошибка.
$uploadPath = 'data/'; // тут путь, в какую папку надо загружать файл
$nameFile = uniqid(); // создаем случайное имя для файла
$text = $_POST['surname'] . ' || ' . $_POST['address']; // записываем в переменную то, что послали с формы
$warningFile = 'warning.txt'; // файл с предупреждением
$warningFileText = 'Тут текст предупреждения, что файл больше 10МБ';
$foundIp = false; // флажок о найденом IP ставим false
$fileIpUsers = 'ipuser.txt'; // файл, в котором IP пользователей
$openFile = fopen($fileIpUsers, 'rb'); // открываем файл со списком IP
$allIp = @fread($openFile,filesize($fileIpUsers)); // считываем информацию в файле
$arr = explode('||',$allIp); // делим все IP
foreach($arr as $list) { // обходим циклом все IP
if($list == $_SERVER['REMOTE_ADDR']) $foundIp = true; // если пользователь уже писал, то флаг $foundIp приравниваем к true
}
fclose($openFile); // закрываем файл
if($text != '' and $foundIp == false) { // если текст не пустой, и пользователь не писал
$openFileWrite = fopen($fileIpUsers, 'a'); // открываем файл и ставим в конец указатель для записи
fwrite($openFileWrite, '||' . $_SERVER['REMOTE_ADDR']); // записываем свой IP адрес
fclose($openFileWrite); // закрываем файл
$file = fopen($uploadPath . $nameFile . '.txt', 'w'); // создаем файл
$wrrite = fwrite($file, $text); // записываем в него текст
$close = fclose($file); // закрываем
if(filesize($uploadPath . $nameFile . '.txt') > 1024*10*1024) {
unlink($uploadPath . $nameFile . '.txt'); // удаляем файл, если он больше 10МБ
$openWarningFile = fopen($warningFile, 'a+'); // открываем файл warning
fwrite($openWarningFile, $warningFileText); // записываем текст
fclose($openWarningFile); // закрываем файл
header('Location: warning.html'); // перенаправляем на страницу, что файл больше 10МБ и он удален
exit();
}
if($wrrite == true and $close == true) { // если запись и закрытие прошло успешно, то перенаправляем
header('Location: page.html'); // перенаправляем на нужную страницу
exit();
}
} else {
header('Location: error.html'); // перенаправляем на сообщение о том, что пользователь уже писал
exit();
}
Спустя 25 минут, 27 секунд (12.01.2010 - 16:31) Guest написал(а):
Спасибо. Сейчас посмотрю код.
Только-только хотел написать свой вариант кода, наверное, куда более примитивный чем ваш, но тем не менее.
Насколько я понимаю, перед выполнением основного в данном случае должно провериться условие, существует ли файл warning.txt. Если он существует, то это свидетельствует о том, что превышен лимит по объему для файла info.txt. А значит пользователь перенаправляется на эту же страницу ( можно поставить и страниу=цу благодарности, чтобы вообще разницы не было) и все. Но если файла warning.txt нет, то выполняется следующее условие: проверяется размер файла info.txt, если он меньше 10 мегабайт, то выполняется старый скрипт, если же он равен или больше, то создается файл warning.txt и в следующий раз, когда пользователь будет отправлять данные - они не запишутся.
Все это имеет право на жизнь? Все верно?
Только-только хотел написать свой вариант кода, наверное, куда более примитивный чем ваш, но тем не менее.
if (file_exists('warning.txt') == true) {
header('Location: thesamepage.htm')
}
else {
if (file_size ('info.txt')<= 10485760){
\\весь текст скрипта
}
else {
fopen ('warning.txt', 'w');
header('Location: thesamepage.htm';
}
}
Насколько я понимаю, перед выполнением основного в данном случае должно провериться условие, существует ли файл warning.txt. Если он существует, то это свидетельствует о том, что превышен лимит по объему для файла info.txt. А значит пользователь перенаправляется на эту же страницу ( можно поставить и страниу=цу благодарности, чтобы вообще разницы не было) и все. Но если файла warning.txt нет, то выполняется следующее условие: проверяется размер файла info.txt, если он меньше 10 мегабайт, то выполняется старый скрипт, если же он равен или больше, то создается файл warning.txt и в следующий раз, когда пользователь будет отправлять данные - они не запишутся.
Все это имеет право на жизнь? Все верно?
Спустя 18 минут, 21 секунда (12.01.2010 - 16:49) ИНСИ написал(а):
Guest я запутался немного
Вы заново попробуйте по пунктам, четко описать, что надо сделать? с файлом warning.txt я не совсем понял...
Сейчас я сделал так:
1. Пользователь ввел данные в форму
2. Скрипт проверяет, писал ли пользователь, смотря файл со списком IP
3. Если не писал, то создает в папке data, новый файл + записывает IP пользователя в файл со списком IP адресов
4. Если файл, который создался (данные с формы) больше 10МБ, то он удаляется и либо создается либо записывается в конец файла текст, который находится в переменной $warningFileText
Вы заново попробуйте по пунктам, четко описать, что надо сделать? с файлом warning.txt я не совсем понял...
Сейчас я сделал так:
1. Пользователь ввел данные в форму
2. Скрипт проверяет, писал ли пользователь, смотря файл со списком IP
3. Если не писал, то создает в папке data, новый файл + записывает IP пользователя в файл со списком IP адресов
4. Если файл, который создался (данные с формы) больше 10МБ, то он удаляется и либо создается либо записывается в конец файла текст, который находится в переменной $warningFileText
Спустя 23 минуты, 35 секунд (12.01.2010 - 17:13) Guest написал(а):
1. Пользователь вводит данные в форму.
2. Идет проверка ввел ли он обязательные поля или нет, если нет то ему выдается предупреждение.
3. Пользователь вводит корректные данные, они отправляются на сервер.
4. Скрипт проверяет писал ли пользователь.
5. Если писал, то он просто перенаправляется на страницу, где ему говориться, что он уже ввел данные.
6. Если не писал, то данные записываются в один единственный файл с новой строчки. Пользователь перенаправляется на страницу, где ему выражается благодарность.
По поводу warning.txt.
Объясню подробнее, что имел ввиду.
Допустим такой абсурдный вариант. Пользователь при каждом подключении имеет динамический IP - адрес. Он решил побаловаться. Отключает и включает модем и каждый раз отправляет информацию на сервер (естественно, что проверка по IP есть только предостережение от случайной повторной отправки пользователем уже отправленных данных и никоим образом не претендует на серьезность). Таким образом файл за долгое время может заметно вырасти в объемах. Я предложил элементарный вариант защиты, который пришел первым в голову. Пусть по достижении определенного объема файла происходит какое-нибудь событие. За это событие я выбрал появление файла warning.txt в корневой директории, т.к. это проще всего сделать. Таким образом, когда я буду заходить просматривать/делать резервную копию файла info.txt я увижу, что появился файл, т.е. предупреждение, а значит нужно его почистить от полезной(это в лучшем случае) или ненужной информации. А для пользователя бы это выглядело так: даже если данные по факту не запишутся, то он был бы перенаправлен на страницу, где было бы сказано почему его сообщение не может быть передано.
2. Идет проверка ввел ли он обязательные поля или нет, если нет то ему выдается предупреждение.
3. Пользователь вводит корректные данные, они отправляются на сервер.
4. Скрипт проверяет писал ли пользователь.
5. Если писал, то он просто перенаправляется на страницу, где ему говориться, что он уже ввел данные.
6. Если не писал, то данные записываются в один единственный файл с новой строчки. Пользователь перенаправляется на страницу, где ему выражается благодарность.
По поводу warning.txt.
Объясню подробнее, что имел ввиду.
Допустим такой абсурдный вариант. Пользователь при каждом подключении имеет динамический IP - адрес. Он решил побаловаться. Отключает и включает модем и каждый раз отправляет информацию на сервер (естественно, что проверка по IP есть только предостережение от случайной повторной отправки пользователем уже отправленных данных и никоим образом не претендует на серьезность). Таким образом файл за долгое время может заметно вырасти в объемах. Я предложил элементарный вариант защиты, который пришел первым в голову. Пусть по достижении определенного объема файла происходит какое-нибудь событие. За это событие я выбрал появление файла warning.txt в корневой директории, т.к. это проще всего сделать. Таким образом, когда я буду заходить просматривать/делать резервную копию файла info.txt я увижу, что появился файл, т.е. предупреждение, а значит нужно его почистить от полезной(это в лучшем случае) или ненужной информации. А для пользователя бы это выглядело так: даже если данные по факту не запишутся, то он был бы перенаправлен на страницу, где было бы сказано почему его сообщение не может быть передано.
Спустя 1 час, 22 минуты, 4 секунды (12.01.2010 - 18:35) ИНСИ написал(а):
Цитата |
естественно, что проверка по IP есть только предостережение от случайной повторной отправки пользователем уже отправленных данных и никоим образом не претендует на серьезность |
согласен! ну, обычно я прикрепляю еще и куки.
Цитата |
даже если данные по факту не запишутся, то он был бы перенаправлен на страницу, где было бы сказано почему его сообщение не может быть передано |
тогда быть может сделать так, чтобы создался новый файл с IP адресами? а данные чтобы в любом случае записывались?
Спустя 11 минут, 32 секунды (12.01.2010 - 18:47) Guest написал(а):
Да, дельное замечание по поводу отдельного файла.
Как куки прикрепить. Никогда с ними не имел дела?
Как куки прикрепить. Никогда с ними не имел дела?
Спустя 39 минут, 3 секунды (12.01.2010 - 19:26) ИНСИ написал(а):
Guest, вобщем, смотри теперь как работает скрипт:
1. Пользователь вводит данные в форму.
2. Идет проверка ввел ли он обязательные поля или нет, если нет то ему выдается предупреждение.
3. Идет проверка на куки, + ip адрес, если пользователь первый раз пишет, то данные отправляются на сервер
4. Если пользователь писал, то он просто перенаправляется на страницу, где ему говориться, что он уже ввел данные.
6. Если файл $fileIpUsers, в котором ip адреса больше 10МБ, то на сервере создается файл $warningFile, если он был создан, то ничего не происходит.
в общем, сделано как вы хотели кажется если что, пишите еще. Единственное не пугайтесь, там есть функции, который нужны для куки.
1. Пользователь вводит данные в форму.
2. Идет проверка ввел ли он обязательные поля или нет, если нет то ему выдается предупреждение.
3. Идет проверка на куки, + ip адрес, если пользователь первый раз пишет, то данные отправляются на сервер
4. Если пользователь писал, то он просто перенаправляется на страницу, где ему говориться, что он уже ввел данные.
6. Если файл $fileIpUsers, в котором ip адреса больше 10МБ, то на сервере создается файл $warningFile, если он был создан, то ничего не происходит.
в общем, сделано как вы хотели кажется если что, пишите еще. Единственное не пугайтесь, там есть функции, который нужны для куки.
Свернутый текст
/**
* Очищаем ссылку от http://
*
* $url - сама ссылка
*
*/
function clean_url($url)
{
if ($url == '') return; // если ссылка пустая, то возвращаем ошибку
$url = str_replace('http://', '', $url); // заменяем http:// на пустоту
if (strtolower(substr($url, 0, 4)) == 'www.') $url = substr($url, 4); // возвращаем часть ссылки
$url = explode('/', $url); // делим ссылку
$url = reset($url); // указываем на первый элемент
$url = explode(':', $url); // делим ссылку
$url = reset($url); // указываем на первый элемент
return $url; // возвращаем чистую ссылку
}
/**
* Устанавливаем куки
*
* $name - имя куки
* $value - значение куки
* $expires - время жизни куки
* define ('DOMAIN_FOR_COOKIE', ".".clean_url ($_SERVER['HTTP_HOST']) ); - константа содержащая чисты путь
*
*/
function setСookie($name,$value,$expires) {
define('DOMAIN_FOR_COOKIE', '.' . clean_url($_SERVER['HTTP_HOST']));
// устанавливаем время жизни куки
if($expires) {
$expires = time() + ( $expires * 86400 );
} else {
$expires = FALSE;
}
// устанавливаем куки
setcookie($name, $value, $expires, '/', DOMAIN_FOR_COOKIE, NULL, TRUE);
}
$uploadPath = 'data/'; // тут путь, в какую папку надо загружать файл
$nameFile = uniqid(); // создаем случайное имя для файла
$text = $_POST['surname'] . ' || ' . $_POST['address']; // записываем в переменную то, что послали с формы
$warningFile = 'warning.txt'; // файл с предупреждением
$warningFileText = 'Тут текст предупреждения, что файл больше 10МБ';
if(!($_COOKIE['addForm'])) { // если нет куки, проверяем дальше
$foundIp = false; // флажок о найденом IP ставим false
$fileIpUsers = 'ipuser.txt'; // файл, в котором IP пользователей
$openFile = fopen($fileIpUsers, 'rb'); // открываем файл со списком IP
$allIp = @fread($openFile,filesize($fileIpUsers)); // считываем информацию в файле
$arr = explode('||',$allIp); // делим все IP
foreach($arr as $list) { // обходим циклом все IP
if($list == $_SERVER['REMOTE_ADDR']) $foundIp = true; // если пользователь уже писал, то флаг $foundIp приравниваем к true
}
fclose($openFile); // закрываем файл
if($text != '' and $foundIp == false and) { // если текст не пустой, и пользователь не писал
setСookie('addForm',$_SERVER['REMOTE_ADDR'],999); // вызываем функцию, которая создает куки на 999 дней
$openFileWrite = fopen($fileIpUsers, 'a'); // открываем файл и ставим в конец указатель для записи
fwrite($openFileWrite, '||' . $_SERVER['REMOTE_ADDR']); // записываем свой IP адрес
fclose($openFileWrite); // закрываем файл
$file = fopen($uploadPath . $nameFile . '.txt', 'w'); // создаем файл
$wrrite = fwrite($file, $text); // записываем в него текст
$close = fclose($file); // закрываем
if(filesize($fileIpUsers) > 1024*10*1024) and !is_writable($warningFile)) { // если файл с адресами больше 10МБ + еще не создан файл $warningFile
$openWarningFile = fopen($warningFile, 'a+'); // открываем файл warning
fwrite($openWarningFile, $warningFileText); // записываем текст
fclose($openWarningFile); // закрываем файл
}
if($wrrite == true and $close == true) { // если запись и закрытие прошло успешно, то перенаправляем
header('Location: page.html'); // перенаправляем на нужную страницу
exit();
}
} else {
header('Location: error.html'); // перенаправляем на сообщение о том, что пользователь уже писал
exit();
}
} else {
header('Location: error.html'); // перенаправляем на сообщение о том, что пользователь уже писал
exit();
}
Спустя 1 час, 36 минут, 28 секунд (12.01.2010 - 21:02) Guest написал(а):
Спасибо.
В коде разбираюсь.
Возник вопрос при переносе на сервер под управлением FreeBSD не возникнет никаких проблем, в частности с символами "\r\n", чтением и записью файлов?
В коде разбираюсь.
Возник вопрос при переносе на сервер под управлением FreeBSD не возникнет никаких проблем, в частности с символами "\r\n", чтением и записью файлов?
Спустя 20 минут, 27 секунд (12.01.2010 - 21:22) ИНСИ написал(а):
Guest прости, я ответить не могу на этот вопрос, потому что не знаю
Спустя 9 минут, 10 секунд (12.01.2010 - 21:32) Lex_R написал(а):
Цитата |
Возник вопрос при переносе на сервер под управлением FreeBSD не возникнет никаких проблем, в частности с символами "\r\n", чтением и записью файлов? |
В режиме открытия файла указывай не бинарный, а текстовый, в этом случае php будет сам преобразовывать символы \r\n в \n, ну и если записываешь что-то в файл и нужно указать перенос строки, то просто указывай \n.
Спустя 22 дня, 19 часов, 59 минут, 6 секунд (7.02.2010 - 17:31) Guest написал(а):
Здравствуйте.
Вот скрипт:
Простой скрипт на проверку соответствия введенных данных списку, т.е. имеются ли введенные данные в текстовом файле.
В данном скрипте из текстового поля 'ho' передаются только числовые данные,
а из поля 'ad' текстовые данные. Т.к. в текстовом файле data.txt все данные записаны с маленькой буквы, то следовательно и данные из поля должны быть преобразованы в нижний регистр. Я думал, что записав переменную - $text1 = strtolower($text0);, я это и сделал, но вот ПРОБЛЕМА: на локальном сервере все работает, на хостинге если данные в поле написаны с маленькой буквы, то все работает, но если хотя бы одна буква написана с большой, то скрипт не работает как надо, то есть данные не преобразовываются в нижний регистр.
В чем может быть дело? В моем скрипте или хостинге? Подскажите, пожалуйста.
Вот скрипт:
<?php
$lop = true;
$text0 = $_POST{'ad'};
$text1 = strtolower($text0);
$text2 = $_POST{'ho'};
$text = $text1.$text2;
$fileIpUsers = 'data.txt';
$openFile = fopen($fileIpUsers, 'rb');
$allIp = fread($openFile,filesize($fileIpUsers));
$arr = explode('||',$allIp);
foreach($arr as $list) {
if($list == $text) $lop = false;
}
fclose($openFile); // закрываем файл
if($lop == true) {
header('Location: condeny.html');
}
else {header('Location: conallow.html');}
?>
Простой скрипт на проверку соответствия введенных данных списку, т.е. имеются ли введенные данные в текстовом файле.
В данном скрипте из текстового поля 'ho' передаются только числовые данные,
а из поля 'ad' текстовые данные. Т.к. в текстовом файле data.txt все данные записаны с маленькой буквы, то следовательно и данные из поля должны быть преобразованы в нижний регистр. Я думал, что записав переменную - $text1 = strtolower($text0);, я это и сделал, но вот ПРОБЛЕМА: на локальном сервере все работает, на хостинге если данные в поле написаны с маленькой буквы, то все работает, но если хотя бы одна буква написана с большой, то скрипт не работает как надо, то есть данные не преобразовываются в нижний регистр.
В чем может быть дело? В моем скрипте или хостинге? Подскажите, пожалуйста.
Спустя 29 минут, 48 секунд (7.02.2010 - 18:01) ИНСИ написал(а):
Guest попробуй сделать так:
$_POST['ad'] = strtolower($_POST['ad']);
$_POST['ho'] = intval($_POST['ho']);
$lop = true;
$fileIpUsers = 'data.txt';
$openFile = fopen($fileIpUsers, 'rb');
$allIp = fread($openFile,filesize($fileIpUsers));
$arr = explode('||',$allIp);
foreach($arr as $list) {
if($list == $_POST['ad'] . $_POST['ho']) $lop = false;
}
fclose($openFile);
if($lop == true) {
header('Location: condeny.html');
exit();
} else {
header('Location: conallow.html');
exit();
}
Спустя 1 час, 37 секунд (7.02.2010 - 19:01) Guest написал(а):
Бесполезно.
Эффект тот же самый.
Я думаю может быть подойдет вот что:
на одном сайте видел, в текстовом поле все символы пишутся с маленькой буквы без какой либо реакции на Caps lock. Вот только как добиться такого эффекта пока не знаю (не знаю даже с помощью чего: javascript или html, хотя предполагаю, что первое).
Эффект тот же самый.
Я думаю может быть подойдет вот что:
на одном сайте видел, в текстовом поле все символы пишутся с маленькой буквы без какой либо реакции на Caps lock. Вот только как добиться такого эффекта пока не знаю (не знаю даже с помощью чего: javascript или html, хотя предполагаю, что первое).
Спустя 9 минут, 12 секунд (7.02.2010 - 19:10) Guest написал(а):
Или, чтобы наверняка, сделать преобразование с помощью ява скрипта еще на клиентском компьютере, добавив нужные строчки в функцию onSubmit="return checkForm(this)". Вот только какие?
Спустя 1 час, 5 минут, 42 секунды (7.02.2010 - 20:16) Guest написал(а):
Спасибо за помощь, но я решил задачку.
Если кому пригодится.
Функция strtolower(), по-видимому, не работает с русской раскладкой.
Выход: написать функцию, которая преобразует символы из верхней в нижнюю раскладку. Вот она + преобразование из нижней в верхнюю. Не знаю, кто автор, но, дабы не обидеть никого,
указываю источник - http://www.zhogov.ru/stat_55.html
Если кому пригодится.
Функция strtolower(), по-видимому, не работает с русской раскладкой.
Выход: написать функцию, которая преобразует символы из верхней в нижнюю раскладку. Вот она + преобразование из нижней в верхнюю. Не знаю, кто автор, но, дабы не обидеть никого,
указываю источник - http://www.zhogov.ru/stat_55.html
function toupper($co) {
$co = strtr($co, "абвгдеёжзийклмнорпстуфхцчшщъьыэюя",
"АБВГДЕЁЖЗИЙКЛМHОРПСТУФХЦЧШЩЪЬЫЭЮЯ");
return strtoupper($co);
}
function tolower($co) {
$co = strtr($co, "АБВГДЕЁЖЗИЙКЛМHОРПСТУФХЦЧШЩЪЬЫЭЮЯ",
"абвгдеёжзийклмнорпстуфхцчшщъьыэюя");
return strtolower($co);
}
Спустя 14 минут, 9 секунд (7.02.2010 - 20:30) Test написал(а):
Всем привет, не хочу ради такого вопроса открывать новую тему по этому задам свой вопрос тут:
Только начинаю изучать пхп, но у меня скоро поедет крыша от того почему скрипт не работает
есть форма
и есть скрипт
Ввожу в поле любое слово, жму сабмит и предпологаю что мне выдаст хэш это слова, но нет! Выводит md5 самого названия переменной!! Как я непробовал ниче не выходит.
Только начинаю изучать пхп, но у меня скоро поедет крыша от того почему скрипт не работает
есть форма
<form action="script.php" method="get" >
<input name="name">
<input type="submit">
</form>
и есть скрипт
<?php
print md5($name);
?>
Ввожу в поле любое слово, жму сабмит и предпологаю что мне выдаст хэш это слова, но нет! Выводит md5 самого названия переменной!! Как я непробовал ниче не выходит.
Спустя 18 минут, 23 секунды (7.02.2010 - 20:49) ИНСИ написал(а):
Guest интересно, будем знать
Test попробуй сделать так:
Test попробуй сделать так:
<form action="script.php" method="get" >
<input name="name" stype="text">
<input type="submit" name="submit" value="Send">
</form>
echo md5($_POST['name']);
Спустя 1 час, 10 минут, 7 секунд (7.02.2010 - 21:59) twin написал(а):
welbox2
<form action="script.php" method="get" >
<form action="script.php" method="get" >
Спустя 10 часов, 20 минут (8.02.2010 - 08:19) ИНСИ написал(а):
twin не заметил, спасибо.
Test
тогда сделай так, я неправильно написал:
Test
тогда сделай так, я неправильно написал:
echo md5($_GET['name']);