Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Ошибка при работе скрипта (http://forum.oszone.net/showthread.php?t=30967)

Rudy 20-09-2004 17:45 212402

Прикрутил скрипт новостей. Все работает. Но в начале выдает ошибку. *

Ошибка:
Цитата:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /var/home/195.123.48.17/itc.org.ua/public_http/index.php:10) in /var/home/195.123.48.17/itc.org.ua/public_http/news.php on line 2
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /var/home/195.123.48.17/itc.org.ua/public_http/index.php:10) in /var/home/195.123.48.17/itc.org.ua/public_http/news.php on line 2
Скрипт (начало):
Код:

<?
session_start();
include"params.php";
print"<link rel=\"stylesheet\" href=\"style.css\" type=\"text/css\"/>";
if($show=="")
{
if($page=="")
$page=1;
$file=file("base.dat");
$entries=count($file);
. . .

Ошибка происходит на index.php *на скрипте меню

Код:

<!-- menu building -->
<script type='text/javascript'>
function Go(){return}
</script>
<script type='text/javascript' src='exmplmenu_var.js'></script>
<script type='text/javascript' src='menu_com.js'></script>
<!-- end menu building -->

Это была страничка html я изменил расширение на php и прикручиваю скрипт из news.php вставляя код:
Код:

<?include"news.php";?>

[s]Исправлено: Prisoner, 2:40 21-09-2004[/s]

Vlad Drakula 20-09-2004 23:06 212403

Rudy
естественно...

ошибка ровно в том что и написано...
сервер сам все конкретно описал!!!

Prisoner 21-09-2004 02:54 212404

news.php судя по всему использует сессии, особенностью которых является полное первенство в выводе скрипта (это заголовочная информация, не путать с <head>). В Вашем же случае ДО сессии был произведен вывод кода странички (отрисовка меню). Таким образом рекомендую поглядеть можно ли обойтись без сессий и если нет поглядеть можно ли перенести начало сессии (session_start()) в начало скрипта так, чтобы они начинались до вывода какого-либо содержимого.

Rudy 21-09-2004 11:07 212405

1. session_start()) в начале скрипта news.php
а главная страница новостей index.php  подключает скрипт news.php    <?include"news.php";?>


2. сессий нужны для редактирования новостей, которое производится не из администраторского или модераторского раздела, а прямо с главной странице новостей! Для этого после процедуры авторизации через login.php возвращаясь на главную страницу новостей становятся доступны новые пункты: edit (редактировать) и del (удалить);

if(session_is_registered("adm"))
$ent1="<font size=1> | <a href=admin.php?do=answer&id=$n&random=$random&back=$id>answer</a> <a href=admin.php?do=deletecomm&id=$n&random=$random&back=$id>del</a></font>";

if(session_is_registered("mod"))
$ent1="<font size=1> | <a href=moder.php?do=answer&id=$n&random=$random&back=$id>answer</a> <a href=moder.php?do=deletecomm&id=$n&random=$random&back=$id>del</a></font>";






Prisoner 22-09-2004 03:10 212406

Это понятно, но смею повторно обратить внимание на ваш случай: вывод кода странички ДО создания сессии. Регистрация последних должна производиться ДО любого вывода тегов броузеру клиента, а не в начале включаемого скрипта.

Rudy 22-09-2004 09:44 212407

Сделал отдельно страницу админа без меню и.т.д. - работает.

[s]Исправлено: Prisoner, 2:40 23-09-2004[/s]

Prisoner 23-09-2004 02:40 212408

Rudy, если бы поглядели рекомендации в моем первом посте по этому вопросу, то вы бы могли не убирать меню... впрочем это тоже вариант.

Rudy 23-09-2004 09:41 212409

Попробую сделать файл с session_start() и потом иклудить в нужном месте.

Теперь еще один нюансик
При удалении новости удаляется img файл, но в разных новостях использутся одинаковые *img файлы, где отключить удаление

