Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#23 used as offset, casting to integer (23) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#25 used as offset, casting to integer (25) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Добавление текста в базу данных и выведение номера строки
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
Vladimir
Отправлено: 30 Сентября, 2008 - 04:08:43
Post Id


Advanced Member


Покинул форум
Сообщений всего: 270
Дата рег-ции: Апр. 2005  

Карма 0




Есть такой скриптик, который вбивает в строку текстовой базы данных текст из формы:

CODE:
<?
if (isSet($_POST['text']))
{
$file = fopen('file.txt', 'a');
fwrite($file, "$_POST[text]\n");
fclose($file);
}
?>
<html><head><title></title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<center>
<form method="post" action="add.php">
<input size=20 type="text" name="text">
<input type="submit" value="Добавить">
</form>
</center>
</body>
</html>


При этом в file.txt получается:

текст 1
текст 2
текст 3
и т.д.

Как сделать, чтобы после нажатия кнопки "Добавить", на странице выводился номер строки базы данных, на которую добавился данный текст?
Например, добавился текст на пятую строку - выводится число 5, на 1024-ю - 1024 и т.д.
 
 Top
Davinchi
Отправлено: 30 Сентября, 2008 - 07:13:43
Post Id


Full Member


Покинул форум
Сообщений всего: 152
Дата рег-ции: Нояб. 2006  

Карма -2




После записи в файл выведи количество строк, это и будет номер последней строки
CODE:
$m=file("*.txt");
$num=count($m);
 
 Top
Vladimir
Отправлено: 30 Сентября, 2008 - 07:49:47
Post Id


Advanced Member


Покинул форум
Сообщений всего: 270
Дата рег-ции: Апр. 2005  

Карма 0




Понятно. Спасибо!

А как сделать проверку вводимых данных: если во вводимом тексте отсутствует какое-либо из нужных слов, то данные не передаются в базу, а происходит редирект на страницу с сообщением об ошибке?
 
 Top
Furax
Отправлено: 30 Сентября, 2008 - 08:15:25
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Davinchi
Очень плохой стиль. Было сказано, что файл может содержать 1024 строки. Пусть по 1024 символа. Итого такой подход потребует мегабайта памяти - вряд ли сервер столько даст. Лучше честно прочитать файл по строкам и посчитать число чтений.

Vladimir
Проверку можно сделать, например, так:
CODE:
$words = array("мама", "мыла", "раму");
foreach ($words as $word)
if (strpos($_POST['text'], $word)===FALSE)
{
header("location: error.htm");
exit();
}
Такое сравнение, кстати, будет регистрозависимым.

Кстати, код весьма небезопасен. В файле могут быть плохие символы; надо следить, чтобы такой файл не был заинклюден из другого (тоже дырявого) скрипта. Кроме того, его содержимое нельзя напрямую выводить, ибо оно может содержать теги. Наконец, можно добавить за раз не одну запись, а много.

(Отредактировано автором: 30 Сентября, 2008 - 08:16:16)

 
 Top
Vladimir
Отправлено: 30 Сентября, 2008 - 08:52:09
Post Id


Advanced Member


Покинул форум
Сообщений всего: 270
Дата рег-ции: Апр. 2005  

Карма 0




Furax пишет:
Было сказано, что файл может содержать 1024 строки. Пусть по 1024 символа.
Я просто для примера сказал. Строк может быть и больше.
 
 Top
Furax
Отправлено: 30 Сентября, 2008 - 08:59:21
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Тем более. Не стоит занимать несколько мегабайт оперативы только для того, чтобы посчитать одно число.
 
 Top
Vladimir
Отправлено: 30 Сентября, 2008 - 09:01:34
Post Id


Advanced Member


Покинул форум
Сообщений всего: 270
Дата рег-ции: Апр. 2005  

Карма 0




Furax пишет:
Лучше честно прочитать файл по строкам и посчитать число чтений.
И как это тогда будет?
 
 Top
Davinchi
Отправлено: 30 Сентября, 2008 - 09:03:17
Post Id


Full Member


Покинул форум
Сообщений всего: 152
Дата рег-ции: Нояб. 2006  

Карма -2




Почему мой подход требует Мегобайта памяти, поясни пожалуйсто
 
 Top
Furax
Отправлено: 30 Сентября, 2008 - 09:22:52
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Davinchi
Потому что функция file() считывает файл в массив, т. е. загоняет всё его содержимое в оперативу. count() вызывается только после окончания работы file().

Vladimir
CODE:
$file = fopen("file.txt", 'r');
$lines = 0;
while (!feof($file)) if (fgets($file, 2048)) ++$lines;
Здесь вместо 2048 ставишь максимальную длину строки.
 
 Top
Леголегс Администратор
Отправлено: 30 Сентября, 2008 - 10:22:34
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




Самым экономным к памяти будет это вариант:
CODE:
$file = fopen("ping.txt","r");
$lines = 0;
while (false !== ($char = fgetc($file))) {
if ($char == "\n") $lines++;
}


PS Я вернулся.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0)
« PHP/Perl »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0453]     [ Gzipped ]