Автор Тема: пустая строка  (Прочитано 8579 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« : 30 Апреля 2004, 20:32:50 »
Всем привет!
Ситуация:
Пишу новостную ленту. Всё очень просто. В админке есть форма с тремя полями:
1 - вводишь дату, 2 - краткое описание новости, 3 - полное описание.
Далее форму принимает скрипт, обрабатывает её и записывает в простой текстовый файл / запись в файл / , далее с помощью скриптов я обрабатываю файл: либо просматриваю все добавленные новости, либо редактирую новости, либо удаляю не нужные.
В чём же проблема:
Когда сам файл пустой, при просмотре всех новостей мне выдаёт ошибку:
NoticeUndefined offset7 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 
"<td>$pt[1]</td>\\n";  
.  
вывод на экран  
.  
}

Заранее спасибо за ответ!

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
пустая строка
« Ответ #1 : 30 Апреля 2004, 23:56:55 »
Цитировать
MXM:
Как удалить символ новой строки и перевода корретки - /n, /r в конце строки?

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

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

Это шедевр :)
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« Ответ #2 : 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);

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
пустая строка
« Ответ #3 : 04 Мая 2004, 17:36:37 »
Упростил код:
$news=file("../data/news.txt");

я не знаю, зачем ты пришпандориваешь к каждому элементу точку с запятой, но уверен, что это лишнее.

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« Ответ #4 : 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 
"<td>$pt[1]</td>\\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".\'<BR>\';
echo "$nomer[2]".\'<BR>\';
$nomer=implode(\'|\',$nomer);
echo "$nomer".\'<BR>\';
echo "$nomer[2]".\'<BR>\';
/*
Отображение на экране:
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 
"<td>$pt[0]</td>\\n";...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
пустая строка
« Ответ #5 : 04 Мая 2004, 19:27:20 »
потрясающая фантастика.
а СЛОВАМИ ты не мог бы описать отличие имплоде от эксплоде.
а так же - каким боком тут вообще оказалось это отличие.
как и само имплоде.
ты можешь объяснить, как ты можешь вообще сравниавать эти функции?
будь так добр?

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

и как выглядит твой код теперь, после всех упрощений?

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« Ответ #6 : 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 
"<td>Номер новости: $pt[0]</td>\\n";
print 
"<td>Дата добавления: $pt[1]</td>\\n";
.   
и т.двывод на экран   
.}

Только, пустая строка остаётся пустой строкой...(

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
пустая строка
« Ответ #7 : 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);

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
пустая строка
« Ответ #8 : 04 Мая 2004, 20:05:31 »
а по поводу пустой строки - почему тебе не приходит в голову отнять от $nnews единицу?

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« Ответ #9 : 04 Мая 2004, 20:31:07 »
RomikChef, к сожалению, file() не проходит.
Отнять единицу эта была моя первая мысль после появления пустой строки... вариант не подходит, минус единица приводит к не отображению последней внесенной новости...( хотя счетчик при этом работает точно...

Оффлайн CLiI{er

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 57
  • +0/-0
  • 0
    • Просмотр профиля
    • http://glossword.info/
пустая строка
« Ответ #10 : 04 Мая 2004, 20:32:16 »
file() всегда проходит при чтении файлов.
<?php
$arFile 
file(\'../data/news.txt\');
printf(\'<p>Всего новостей: %d</p>\', sizeof($arFile));
print \'<table border="1">\';
print \'<tr><th>Номер новости</th><th>Дата добавления</th></tr>\';
foreach($arFile as $v) {
    $arData = explode(\';\', $v);
    printf(\'<tr><td>%d</td><td>%s</td></tr>\', ++$i, $arData[0]);
}
print \'</table>\';
?>
« Последнее редактирование: 04 Мая 2004, 20:48:19 от RomikChef »
gw веб-песочница жж

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
пустая строка
« Ответ #11 : 04 Мая 2004, 20:37:43 »
Цитировать
MXM:
к сожалению, file() не проходит.

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

фантастика.
правь код, чтобы показывало.
проблема не в идее (отнять 1), а в том, как ты ее сделал.

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« Ответ #12 : 04 Мая 2004, 20:42:56 »
RomikChef, прошу прощения, я хотел сказать, что file() не проходит, а не подходит, т.к. новостную ленту я хотел реализовать на fopen(). С идеей и её реализацией с тобой полностью согласен.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
пустая строка
« Ответ #13 : 04 Мая 2004, 20:50:53 »
Цитировать
MXM:
file() не проходит, т.к. новостную ленту я хотел реализовать на fopen().

а теперь еще раз, и по-русски.
какой ты видишь смысл в том, чтобы писать 10 строчек вместо одной?
У тебяя есть осмвысленное объяснение желания делать криво?

Оффлайн MXM

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 37
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
пустая строка
« Ответ #14 : 05 Мая 2004, 11:39:46 »
RomikChef, затрудняюсь ответить.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28