Код:

if($do==="deletenews" and session_is_registered("adm"))
{
if($flag=="")
print "<div align=\"center\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">
Вы уверены, что хотите удалить новость ID: <B>$id</B>?<BR><a href=admin.php?do=deletenews&id=$id&flag=yes>Да</a>
 <a href=\"javascript:history.back(1)\">Нет</a></font></div>";
if($flag=="yes")
{
$File=file("base.dat");
list($Date,$Random,$Author,$Authormail,$Authorid,$Name,$Msg,$Fn,$X,$Y,$Fn2)=split("::",$File[$id]);
$Fn2=trim($Fn2);
unlink("comments/$Random.dat");
@unlink("files/$Fn2");
@unlink("img/$Fn");

$file=file("base.dat");
$fp=fopen("base.dat","w");
for($i=0;$i<sizeof($file);$i++)
{
if($i==$id)
{
unset($file[$i]);
}
}
fputs($fp,implode("",$file));
fclose($fp);
print "<meta http-equiv=refresh content='1; url=base.php'>";
}
}

[s]Исправлено: Prisoner, 2:36 24-09-2004[/s]

Prisoner 24-09-2004 02:41 212410

Удаление происходит оператором unlink (собачка означает подавление вывода ошибок, если они возникают). Вероятнее всего картинки удаляются вторым таким оператором вашего кода. Я не знаю смысловую нагрузку файла base.dat - возможно там тоже что-то связанное с изображениями.

Rudy 24-09-2004 11:05 212411

Закрыл оператор @unlink("img/$Fn"), нормально.
В файле base.dat собственно база новостей в текстовом формате.
Посоветуй, как сделать.
Хочу переписать news.php чтобы сделать анонс новостей.
news.php выводит дату,заголовок, img файл и текст. Мне нужно чтобы выводился текс ($msg) около 200 символов, а далее я сделаю ссылку на новость.

Код:

print"
<table width=\"100%\" border=\"0\">
<tr>
<td><font size=1>$date</font> $ent2 $ent1</td>
</tr>
</table>";
if($name!="")
{
print"
<table width=\"100%\" border=\"0\">
<tr>
<td><font size=2><B>$name</B></font></td>
</tr>
</table>";
}

if($standon==1 and $fn!="")
{
$x=$standx;
$y=$standy;
}
print"
<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"5\">
<tr valign=\"top\">
<td width=\"1%\"><img src='img/$fn' width=$x height=$y border=0></td>
<td width=\"99%\"><font size=2>$msg</font><BR><BR><font size=1>
Добавил: <a href=mailto:$authormail>$author</a></td>
</tr>
</table>

Модераториал:Интересно, сколько раз мне еще придется добавлять теги форума в твои сообщения? :) О них можно рядом с окном ввода сообщения почитать.

[s]Исправлено: Prisoner, 2:24 25-09-2004[/s]

Prisoner 25-09-2004 02:48 212412

Есть маленькое уточнение - ограничивать новость посимвольно не есть хорошо - возможно отрезание на каком-либо слове, поэтому лучше резать по словам, выводя, скажем, лишь некоторое их количество. Это частая задача и ее может решить такая функция (писалась мной давно и при некоторых малых изменениях работает нормально):
Код:

$Year = array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
function DrawTitleNews()
    {
     global $Year;

     $DBLink = db_connect(DBHost, DBName, DBLogin, DBPassword, true);
     $Query = 'SELECT
                 news.n_id,
                 news.n_cap,
                 news.n_full,
                 news.n_date
               FROM
                 news
               ORDER BY
                 news.n_date DESC
               LIMIT 3';
     //echo nl2br($Query);
     $Result = mysql_query($Query);
     //есть ли новости? Есть? Выводим.
     if (mysql_num_rows($Result) > 0)
       {
        echo '<tr height="14">
                <td align="center">
                  <table width="90%" cellpadding="0" cellspacing="0" border="0">
                    <tr>
                      <td colspan="2">
                        <table width="100%" cellspacing="0" cellpadding="0" border="0">
                          <tr>
                            <td class="newscap">Последние новости</td>
                            <td class="newsdate" nowrap> 
                            </td>
                          </tr>
                        </table>
                      </td>
                     </tr>
                    <tr>
                      <td width="30"><img src="/img/1pxtr.gif" width="30" height="1" alt=""></td>
                      <td class="newsbody" width="100%">
                        <table width="100%" cellspacing="0" cellpadding="0" border="0">';
        while ($NewsInfo = mysql_fetch_array($Result, MYSQL_ASSOC))
          {
           //делим дату формата YYYY-mm-dd на составляющие
           $DT = explode('-', $NewsInfo['n_date']);
           //в $NewsBody теперь WordsPerNews слов
           $NewsBody = implode(' ', array_slice(explode(' ', $NewsInfo['n_full']), 0, WordsPerNews));
           //проверяем необходимость вывода новости в укороченном виде
           if (strlen($NewsBody) < strlen($NewsInfo['n_full']))
             {
              $NewsBody .= '<acronym class="redb" title="Это многоточие означает, что новость показана в укороченном виде.
Ниже каждой такой новости есть ссылка для доступа к
полному тексту новости.">...</acronym>';
              $FullLnk = '<tr><td colspan="2"><img src="/img/1pxtr.gif" width="1" height="1" alt=""></td></tr>
                          <td align="right" colspan="2"><a class="dblue" href="/news/'.$NewsInfo['n_id'].'"
 target="_blank" title="Перейти к просмотру полного текста новости в новом окне.">
полностью'.ImgBArrowRight.'</a></td>
                          <tr><td colspan="2"><img src="/img/1pxtr.gif" width="1" height="8" alt=""></td></tr>';
             }
           else
             $FullLnk = '<tr><td colspan="2"><img src="/img/1pxtr.gif" width="1" height="8" alt=""></td></tr>';
           echo '<tr height="14">
                <td align="center">
                  <table width="90%" cellpadding="0" cellspacing="0" border="0">
                    <tr>
                      <td colspan="2">
                        <table width="100%" cellspacing="0" cellpadding="0" border="0">
                          <tr>
                            <td class="dnewscap">
                               <h2>'.$NewsInfo['n_cap'].'</h2>
                             </td>
                            <td class="dnewsdate" nowrap>
                               '.($DT[2]+0).' '.$Year[$DT[1]-1].' '.$DT[0].'
                            </td>
                          </tr>
                        </table>
                      </td>
                     </tr>
                    <tr>
                      <td width="30"><img src="/img/1pxtr.gif" width="30" height="1" alt=""></td>
                      <td class="dnewsbody" width="100%"><p class="normal_padl20">'.$NewsBody.'</p></td>
                    </tr>
                    '.$FullLnk.'
                  </table>
                </td>
              </tr>';

          }
        echo '          </table>
                      </td>
                    </tr>
                    <tr><td colspan="2"><img src="/img/1pxtr.gif" width="1" height="1" alt=""></td></tr>
                    <tr><td colspan="2" align="right"><a class="dblue" href="/news/all">архив'.ImgBArrowRight.'</a></td></tr>
                    <tr><td colspan="2"><img src="/img/1pxtr.gif" width="1" height="8" alt=""></td></tr>
                  </table>
                </td>
              </tr>';
       }
    }

У меня новости берутся из БД, но в общем и целом не важно откуда происходят данные... только в коде разобраться надо :). Как это выглядит при выводе можно поглядеть тут

Rudy 25-09-2004 16:47 212413

Это слишком для моего простенького скрипта,
- проверяется необходимость вывода в сокращенном виде,
- используется SQL
- размер $NewsBody оговорен где-то ранее.

У меня вывод новости:
... <td width=\"99%\"><font size=2>$msg</font>
как бы ее тупо резануть после 200 символа или ограничить в рамках ячейки таблицы

