|
|
|
| Добрый день. Вот, писала скрипт блока новостей, но в одном месте застопорилась - никак не соображу, как устроить редактирование и удаление.
<?
session_start();
if ($_GET[action_news] == "add"){
include('db_main.php');
if($_POST['news_text']!='')
{
$news_text=$_POST['news_text'];
$news_text=strip_tags($news_text, '<a><i><b><u><font><br><hr>');
$news_text = nl2br($news_text);
$query_ad = "INSERT INTO news('news_text', 'data') VALUES('$news_text', NOW());";
mysql_query($query_ad);
if(!$query_ad){echo "Ошибка запроса";}
else{header("Location: index.php");}
}
else{echo "Вы не ввели текст новости";}
}
/*
Вот здесь предполагалось получать айди из чекбокса рядом с каждой новостью, и по ним определять какие именно записи удалить. Но никак не пойму, как получить ВСе айди, если чекбоксами может быть помечено несколько новостей и айди заранее никак не прогадаешь. *_*
*/
elseif($_GET[action_news] == "ed_del"){
if($_POST[act] == "del"){ } //??
if($_POST[act] == "edit"){ } //??
}
else{
$query_shnews = mysql_query("select id, DATE_FORMAT(data,'%d.%m.%Y %k:%i') AS data, news_text from news order by id DESC limit 0,5;");
echo '<table width=100% border=0><form name="edit_del" method="post" action="news.php?action_news=ed_del">';
for($i = 0; $i < mysql_num_rows($query_shnews); $i++){
$show_news = mysql_fetch_array($query_shnews);
$news_text = $show_news[news_text];
$news_text=str_replace('[','<',$news_text);
$news_text=str_replace(']','>',$news_text);
$news_text=str_replace('~',' ',$news_text);
?>
<tr><td class="news_date"><? echo $show_news[data]; ?></td><? if($rez == "admin"){$id = $show_news[id]; ?><td><div algin="right"><input type="checkbox" name="<? echo $id ?>"> </div></td><? } ?></tr><tr><td colspan="2" class="news_text"><div align="justify"><? echo $news_text ?></div></td></tr>
<? }if($rez == "admin"){
echo '<tr><td><br><select name="act"><option value="edit">Изменить</option><option value="del">Удалить</option></select> <input type="submit" name="Submit2" value="ok"></form></td></tr></table>
<script language="JavaScript">
function tag1(text1, text2)
{if ((document.selection))
{document.addnews.news_text.focus();
document.addnews.document.selection.createRange().text = text1+document.addnews.document.selection.createRange().text+text2;}
else document.addnews.news_text.value += text1+text2;}
</script>
<form name="addnews" method="post" action="news.php?action_news=add"><hr color=#990000>
<center>
<a href="javascript:tag1(\'\', \'\')" class="bbcode"><span>b</span></a>
<a href="javascript:tag1(\'\', \'\')" class="bbcode"><span>i</span></a>
<a href="javascript:tag1(\'[u]\', \'[/u]\')" class="bbcode"><span>u</span></a>
<span style="cursor:pointer; FONT-WEIGHT: bold; font-family: Arial; font-style: italic;" onclick=javascript:document.all.news_text.value+="[hr]">hr</span>
<span style="cursor:pointer; FONT-WEIGHT: bold; font-family: Arial; font-style: italic;" onclick=javascript:document.all.news_text.value+="[a~href=][/a]">url</span>
<span style="cursor:pointer; FONT-WEIGHT: bold; font-family: Arial; font-style: italic;" onclick=javascript:document.all.news_text.value+="[font][/font]">font</span></center><hr color=#990000>
<textarea name="news_text" id=news_text cols="30" rows="3" wrap="VIRTUAL" onFocus="javascript: textFocus = true;" onBlur="javascript: textFocus = false;"></textarea><br>
<input type="submit" name="Submit" class="butt" value="Добавить">
</form>'
;}
}
?>
|
| |
|
|
|
|
|
|
|
для: Zew
(15.09.2005 в 11:10)
| | Cheops в свое время предложил такое решение!
Если я Вас правильно понел, возможно Вы именно об этом спрашивали!
<form action=handler.php method=post>
<input type='checkbox' name='type[]' value='1'>Первый флажок<br>
<input type='checkbox' name='type[]' value='2'>Второй флажок<br>
<input type='checkbox' name='type[]' value='3'>Третий флажок<br>
<input type='checkbox' name='type[]' value='4'>Четвёртый флажок<br>
<input type='checkbox' name='type[]' value='5'>Пятый флажок<br>
<input type='checkbox' name='type[]' value='6'>Шестой флажок<br>
<input type='checkbox' name='type[]' value='7'>Седьмой флажок<br>
<input type=submit>
</form>
|
имеет обработчик handler.php:
<?php
// Удалить сразу несколько записей можно при
// помощи запроса "DELETE FROM base WHERE id IN (1,3,5,7)"
// Получаем список отмеченных флажков
$type = $_POST['type'];
if(!empty($type))
{
// Начинаем формировать переменную, содержащую этот список
// в формате "(3,5,6,7)"
$query = "(";
foreach($type as $val) $query .= "$val,";
// Удаляем последнюю запятую, заменяя её закрывающей скобкой )
$query = substr($query, 0, strlen($query) - 1).")";
// Завершаем формирование SQL-запроса на удаление
$query = "DELETE FROM base WHERE id IN ".$query;
// Выполняем запрос
if(!mysql_query($query))
{
echo mysql_error()."<br>";
echo $query."<br>";
}
}
?>
|
PS Только вместо value-значений следует подставлять реальные значения первичного ключа и HTML-форму генерировать в цикле. | |
|
|
|
|
|
|
|
для: Artemy
(15.09.2005 в 11:15)
| | Спасибо! =) Думаю, это подойдет. Во всяком случае, айди получается и переправляется в запрос к майсквел, но почему-то не выполняется. *_* Выдает следующую ошибку:
Access denied for user 'helsinru'@'localhost' (using password: NO)
DELETE FROM news WHERE id IN (48,47)
Кхем, как я поняла, он жалуется на коннект с базой... Но с коннектом вроде бы все ок, т.к. ведь сами новости выводятся на экран... *_* Ну ничего, думаю уж в этом-то как-нибудь разберусь. =) | |
|
|
|
|
|
|
|
для: Artemy
(15.09.2005 в 11:15)
| | Так, с удалением разобралась - оказывается надо было еще раз подключить файл коннекта к ДБ. *хотя почему он не подключается сам, хотя наверху прописан, не совсем понятно.. Ну, это неважно*.
Теперь с редактированием торможу.
<?
if($_POST[act] == "edit"){
include('db_main.php');
$type = $_POST['type'];
if(!empty($type)){
$query_ed = "(";
foreach($type as $val) $query_ed .= "$val,";
$query_ed = substr($query_ed, 0, strlen($query_ed) - 1).")";
$query_ed = "SELECT * FROM news WHERE id IN " . $query_ed . "ORDER BY id DESC";
if(!mysql_query($query_ed))
{echo mysql_error()."<br>";
echo $query_ed."<br>";}
else{
echo '<table width=300 border=0><form name="edit" method="post" action="news.php?action_news=ed">';
for($y = 0; $y < mysql_num_rows($query_ed); $y++){
$ed_news = mysql_fetch_array($query_ed);
?>
<tr><td><textarea name="ed_news_<? echo $ed_news[id]; ?>" cols="50" rows="6" wrap="VIRTUAL"><? echo $ed_news[news_text]; ?></textarea></td></tr><tr><td><input type="text" name="data" value="<? echo $ed_news[data]; ?></td></tr>">
<?}
echo '<input type="submit" name="Submit3" class="butt" value="Редактировать"></form></table>';}
}
} ?>
|
Причем, запрос получается верный, но содержимое цикла не отображается. *_* Т.е. на экран выводится следующее:
<table width=300 border=0><form name="edit" method="post" action="news.php?action_news=ed"><input type="submit" name="Submit3" class="butt" value="Редактировать"></form></table>
|
я уж думала потому, что переменые в цикле уже встечались под этими именами на странице, поменяла i на y. Но результат тот же. =( | |
|
|
|
|
|
|
|
для: Zew
(15.09.2005 в 14:34)
| | Во-первых файл подключения к БД лучше подключать в самом начале кода, если коду из вне, особенно если от посетителей, передаются какие-либо данные, то подключать его рекомендуется после проверки переданных данных, из соображений безопастности!
Во-вторых данный код лучше сделать таким:
<?
if($_POST[act] == "edit")
{
include('db_main.php');
$type = $_POST['type'];
if(!empty($type))
{
$query_ed = "(";
foreach($type as $val) $query_ed .= "$val,";
$query_ed = substr($query_ed, 0, strlen($query_ed) - 1).")";
$query = mysql_query("SELECT * FROM news WHERE id IN " . $query_ed . "ORDER BY id DESC");
if(!$query)
{
exit("Ошибка");
}
else
{
echo '<table width=300 border=0><form name="edit" method="post" action="news.php?action_news=ed">';
while($ed_news = mysql_fetch_array($query))
{
?>
<tr><td><textarea name="ed_news_<? echo $ed_news[id]; ?>" cols="50" rows="6" wrap="VIRTUAL"><? echo $ed_news[news_text]; ?></textarea></td></tr><tr><td><input type="text" name="data" value="<? echo $ed_news[data]; ?></td></tr>">
<?
}
echo '<input type="submit" name="Submit3" class="butt" value="Редактировать"></form></table>';
}
}
}
?>
В-третьих функцию mysql_error(); следует использовать только в той части приложения которая доступна только администратору или разработчику!
|
Теперь должно работать! | |
|
|
|
|
|
|
|
для: Zew
(15.09.2005 в 14:34)
| | Пасиб! =) Действительно, так лучше работает. =) Хм... Вот только с редактированием у меня что-то не получается. Точнее, с его выполнением.
<?
//Страница редакции новости
elseif($_GET[action] == "ed"){
//Если вы админ
if ($rez !== "admin"){echo "Вы не имеете доступа.";}else{
$id = $_GET['id'];
//Выборка из базы отмеченных пунктов
if(!empty($id)){
$query_ed = "SELECT * FROM news WHERE id = " . $id . " ORDER BY id DESC";
$zapros_ed = mysql_query($query_ed);
if(!$zapros_ed){echo "Не верный запрос редактирования новости в БД."; echo mysql_error()."<br>";echo $zapros_ed."<br>";}
//Выведение на экран полученных значений
else{ ?>
<html><head>
<title>Редактирование новостей</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<LINK href="style_main.css" type=text/css rel=STYLESHEET>
</head><body>
<p align="center" class="h1">Редактировать</p>
<form name="edit" method="post" action="news.php?action=update&&id=<? echo $id; ?>">
<table width="200" border="0" align="center" cellpadding="0" cellspacing="0">
<?
$ed_news = mysql_fetch_array($zapros_ed);
?>
<tr><td>Дата: <input type="text" name="data" value="<? echo $ed_news[data]; ?>" size="25" size="25"></td></tr>
<tr><td><? /* Скрипт вставки ббкодов вокруг выделенного текста*/ ?>
<script language="JavaScript">
function tag1(text1, text2)
{if ((document.selection))
{document.edit.ed_news.focus();
document.edit.document.selection.createRange().text = text1+document.edit.document.selection.createRange().text+text2;}
else document.edit.ed_news.value += text1+text2;}
</script>
<? /* Начало формы редакции новости */ ?>
<hr color=#990000>
<center>
<? /* Вставка ббкодов */ ?>
<a href="javascript:tag1('', '')" class="bbcode"><span>b</span></a>
<a href="javascript:tag1('', '')" class="bbcode"><span>i</span></a>
<a href="javascript:tag1('[u]', '[/u]')" class="bbcode"><span>u</span></a>
<span style="cursor:pointer; FONT-WEIGHT: bold; font-family: Arial; font-style: italic;" onclick=javascript:document.all.news_text.value+="[hr]">hr</span>
<span style="cursor:pointer; FONT-WEIGHT: bold; font-family: Arial; font-style: italic;" onclick=javascript:document.all.news_text.value+="[a~href=][/a]">url</span>
<span style="cursor:pointer; FONT-WEIGHT: bold; font-family: Arial; font-style: italic;" onclick=javascript:document.all.news_text.value+="[font][/font]">font</span></center><hr color=#990000>
<textarea name="ed_news" cols="50" rows="6" wrap="VIRTUAL" onFocus="javascript: textFocus = true;" onBlur="javascript: textFocus = false;"><? echo $ed_news[news_text]; ?></textarea></td></tr>
<tr><td align="right"><br><input type="submit" name="Submit3" class="butt" value="Редактировать"></td></tr>
</table></form><br></body></html><?
}//Выведение на экран полученных значений(конец)
}//Выборка из базы отмеченных пунктов(конец)
else{header("Location: index.php");}
}//Если вы админ (конец)
}//Страница редакции новости (конец)
//Страница отправки отредактированной новости
elseif($_GET[action] == "update"){
//Если вы не админ...
if ($rez !== "admin"){echo "Вы не админ.";}else{
//Если есть что редактировать - выполняем
if(($_POST['ed_news']!='') && ($_POST['data']!='')){
$id = $_GET[id];
$data = $_POST[data];
$data = htmlspecialchars($data, ENT_QUOTES);
$ed_news = $_POST[ed_news];
$ed_news = htmlspecialchars($ed_news, ENT_QUOTES);
$ed_news = nl2br($ed_news);
$query_edit = "UPDATE news SET data=".$data.", news_text=".$ed_news." WHERE id=".$id;
mysql_query($query_edit);
if(!$query_edit){echo "Не верный запрос редактирования новости в БД.";}
else{header("Location: index.php");}
}//Выполняем (конец)
else{echo "Вы не ввели текст новости.";}
}//Если вы не админ (конец)
}//Страница отправки отредактированной новости (конец)
?>
|
*звиняюсь за обилие комментов - просто я уже путаться стала в собственном коде... ^_^*
Вобщем, все как планировалось - нужный пост открывается, попадает в форму редактирования, отправляется, никаких ошибок при отправке не выдается, но почему-то сам результат правки я не вижу... То есть пост какой был, такой и остается. Я бы предположила, что ошибка в запросе, но вроде как ошибки не выводится...
Если нужно, можете видеть этот код в работе тут: http://ect.hellsinguniverse.ru/index.php *на кривой дизайн не обращаем внимания - он еще в разработке))*
тестовый пасс и лог с правами админа - test | |
|
|
|
|
|
|
|
для: Zew
(16.09.2005 в 01:00)
| |
$query_edit = "UPDATE news SET data=".$data.", news_text=".$ed_news." WHERE id=".$id;
|
на:
$query_edit = "UPDATE news SET data='".addslashes($data)."', news_text='".addslashes($ed_news)."' WHERE id=".$id;
|
| |
|
|
|
|
|
|
|
для: Zew
(16.09.2005 в 01:00)
| | Все-равно не редактируется... =( | |
|
|
|
|
|
|
|
для: Zew
(16.09.2005 в 09:54)
| | Тьфу, все, разобралась сама. =) | |
|
|
|
|
|
|
|
для: Zew
(16.09.2005 в 01:00)
| | Эм, у меня к вам последняя *надеюсь* небольшая просьба. Я этот скрипт вроде как дописала и довела до максимального лоска, но вот на счет безопастности не совсем уверена. Можете кто-нибудь его просмотреть на предмет каких-нибудь фатальных ошибок/упущений и т.п.? =) Я его файлом цепляю к посту... Я просто на основе этого скрипта собираюсь создать еще много чего для публикации всяческого материала на сайте, поэтому нужно чтобы он хотя-бы без серьезных ошибок был... *_* | |
|
|
|
|
|
|
|
для: Zew
(17.09.2005 в 01:54)
| | Если это административная часть модуля новости, то в принцепе вопросы по защите не надо ставить! Этот файл следует поместить в отдельную папку и защитить средствами .htaccess! | |
|
|
|
|
|
|
|
для: Artemy
(17.09.2005 в 11:38)
| | Ну, вообще-то это не административная часть - это единственный файл всей системы новостей. =) Там и отображение новости, и администрирование(редактирование/удаление/добавление) и архив новостей, все в одном. =) *делить на несколько файлов мне конечно же было лень))*
А вот про отдельную папку и .htaccess хотелось бы узнать поподробнее - как можно защитить таким образом файл? | |
|
|
|
|
|
|
|
для: Zew
(17.09.2005 в 01:54)
| | Вот так вот лучше не делать
<?php
$id = $_GET['id'];
//Выборка из базы отмеченных пунктов
if(!empty($id)){
$query_ed = "SELECT * FROM news WHERE id = " . $id . " ORDER BY id DESC";
?>
|
иначе сломают, если вы всё пропускате через addslashes пропускайте не только текст, но и числа - когда будут ломать в числа такого понапихают. А лучше вообще числовые параметры проверяйте при помощи регулряного выражения
if(!preg_match("|^[\d]+$|",$id) && !empty($id)) exit("Недопустимый формат URL-запроса");
|
И лучше не непосредственно перед использованием, а в самом начале - чтобы не забыть какой-нибудь параметр и чтобы проверка не зависила от логики скрипта. | |
|
|
|
|
|
|
|
для: cheops
(17.09.2005 в 13:09)
| | Аааа... Т.е. так можно проверять любые полученные через ГЕТ данные? Или только айди? | |
|
|
|
|
|
|
|
для: Zew
(17.09.2005 в 14:27)
| | Нет - это только для чисел, но вообще если строковый параметр не должен содержать одинарных кавычек, пробелов, и других потенциально опасных элементов можно разработать регулярное выражение и для него.
PS Регулярные выражения, в том числе и для защиты скрипта обсуждаются в разделе "Регулярные выражения" нашего форума. | |
|
|
|
|
|
|
|
для: Zew
(17.09.2005 в 14:27)
| | Не только get, но и post и даже cookie... | |
|
|
|