Forum Webscript.Ru

Программирование => PHP => Тема начата: MXM от 30 Апреля 2004, 20:32:50

Название: пустая строка
Отправлено: MXM от 30 Апреля 2004, 20:32:50
Всем привет!
Ситуация:
Пишу новостную ленту. Всё очень просто. В админке есть форма с тремя полями:
1 - вводишь дату, 2 - краткое описание новости, 3 - полное описание.
Далее форму принимает скрипт, обрабатывает её и записывает в простой текстовый файл / запись в файл / , далее с помощью скриптов я обрабатываю файл: либо просматриваю все добавленные новости, либо редактирую новости, либо удаляю не нужные.
В чём же проблема:
Когда сам файл пустой, при просмотре всех новостей мне выдаёт ошибку:
Notice: Undefined offset: 7 in z:homelocalhostwww4adinchange_max.phtml on line 36
и т.д., строчек пять.
Когда добавляю новость, всё равно показывает эту же ошибку.
При подсчете количества новостей, отображает - 2 новости, а не одну, как есть на самом деле.
Как устранил ошибку:
Просто залез в файл и удалил перевод строки. Вид записи в файле:
 1;2004-04-30;0;30-04-04;краткое описание;полное описапние
После чего работает всё корректно. Но это не выход. Никак не могу найти ошибку в скрипте? Как удалить символ новой строки и перевода корретки - /n, /r в конце строки? Или как с этим бороться. Помогите найти.
Сам скрипт:
$fp=fopen("../data/news.txt","r");  
$news=array();  
$i=0;  
while(!feof($fp))  
{  
$str="";  
$news[$i]=fgets($fp,10000);  
$pt=explode(";",$news[$i]);  
$news[$i]=implode(";",$pt);  
$str=$str.";";  
$news[$i]=$str.$news[$i];  
$i++;}  
fclose($fp);  
sort($news);  
$nnews=count($news);  
print "Всего новостей - $nnews";  
for($i=0;$i<$nnews;$i++)  
{$pt=explode(";",$news[$i]);  
print "$pt[1]\\n";  
.  
вывод на экран  
.  
}
Заранее спасибо за ответ!
Название: пустая строка
Отправлено: FreeSpace от 30 Апреля 2004, 23:56:55
Цитировать
MXM:
Как удалить символ новой строки и перевода корретки - /n, /r в конце строки?

[p]rtrim[/p]. Но чем обрезать символ перевода строки, проще его вообще не писать.

Цитировать
$pt=explode(";",$news[$i]);
$news[$i]=implode(";",$pt)

Это шедевр :)
Название: пустая строка
Отправлено: MXM от 04 Мая 2004, 15:08:39
Упростил код:
$fp=fopen("../data/news.txt","r");
$news=array();
$i=0;
while(!feof($fp))
{$news[$i]=fgets($fp,10000);
$str=";";
$news[$i]=$str.$news[$i];
$i++;}
fclose($fp);
Название: пустая строка
Отправлено: Меняздесьдавнонет от 04 Мая 2004, 17:36:37
Упростил код:
$news=file("../data/news.txt");

