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

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

Strict Standards: Resource ID#38 used as offset, casting to integer (38) in /home/u1001/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Добавление текста в базу данных и выведение номера строки
ТвойWeb » WebMaster класс » PHP/Perl » Добавление текста в базу данных и выведение номера строки

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

1. Vladimir - 30 Сентября, 2008 - 12:08:43 - перейти к сообщению
Есть такой скриптик, который вбивает в строку текстовой базы данных текст из формы:

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 и т.д.
2. Davinchi - 30 Сентября, 2008 - 15:13:43 - перейти к сообщению
После записи в файл выведи количество строк, это и будет номер последней строки
CODE:
$m=file("*.txt");
$num=count($m);
3. Vladimir - 30 Сентября, 2008 - 15:49:47 - перейти к сообщению
Понятно. Спасибо!

А как сделать проверку вводимых данных: если во вводимом тексте отсутствует какое-либо из нужных слов, то данные не передаются в базу, а происходит редирект на страницу с сообщением об ошибке?
4. Furax - 30 Сентября, 2008 - 16:15:25 - перейти к сообщению
Davinchi
Очень плохой стиль. Было сказано, что файл может содержать 1024 строки. Пусть по 1024 символа. Итого такой подход потребует мегабайта памяти - вряд ли сервер столько даст. Лучше честно прочитать файл по строкам и посчитать число чтений.

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

Кстати, код весьма небезопасен. В файле могут быть плохие символы; надо следить, чтобы такой файл не был заинклюден из другого (тоже дырявого) скрипта. Кроме того, его содержимое нельзя напрямую выводить, ибо оно может содержать теги. Наконец, можно добавить за раз не одну запись, а много.
5. Vladimir - 30 Сентября, 2008 - 16:52:09 - перейти к сообщению
Furax пишет:
Было сказано, что файл может содержать 1024 строки. Пусть по 1024 символа.
Я просто для примера сказал. Строк может быть и больше.
6. Furax - 30 Сентября, 2008 - 16:59:21 - перейти к сообщению
Тем более. Не стоит занимать несколько мегабайт оперативы только для того, чтобы посчитать одно число.
7. Vladimir - 30 Сентября, 2008 - 17:01:34 - перейти к сообщению
Furax пишет:
Лучше честно прочитать файл по строкам и посчитать число чтений.
И как это тогда будет?
8. Davinchi - 30 Сентября, 2008 - 17:03:17 - перейти к сообщению
Почему мой подход требует Мегобайта памяти, поясни пожалуйсто
9. Furax - 30 Сентября, 2008 - 17:22:52 - перейти к сообщению
Davinchi
Потому что функция file() считывает файл в массив, т. е. загоняет всё его содержимое в оперативу. count() вызывается только после окончания работы file().

Vladimir
CODE:
$file = fopen("file.txt", 'r');
$lines = 0;
while (!feof($file)) if (fgets($file, 2048)) ++$lines;
Здесь вместо 2048 ставишь максимальную длину строки.
10. Леголегс - 30 Сентября, 2008 - 18:22:34 - перейти к сообщению
Самым экономным к памяти будет это вариант:
CODE:
$file = fopen("ping.txt","r");
$lines = 0;
while (false !== ($char = fgetc($file))) {
if ($char == "\n") $lines++;
}


PS Я вернулся.

Форум на AlfaSpace.NET


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

[Script Execution time: 0.0222]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/u1001/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33