Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Редактирование/удаление отмеченных записей
 
 автор: Zew   (15.09.2005 в 11:10)   письмо автору
 
 

Добрый день. Вот, писала скрипт блока новостей, но в одном месте застопорилась - никак не соображу, как устроить редактирование и удаление.


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

   
 
 автор: Artemy   (15.09.2005 в 11:15)   письмо автору
 
   для: 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($query0strlen($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-форму генерировать в цикле.

   
 
 автор: Zew   (15.09.2005 в 13:32)   письмо автору
 
   для: Artemy   (15.09.2005 в 11:15)
 

Спасибо! =) Думаю, это подойдет. Во всяком случае, айди получается и переправляется в запрос к майсквел, но почему-то не выполняется. *_* Выдает следующую ошибку:

Access denied for user 'helsinru'@'localhost' (using password: NO)
DELETE FROM news WHERE id IN (48,47)


Кхем, как я поняла, он жалуется на коннект с базой... Но с коннектом вроде бы все ок, т.к. ведь сами новости выводятся на экран... *_* Ну ничего, думаю уж в этом-то как-нибудь разберусь. =)

   
 
 автор: Zew   (15.09.2005 в 14:34)   письмо автору
 
   для: 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_ed0strlen($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. Но результат тот же. =(

   
 
 автор: Artemy   (15.09.2005 в 20:49)   письмо автору
 
   для: 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_ed0strlen($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   (16.09.2005 в 01:00)   письмо автору
 
   для: 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($dataENT_QUOTES);
$ed_news $_POST[ed_news];
$ed_news htmlspecialchars($ed_newsENT_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

   
 
 автор: isset   (16.09.2005 в 01:05)   письмо автору
 
   для: 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 в 09:54)   письмо автору
 
   для: Zew   (16.09.2005 в 01:00)
 

Все-равно не редактируется... =(

   
 
 автор: Zew   (16.09.2005 в 10:14)   письмо автору
 
   для: Zew   (16.09.2005 в 09:54)
 

Тьфу, все, разобралась сама. =)

   
 
 автор: Zew   (17.09.2005 в 01:54)   письмо автору
 
   для: Zew   (16.09.2005 в 01:00)
 

Эм, у меня к вам последняя *надеюсь* небольшая просьба. Я этот скрипт вроде как дописала и довела до максимального лоска, но вот на счет безопастности не совсем уверена. Можете кто-нибудь его просмотреть на предмет каких-нибудь фатальных ошибок/упущений и т.п.? =) Я его файлом цепляю к посту... Я просто на основе этого скрипта собираюсь создать еще много чего для публикации всяческого материала на сайте, поэтому нужно чтобы он хотя-бы без серьезных ошибок был... *_*

   
 
 автор: Artemy   (17.09.2005 в 11:38)   письмо автору
 
   для: Zew   (17.09.2005 в 01:54)
 

Если это административная часть модуля новости, то в принцепе вопросы по защите не надо ставить! Этот файл следует поместить в отдельную папку и защитить средствами .htaccess!

   
 
 автор: Zew   (17.09.2005 в 12:07)   письмо автору
 
   для: Artemy   (17.09.2005 в 11:38)
 

Ну, вообще-то это не административная часть - это единственный файл всей системы новостей. =) Там и отображение новости, и администрирование(редактирование/удаление/добавление) и архив новостей, все в одном. =) *делить на несколько файлов мне конечно же было лень))*
А вот про отдельную папку и .htaccess хотелось бы узнать поподробнее - как можно защитить таким образом файл?

   
 
 автор: cheops   (17.09.2005 в 13:09)   письмо автору
 
   для: 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-запроса");

И лучше не непосредственно перед использованием, а в самом начале - чтобы не забыть какой-нибудь параметр и чтобы проверка не зависила от логики скрипта.

   
 
 автор: Zew   (17.09.2005 в 14:27)   письмо автору
 
   для: cheops   (17.09.2005 в 13:09)
 

Аааа... Т.е. так можно проверять любые полученные через ГЕТ данные? Или только айди?

   
 
 автор: cheops   (17.09.2005 в 18:06)   письмо автору
 
   для: Zew   (17.09.2005 в 14:27)
 

Нет - это только для чисел, но вообще если строковый параметр не должен содержать одинарных кавычек, пробелов, и других потенциально опасных элементов можно разработать регулярное выражение и для него.

PS Регулярные выражения, в том числе и для защиты скрипта обсуждаются в разделе "Регулярные выражения" нашего форума.

   
 
 автор: Loki   (17.09.2005 в 19:21)   письмо автору
 
   для: Zew   (17.09.2005 в 14:27)
 

Не только get, но и post и даже cookie...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования