Войти

Показать полную графическую версию : Ошибка при работе скрипта


Rudy
20-09-2004, 17:45
Прикрутил скрипт новостей. Все работает. Но в начале выдает ошибку. *

Ошибка:
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";?>


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

Vlad Drakula
20-09-2004, 23:06
Rudy
естественно...

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

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

Rudy
21-09-2004, 11:07
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
Это понятно, но смею повторно обратить внимание на ваш случай: вывод кода странички ДО создания сессии. Регистрация последних должна производиться ДО любого вывода тегов броузеру клиента, а не в начале включаемого скрипта.

Rudy
22-09-2004, 09:44
Сделал отдельно страницу админа без меню и.т.д. - работает.

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

Prisoner
23-09-2004, 02:40
Rudy, если бы поглядели рекомендации в моем первом посте по этому вопросу, то вы бы могли не убирать меню... впрочем это тоже вариант.

Rudy
23-09-2004, 09:41
Попробую сделать файл с 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'>";
}
}

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

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

Rudy
24-09-2004, 11:05
Закрыл оператор @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>

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

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

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

$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>';
      }
   }

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

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

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

Prisoner
26-09-2004, 02:27
Лады... тупо режем (но по словам :), скажем 50 слов):
$msg = implode(' ', array_slice(explode(' ', $msg), 0, 50));
После этого кода от строки в $msg будет только 50 слов.

Rudy
27-09-2004, 12:50
Сделал так

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

Ок!

Prisoner
28-09-2004, 02:26
Ок только на первый взгляд... 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
Как правильно сделать:
// если болше 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>

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

Prisoner
29-09-2004, 02:40
$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
Новости выводятся на страницу с последней и вниз, а как вывести наоборот.


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




© OSzone.net 2001-2012