Prisoner 26-09-2004 02:27 212414

Лады... тупо режем (но по словам :), скажем 50 слов):
Код:

$msg = implode(' ', array_slice(explode(' ', $msg), 0, 50));
После этого кода от строки в $msg будет только 50 слов.

Rudy 27-09-2004 12:50 212415

Сделал так

if(strlen($msg)>50)
$msg = implode(' ', array_slice(explode(' ', $msg), 0, 50));

Ок!

Prisoner 28-09-2004 02:26 212416

Ок только на первый взгляд... strlen считает символы, а из-за применения explode(' ', $msg) мы оперируем словами. В результате переводя на человеческий язык ваш код получаем: если длина строки больше 50ти символов, то оставить в строке только 50 слов. А что если слова будут больше одного символа (такое ведь иногда встречается? :)). В общем корректнее будет так:
Код:

$msgwords = explode(' ', $msg);
if (sizeof($msgwords)>50)
  $msg = implode(' ', array_slice($msgwords, 0, 50));

Вот теперь новость с более чем 50тью словами будет усекаться корректно.

Rudy 28-09-2004 13:07 212417

Как правильно сделать:
// если болше 50 слов, краткое содежание+ссылка

Код:

$msgwords = explode(' ', $msg);
if (sizeof($msgwords)>50)
{
$msg = implode(' ', array_slice($msgwords, 0, 50));
print"
<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"5\">
<tr valign=\"top\">
<td width=\"99%\><font size=0><p>$msg</font> <a href=http://msg.php</a></td>
</tr>
</table>

// если меньше 50 слов полное содержание

$msgwords = explode(' ', $msg);
if (sizeof($msgwords)<50)
{
$msg = implode(' ', array_slice($msgwords, 0, 50));
print"
<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"5\">
<tr valign=\"top\">
<td width=\"99%\><font size=0><p>$msg</font></td>
</tr>
</table>

[s]Исправлено: Prisoner, 2:33 29-09-2004[/s]

Prisoner 29-09-2004 02:40 212418

Код:

$msgwords = explode(' ', $msg);
if (sizeof($msgwords)>50)
  {
   $msg = implode(' ', array_slice($msgwords, 0, 50));
   print"<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"5\">
               <tr valign=\"top\">
                 <td width=\"99%\><font size=0><p>$msg</font> <a href=http://msg.php</a></td>
               </tr>
            </table>";
  }
else
  print"<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"5\">
               <tr valign=\"top\">
                 <td width=\"99%\><font size=0><p>$msg</font></td>
               </tr>
            </table>";

То есть чтобы сделать правильно нужно читать мануал (любой) по структурам ветвления сиречь об условиях.

Rudy 12-10-2004 11:06 212419

Новости выводятся на страницу с последней и вниз, а как вывести наоборот.

Цитата:

if($page!="")
{
$Tmp=$nums*$page;
$tmp=$nums;
$up=$Tmp-$tmp;

$down=$up+$nums;
print"
";
for ($i=$up; $i<$down; $i++)
{
$rev=@array_reverse($file);
if ($rev[$i]!="")
{
list($myid,$rand,$date,$name,$mail,$sitename,$url,$msg)=split("::",$rev[$i]);

$v=@file("votes/$rand.dat");
$s=@file("trans/$rand.dat");

$n=$i-$entries;
$n++;
$n=abs($n);
$k=$n+1;

Prisoner 13-10-2004 06:52 212420

Трудночитаемый, однако, код... будем думать: новости скорее всего добавляются в конец файла, таким образом если выдергивать часть новостей (для вывода на странице х), то для вывода в порядке старые->новые нужно переворачивать массив считанных данных (что и делается в коде функцией array_reverse) и если попробывать этого не делать, то можно, вероятно, достичь того, чего вы хотите.


Время: 22:48.

Время: 22:48.
© OSzone.net 2001-