я не знаю, зачем ты пришпандориваешь к каждому элементу точку с запятой, но уверен, что это лишнее.
Название: пустая строка
Отправлено: MXM от 04 Мая 2004, 18:03:24
FreeSpace, согласен, что имплоде/эксплоде это шедевр. Постараюсь больше не соверашать такие глупости.
RomikChef, почему пришпандориваю точку с запятой, потому чтоб отделить внесенную информацию, т.е. к примеру:
дата;краткая_запись_новости;полная_запись_новости .
Точка с запятой в коде и вправду лишняя, всё дело в том, что когда я вывожу все новости на экран:
sort($news);  
$nnews=count($news);  
print "Всего новостей - $nnews";  
for($i=0;$i<$nnews;$i++)  
{$pt=explode(";",$news[$i]);  
print "$pt[1]\\n";  
.  
вывод на экран  
.  
}, то я использую explode(). Explode() отличается от Implode() вот чем, приведу пример:
# НАЧАЛО отличие explode() от implode() #
$nomer=\'1|2|3|4|5|6|7|8|9|10|11|12|13\';
$nomer=explode(\'|\',$nomer);
echo "$nomer".\'
\';
echo "$nomer[2]".\'
\';
$nomer=implode(\'|\',$nomer);
echo "$nomer".\'
\';
echo "$nomer[2]".\'
\';
/*
Отображение на экране:
Array
3
1|2|3|4|5|6|7|8|9|10|11|12|13
2
*/
# КОНЕЦ отличие explode() от implode() #
Посему мне потребовалось добавить ";", чтоб корректно отобразить новости, но исходя из примера отличия, нужно было просто поменять номер доступа к элементам, или заменить эксплоде на имплоде, так как одно из различий это получения элемента по номеру доступа.
Отсюда код:...
while(!feof($fp))
{$news[$i]=fgets($fp,10000);
$i++;}...
...{$pt=explode(";",$news[$i]);  
print "$pt[0]\\n";...
Название: пустая строка
Отправлено: Меняздесьдавнонет от 04 Мая 2004, 19:27:20
потрясающая фантастика.
а СЛОВАМИ ты не мог бы описать отличие имплоде от эксплоде.
а так же - каким боком тут вообще оказалось это отличие.
как и само имплоде.
ты можешь объяснить, как ты можешь вообще сравниавать эти функции?
будь так добр?

судя по всему, ты просто фатально заблуждаешься по поводу ИМплоде.

и как выглядит твой код теперь, после всех упрощений?
Название: пустая строка
Отправлено: MXM от 04 Мая 2004, 19:48:14
Цитировать
RomikChef:
потрясающая фантастика.

Для меня фантастика, я же ещё не волшебник...;)
Объяснить не могу (пожимаю плечами). Могу и заблуждаться.
После всех упрощений код стал:
$fp=fopen("../data/news.txt","r");  
$news=array();  
$i=0;  
while(!feof($fp))  
{$news[$i]=fgets($fp,10000);  
 $i++;}  
fclose($fp);
sort($news);
$nnews=count($news);  
print "Всего новостей - $nnews";  
for($i=0;$i<$nnews;$i++)  
{$pt=explode(";",$news[$i]);  
print "Номер новости: $pt[0]\\n";
print "Дата добавления: $pt[1]\\n";
.  
и т.д. вывод на экран  
.}
Только, пустая строка остаётся пустой строкой...(
Название: пустая строка
Отправлено: Меняздесьдавнонет от 04 Мая 2004, 20:02:51
постой.
я же тебе написал, что надо делать вместо этого:
$fp=fopen("../data/news.txt","r");    
$news=array();    
$i=0;    
while(!feof($fp))    
{$news[$i]=fgets($fp,10000);    
$i++;}    
fclose($fp);
Название: пустая строка
Отправлено: Меняздесьдавнонет от 04 Мая 2004, 20:05:31
а по поводу пустой строки - почему тебе не приходит в голову отнять от $nnews единицу?
Название: пустая строка
Отправлено: MXM от 04 Мая 2004, 20:31:07
RomikChef, к сожалению, file() не проходит.
Отнять единицу эта была моя первая мысль после появления пустой строки... вариант не подходит, минус единица приводит к не отображению последней внесенной новости...( хотя счетчик при этом работает точно...
Название: пустая строка
Отправлено: CLiI{er от 04 Мая 2004, 20:32:16
file() всегда проходит при чтении файлов.
$arFile = file(\'../data/news.txt\');
printf(\'

Всего новостей: %d

\', sizeof($arFile));
print \'\';
print \'\';
foreach($arFile as $v) {
    $arData = explode(\';\', $v);
    printf(\'\', ++$i, $arData[0]);
}
print \'
Номер новостиДата добавления
%d%s
\';
?>
Название: пустая строка
Отправлено: Меняздесьдавнонет от 04 Мая 2004, 20:37:43
Цитировать
MXM:
к сожалению, file() не проходит.

фантастика.
аргументы?
Цитировать
MXM:
минус единица приводит к не отображению последней внесенной новости

фантастика.
правь код, чтобы показывало.
проблема не в идее (отнять 1), а в том, как ты ее сделал.
Название: пустая строка
Отправлено: MXM от 04 Мая 2004, 20:42:56
RomikChef, прошу прощения, я хотел сказать, что file() не проходит, а не подходит, т.к. новостную ленту я хотел реализовать на fopen(). С идеей и её реализацией с тобой полностью согласен.
Название: пустая строка
Отправлено: Меняздесьдавнонет от 04 Мая 2004, 20:50:53
Цитировать
MXM:
file() не проходит, т.к. новостную ленту я хотел реализовать на fopen().

а теперь еще раз, и по-русски.
какой ты видишь смысл в том, чтобы писать 10 строчек вместо одной?
У тебяя есть осмвысленное объяснение желания делать криво?
Название: пустая строка
Отправлено: MXM от 05 Мая 2004, 11:39:46
RomikChef, затрудняюсь ответить.
Название: пустая строка
Отправлено: MXM от 06 Мая 2004, 18:20:00
Снова всем привет!
Ответ найден, надо сделать проверку:$fp=fopen("../data/news.txt","r");
$news=array();
$i=0;
while(!feof($fp))
{$str=fgets($fp,10000);
 if($str==\'\'&&feof($fp)) break; /* принудительный выход из цикла без сохранения строки в массиве */
 $news[]=$str;}
fclose($fp);
Думаю, что тему можно закрыть.
Название: пустая строка
Отправлено: Меняздесьдавнонет от 10 Мая 2004, 11:10:05
стереть ее надо, а не закрывать
Название: пустая строка
Отправлено: MXM от 10 Мая 2004, 11:33:54
Цитировать
RomikChef:
стереть ее надо, а не закрывать
Привет! Тогда, делаем так:
$fp=fopen("../data/news.txt","r");    
$news=array();    
$i=0;    
while(!feof($fp))    
{$news[$i]=fgets($fp,10000);
if (trim($news[$i])==\'\') continue;
...
Правильно?
Название: пустая строка
Отправлено: Меняздесьдавнонет от 10 Мая 2004, 11:55:48
я писал, как
для чтения файла в массив построчно есть функция
а оставлять топик с кривым кодом, смысла которого авор не знает - не стоит
Название: пустая строка
Отправлено: MXM от 10 Мая 2004, 12:32:55
Цитировать
RomikChef:
а оставлять топик с кривым кодом, смысла которого авор не знает - не стоит
Тебе конечно спасибо! Но если ты внимательно почитаешь топик, то думаю, со второй попытки у тебя получится увидеть, что я не писал, что не знаю смысл кода.