Forum Webscript.Ru
Программирование => PHP => Тема начата: 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";
.
вывод на экран
.
}
Заранее спасибо за ответ!
-
MXM:
Как удалить символ новой строки и перевода корретки - /n, /r в конце строки?
[p]rtrim[/p]. Но чем обрезать символ перевода строки, проще его вообще не писать.
$pt=explode(";",$news[$i]);
$news[$i]=implode(";",$pt)
Это шедевр :)
-
Упростил код:
$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);
-
Упростил код:
$news=file("../data/news.txt");
я не знаю, зачем ты пришпандориваешь к каждому элементу точку с запятой, но уверен, что это лишнее.
-
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";...
-
потрясающая фантастика.
а СЛОВАМИ ты не мог бы описать отличие имплоде от эксплоде.
а так же - каким боком тут вообще оказалось это отличие.
как и само имплоде.
ты можешь объяснить, как ты можешь вообще сравниавать эти функции?
будь так добр?
судя по всему, ты просто фатально заблуждаешься по поводу ИМплоде.
и как выглядит твой код теперь, после всех упрощений?
-
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";
.
и т.д. вывод на экран
.}
Только, пустая строка остаётся пустой строкой...(
-
постой.
я же тебе написал, что надо делать вместо этого:
$fp=fopen("../data/news.txt","r");
$news=array();
$i=0;
while(!feof($fp))
{$news[$i]=fgets($fp,10000);
$i++;}
fclose($fp);
-
а по поводу пустой строки - почему тебе не приходит в голову отнять от $nnews единицу?
-
RomikChef, к сожалению, file() не проходит.
Отнять единицу эта была моя первая мысль после появления пустой строки... вариант не подходит, минус единица приводит к не отображению последней внесенной новости...( хотя счетчик при этом работает точно...
-
file() всегда проходит при чтении файлов.
$arFile = file(\'../data/news.txt\');
printf(\'Всего новостей: %d
\', sizeof($arFile));
print \'\';
print \'Номер новости | Дата добавления |
\';
foreach($arFile as $v) {
$arData = explode(\';\', $v);
printf(\'%d | %s |
\', ++$i, $arData[0]);
}
print \'
\';
?>
-
MXM:
к сожалению, file() не проходит.
фантастика.
аргументы?
MXM:
минус единица приводит к не отображению последней внесенной новости
фантастика.
правь код, чтобы показывало.
проблема не в идее (отнять 1), а в том, как ты ее сделал.
-
RomikChef, прошу прощения, я хотел сказать, что file() не проходит, а не подходит, т.к. новостную ленту я хотел реализовать на fopen(). С идеей и её реализацией с тобой полностью согласен.
-
MXM:
file() не проходит, т.к. новостную ленту я хотел реализовать на fopen().
а теперь еще раз, и по-русски.
какой ты видишь смысл в том, чтобы писать 10 строчек вместо одной?
У тебяя есть осмвысленное объяснение желания делать криво?
-
RomikChef, затрудняюсь ответить.
-
Снова всем привет!
Ответ найден, надо сделать проверку:$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);
Думаю, что тему можно закрыть.
-
стереть ее надо, а не закрывать
-
RomikChef:
стереть ее надо, а не закрывать
Привет! Тогда, делаем так:
$fp=fopen("../data/news.txt","r");
$news=array();
$i=0;
while(!feof($fp))
{$news[$i]=fgets($fp,10000);
if (trim($news[$i])==\'\') continue;
...
Правильно?
-
я писал, как
для чтения файла в массив построчно есть функция
а оставлять топик с кривым кодом, смысла которого авор не знает - не стоит
-
RomikChef:
а оставлять топик с кривым кодом, смысла которого авор не знает - не стоит
Тебе конечно спасибо! Но если ты внимательно почитаешь топик, то думаю, со второй попытки у тебя получится увидеть, что я не писал, что не знаю смысл кода.