Пишем новостную ленту, с удобной админкой при помощи php & mysql
(Скрипты будут взаимодействовать с форумом vBulletin 3.5.3).
Ну чтож приступим, сначала представим себе как это будет выглядеть на деле:
- скрипт вывода новостей на страницу
- скрипт добавления новостей
- скрипт редактирования\удаления статей
- отдельный модуль конекта к базе данных
- модуль защиты, фильтрация всего - что плохо ;)
Для начала подумаем над структурой таблицы новостей у меня получилось что то типа этого:
CREATE TABLE mytable(
id bigint(20) auto_increment, //id новости
body text, //"тело" новости
time text, //время добавления
hide int(6) default null, //0 - открыта, 1- закрыта,это на той случай если замучает ностальгия
;)
prior int(6) default null, //приоритет новости, до этого я тока додумался, кароче бут: если
приор 1 то будет выводится всегда по верх всего сверху а 0 это просто новость,но это уже каму
как
PRIMARY KEY(id));
Структура таблицы готова теперь напишем модуль конекта к базеданных, тут все просто как жопа:
<?
//имя скрипта - dbcon.php
$dblocation='ссылка на ваш сайт';
$dbname='база данных';
$sqluser='логин';
$sqlpass='пароль';
if(!$dbcn=@mysql_connect($dblocation,$sqluser,$sqlpass)){
echo 'Не удается подключиться к серверу!';
exit();
}else{
if(!@mysql_select_db($dbname,$dbcn)){
echo 'Нет такой базы данных!';
exit();
}
}
?>
Его нужно совать во все файлы которые работают с сервером mysql.
Дальше скрипт добавления новостей:
<?
//имя скрипта - add.news.php
include 'dbcon.php'; //сод. этого файла выше
include 'func.php'; //сдесь функции для скриптов,юз. только функц. cutty, для фильтрации
chdir('vBulletin353/'); //переходим в каталог с форумом для успешного инклудинга жизнено
необходимого файла global.php
require_once('global.php');
require_once('inc.slogin.php'); // скрипт авторизации !!! будет рассмотрен ниже
chdir('../'); //возвращаемся обратно
echo '<table><tr>';
echo '<td><a hrefн.re-news.php>Листинг, удаление\редактирование</a></td>';
echo '</tr></table>';
//ниже идет форма для добавления новости
echo '<table>';
echo '<form actiond.news.php method=get>';
echo '<tr><td>add-news</td></tr>';
echo '<tr><td><input type=text name=body></td></tr>';
echo '<tr><td><input type=submit named value="add"></td></tr></td></tr>';
echo '</form>';
echo '</table>';
//события при нажатии кнопки add
@$add=cutty($_GET['add']);
@$body=cutty($_GET['body']);
if($add){
//если поле "тело" пусто, то грязно материмся
if($body == ""){
echo '<table><tr>';
echo '<td>Напиши что-нибудь</td>\n';
echo '</tr></table>\n';
echo '<meta http-equiv="refresh" content="1; urld.news.php">';
exit();
}
//далее записываем переданные параметры в таблицу
$dateЪte("m.d.y");
if(mysql_query("INSERT INTO mytable VALUES('','".$body."','".$date."','')")){
echo '<table><tr>';
echo '<td>Новость добавлена</td>';
echo '</tr></table>';
echo '<meta http-equiv="refresh" content="1; urld.news.php">';
//усё, записали, возвращаемся в зад
}
}
?>
Вобщем как всегда форма и обработчик, мог бы и сам=)
Дальше больше бум выводить, редактировать, удалять ненавистные новости
<?
//имя скрипта - ed.re-news.php
include 'dbcon.php'; //ну вобщем все тоже
include 'func.php';
chdir('../../vBulletin/');
require_once('global.php');
require_once('inc.slogin.php');
chdir('../iostream/inc/');
@$do=cutty($_GET['do']);
@$id=cutty($_GET['id']);
//########list news#####
if($do!='rem' || $do!='edit'){
echo '<table><tr>';
echo '<td><a hrefн.re-news.php>Добавить новость</a></td>';
echo '</tr></table>';
//листинг новостей,форма
echo "<table>";
echo "<form actionн.re-news.php method=get>";
//выдираем все "открытые" новости
$order=mysql_query("SELECT * FROM mytable WHERE hide=0");
while($desk=mysql_fetch_array($order)){
//дальше будет скрипт вывода новостей в виде галка(пометить нужное и удалить) и тело
письма(см. ниже)
echo "<tr><td><input type=checkbox name='box[]' value=".$desk['id']."></td>
<td><a hrefн.re-news.php?doнit&id=".$desk['id'].">";
//чтобы не засирать эран всякой хуйней сделаем вывод первых 30-ти символов
for($i=0;$i<30;$i++){
echo $desk['body'][$i];
}
echo "</a></td></tr>";
}
echo "<tr><td></td><td>";
echo "<input type=submit name=remove value='remove'></td></tr>";
echo "</td></tr>";
//#####if $doнit#############
}elseif($do=='edit'){
//если адрес выглядит типа ed.re-news.php?doнit&id=6 и переменная do имеет значение edit то:
$mq=mysql_query("SELECT body FROM mytable WHERE hide=0 AND id=$id");
while($mfa=mysql_fetch_array($mq)){
//выдираем инфу о новости и загоняем значение столбца body где id=$id и hide=0 тоесть открыта
echo '<table>';
echo '<form actionн.re-news.php method=get>';
echo '<tr><td><textarea name=body
style="width:300px;height:95px">'.$mfa['body'].'</textarea></td></tr>';
echo '<tr><td><input type=submit nameнit valueнit>';
echo '<input type=submit name=rem value=remove></td></tr>';
echo '<input type=hidden name=hid value='.$id.'>';
}
//########if do=rem##########
}elseif($do=='rem'){
//если адрес выглядит типа ed.re-news.php?do=rem&id=6 и переменная do имеет значение rem то:
mysql_query("UPDATE mytable SET hide=1 WHERE id=".$id."");
//удаляем в жопу эту новость а точнее делаем ее невидимой для юзеров
echo '<table><tr>';
echo '<td>Новость успешно удалена</td>';
echo '</tr></table>';
echo '<meta http-equiv="refresh" content="1; urlн.re-news.php">';
}
//#########edit###########
if(@$edit=cutty($_GET['edit'])){
//если кто то дрочил кнопку edit:
@$ebody=cutty($_GET['body']);
@$hid=cutty($_GET['hid']);
mysql_query("UPDATE mytable SET body='".$ebody."' where id=".$hid."");
echo '<table><tr>';
echo '<td>Новость успешно редактирована</td>';
echo '</tr></table>';
echo '<meta http-equiv="refresh" content="1; urlн.re-news.php">';
}
//#########remove#########
if(@$rem=cutty($_GET['rem'])){
//если кто то дрочил кнопку remove в форме редактирования:
@$hid=cutty($_GET['hid']);
mysql_query("UPDATE mytable SET hide=1 WHERE id=".$id."");
echo '<table style="width:310px;height:10px"><tr>';
echo '<td class=s10>Новость успешно удалена</td>';
echo '</tr></table>';
echo '<meta http-equiv="refresh" content="1; urlн.re-news.php">';
}
//########remove mooore######
if(@$remove=cutty($_GET['remove'])){
//если кто то дрочил кнопку remove в форме вывода:
foreach ($_GET['box'] as $val) {
if($val==''){
echo 'Блять выбери что-нибудь,сука';
}else{
mysql_query("UPDATE mytable SET hide=1 WHERE id='$val'");
}
}
echo '<table><tr>';
echo '<td>Новость(и) успешно удалена(ы)</td>';
echo '</tr></table>';
echo '<meta http-equiv="refresh" content="1; urlн.re-news.php">';
}
Уфф,вот это было удаление,редактирование,листинг.Теперь осталось немного модуль
фильтрации и авторизации
<?
function cutty($string)
{
$string = str_replace ("<", "<", $string);
$string = str_replace (">", ">", $string);
$string = str_replace ('\\\"', "", $string);
$string = str_replace ("\\\'", "", $string);
$string = str_replace ("\r", "", $string);
$string = str_replace ("\n", "<br>", $string);
$string = str_replace ("%", "", $string);
$string = str_replace ("^", "", $string);
$string = str_replace ("*", "", $string);
$string = str_replace ("$", "", $string);
$string = str_replace ("@", "", $string);
$string = str_replace ("#", "", $string);
$string = str_replace ("|", "", $string);
$string = str_replace ("+'+", "", $string);
$string = str_replace ('+"+', '"', $string);
$string = str_replace ("--", " ", $string);
$string = str_replace (" \ ", "", $string);
$string = str_replace ("/*", "", $string);
$string = str_replace ("-", "", $string);
$string = str_replace ("'", "", $string);
$string = str_replace ('"', "", $string);
return ($string);
}
?>
Я его решил урезать,не надо же все таки раскрывать всех секретов ;)
Скрипт авторизации:
<?
chdir('vBulletin353/');
require_once('global.php');
chdir('../');
//Всю проверку авторизации я перекладываю на форум это кнешно плюс,но и все таки минус...
if($vbulletin->userinfo['userid']){ //проверка аторизации
$a=mysql_query("select usergroupid,username from user where
userid=".$vbulletin->userinfo['userid']." "); //таблица форума с одеражщая инфу о юзерах
while($arr=mysql_fetch_array($a)){
$admn="root";
if($arr['usergroupid']==6 && $arr['username']==$admn){ //если usergroupid юзера с
$vbulletin->userinfo['userid'] равен 6 и имя юзера равно root(сам ставь че там у тя) то гуд а если нет
то мы тут просто гости
$i=mysql_query("select username,posts from user where userid='$id' ");
while($inf=mysql_fetch_array($i)){
echo "<table><tr>";
echo "<td class=s10>Добро пожаловать, ".$inf['username']." | ";
echo "<a href=\"login.php?" . $GLOBALS['vbulletin']->session->vars['sessionurl'] .
"do=logout&logouthash=" . $GLOBALS['vbulletin']->userinfo['logouthash'] . "\"
>Выход</a></td></tr></table>";
//login.php файл форума,лежит в корне
}
}else{
echo "<table>";
echo "<tr><td >Доступ запрещен!</td></tr>";
echo "</table>";
echo '<meta http-equiv="refresh" content="1; url=index.php">';
exit();
} //close 'if'
} //close 'while'
}elseif($vbulletin->userinfo['userid']==""){
echo "<table>";
echo "<tr><td>Доступ запрещен!</td></tr>";
echo "</table>";
echo '<meta http-equiv="refresh" content="1; url=index.php">';
exit();
echo '<form action="login.php" method="post">';
echo '<table><tr>';
echo ' <td>Имя</td>';
echo ' <td><input type="text" name="vb_login_username" value="Имя" /></td>';
echo ' <td><input type="checkbox" name="cookieuser" value="1"
>Запомнить?</label></td>';
echo '</tr>';
echo '<tr>';
echo ' <td>Пароль</td>';
echo ' <td><input type="password" name="vb_login_password"/></td>';
echo ' <td><input type="submit" value="Вход" /></td>';
echo '</tr>';
echo '</table>';
echo '<input type="hidden" name="s" value="" />';
echo '<input type="hidden" name="do" value="login" />';
echo '<input type="hidden" name="vb_login_md5password" />';
echo '<input type="hidden" name="vb_login_md5password_utf" /></form>';
exit();
}?>
На деле все получается очень удобно и красиво=)