Показать полную графическую версию : Ошибка при работе скрипта
Прикрутил скрипт новостей. Все работает. Но в начале выдает ошибку. *
Ошибка:
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()) в начало скрипта так, чтобы они начинались до вывода какого-либо содержимого.
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
Это понятно, но смею повторно обратить внимание на ваш случай: вывод кода странички ДО создания сессии. Регистрация последних должна производиться ДО любого вывода тегов броузеру клиента, а не в начале включаемого скрипта.
Сделал отдельно страницу админа без меню и.т.д. - работает.
Исправлено: Prisoner, 2:40 23-09-2004
Prisoner
23-09-2004, 02:40
Rudy, если бы поглядели рекомендации в моем первом посте по этому вопросу, то вы бы могли не убирать меню... впрочем это тоже вариант.
Попробую сделать файл с 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 - возможно там тоже что-то связанное с изображениями.
Закрыл оператор @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>&nbsp;
</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/)
Это слишком для моего простенького скрипта,
- проверяется необходимость вывода в сокращенном виде,
- используется 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 слов.
Сделал так
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тью словами будет усекаться корректно.
Как правильно сделать:
// если болше 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>";
То есть чтобы сделать правильно нужно читать мануал (любой) по структурам ветвления сиречь об условиях.
Новости выводятся на страницу с последней и вниз, а как вывести наоборот.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.