Изтриване на файл с php

mnis

Registered
Здравейте, имам следният проблем.
Да приемем, че имам страничка за новини със снимка към тях.
Направил съм така, че при изтриване на новината да се изтрива само съдържанието, не мога да направя така, че да се изтрива и снимката към съответната новина. Не мога да разбера къде бъркам, пробвах как ли не, но не става. Ще се надявам някой от вас да ми помогне.
Така....
Със следният код изтривам съдържанието на новините, но не мога да изтрия снимката от папката!!!


if(isset($_GET['del']))
{
$query = "DELETE FROM news WHERE id = '{$_GET['del']}'";
mysql_query($query) or die('Error : ' . mysql_error());

--- добавих това за изтриване на снимката но не работи
$myPic='img/'.$pic;
unlink($myPic);

}
........... код

<script language="JavaScript">
function delArticle(id)
{
if (confirm("Сигурен ли сте че искате да изтриете новината с номер '" + id + "'"))
{
window.location.href = 'news-delete.php?del=' + id;
}
}
</script>
.......... код
<?php
$query = "SELECT id, title, pic";
$result = mysql_query($query) or die('Error : ' . mysql_error());

while(list($id, $title, $pic) = mysql_fetch_array($result, MYSQL_NUM))
{

?>
<a href="javascript:delArticle('<?php echo $id;?>');">изтрий</a>
<? php
}
?>
 
ами май ще се наложи да пратиш и името на картинката с гет освен и ид-то.
Код:
if(isset($_GET['del']) && isset($_GET['pic']))
{
$query = "DELETE FROM news WHERE id = '{$_GET['del']}'";
mysql_query($query) or die('Error : ' . mysql_error());

$myPic='img/'.$_GET['pic'];
unlink($myPic);

}
........... код

<script language="JavaScript">
function delArticle(id,pic)
{
if (confirm("Сигурен ли сте че искате да изтриете новината с номер '" + id + "'"))
{
window.location.href = 'news-delete.php?del=' + id + '&pic=' + pic;
}
}
</script>
.......... код
<?php
$query = "SELECT id, title, pic";
$result = mysql_query($query) or die('Error : ' . mysql_error());

while(list($id, $title, $pic) = mysql_fetch_array($result, MYSQL_NUM))
{

?>
<a href="javascript:delArticle('<?php echo $id;?>','<? echo $pic;?>');">изтрий</a>
<? php
}
?>

Нещо от тоя род.Би трябвало така да работи. :?:
 
Тъкмо бях написал пост, че категорично съм се отказал от javascript-a и успях да реша проблема (само чрез php), като направих отделна del страничка, към която пращам името на картинката и изтривам както нея, така и съдържанието......
но твоето решение на проблема се оказа по-ефикасно. От една страна, че така откривам грешката си, и от друга, че ми спестява създаване на около дозина нови del файлове.....
Благодаря ти - заслужаваш си точката!!!
 
както казах имам таблица с новини (съдържание + снимка)
- направил съм да могат да се прикачат допълнителни снимки към новината.
- съдържанието и основната снимка на новината са в таблица news (id, title, content, pic)
- допълнителните снимки са в друга таблица pictures, (pid, news_id, p_pic) където няколко допълнителни снимки принадлежат на съответна новина при която news_id на pictures е равно на id-то на новината. Връзката м/у тях е на принципа:
$query = "SELECT * FROM pictures WHERE news_id = '$id'";

Добавянето, редактирането, изтриването на съдържанието и снимка към дадена новина не е проблем, но не е проблем, когато имам по една основна, и една допълнителна снимка (за изтриването на които ми помогна bafitu). Но аз имам по няколко допълнителни снимки на новина...... ей това вече ми е проблем....
Изтриването на повече от една допълнителна снимка за момента става като изтривам индивидуално всяка от допълнителните снимки, а това е доста глупаво....
Искам с изтриването на самата новина да се изтриват както съдържанието, основната снимка (от таблица news), така и допълнителните снимки (от таблица pictures) принадлежащи към съответната новина - но не мога да го направя!

Няма да поствам кода отново, защото е идентичен с отговорът на bafitu във поста по-горе ..... просто не знам как да свържа допълнителните снимки към новината и освен това как да изтрия няколко снимки (наведнъж) чрез unlink($myPic); (като така изтрива само един файл....)
Благодаря ви предварително!!!
 
mnis каза:
както казах имам таблица с новини (съдържание + снимка)
- направил съм да могат да се прикачат допълнителни снимки към новината.
- съдържанието и основната снимка на новината са в таблица news (id, title, content, pic)
- допълнителните снимки са в друга таблица pictures, (pid, news_id, p_pic) където няколко допълнителни снимки принадлежат на съответна новина при която news_id на pictures е равно на id-то на новината. Връзката м/у тях е на принципа:
$query = "SELECT * FROM pictures WHERE news_id = '$id'";

Добавянето, редактирането, изтриването на съдържанието и снимка към дадена новина не е проблем, но не е проблем, когато имам по една основна, и една допълнителна снимка (за изтриването на които ми помогна bafitu). Но аз имам по няколко допълнителни снимки на новина...... ей това вече ми е проблем....
Изтриването на повече от една допълнителна снимка за момента става като изтривам индивидуално всяка от допълнителните снимки, а това е доста глупаво....
Искам с изтриването на самата новина да се изтриват както съдържанието, основната снимка (от таблица news), така и допълнителните снимки (от таблица pictures) принадлежащи към съответната новина - но не мога да го направя!

Няма да поствам кода отново, защото е идентичен с отговорът на bafitu във поста по-горе ..... просто не знам как да свържа допълнителните снимки към новината и освен това как да изтрия няколко снимки (наведнъж) чрез unlink($myPic); (като така изтрива само един файл....)
Благодаря ви предварително!!!

Код:
if(isset($_GET['del']) && isset($_GET['pic'])) 
{ 
$query = "DELETE FROM news WHERE id = '{$_GET['del']}'"; 
mysql_query($query) or die('Error : ' . mysql_error()); 

$myPic='img/'.$_GET['pic']; 
unlink($myPic); 
	
	$news_id = $_GET['del'];
	$query = "select p_pic from pictures where news_id = $news_id"; 
	$result = mysql_query($query) or die('Error 2: ' . mysql_error()); 
	while ($row = mysql_fetch_array($result)) {
		$p_pic = $row['p_pic'];
		unlink($p_pic); 
	}
	$query = "DELETE FROM pictures WHERE news_id = $news_id"; 
	$result = mysql_query($query) or die('Error 3: ' . mysql_error()); 

}

едит:
1. едитнах малко кода, който съм дал

идеи и размисли:
1. Не е лошо да се сложи проверка за успешно изпълнена заяка за делете и чак след това да се трие файла ;)
2. преди да напиша кода по горе се опитах да го взема наготово от един сайт за обяви, който правих... но се оказа, че там съм изхитрял, като създавам папка за всяка обява и в тази папка качвам снимките. Когато се налага да трия обява пускам само две заявки към базата - трия обявата в таблицата с обявите и трия снимките към обявата в таблицата със снимките. Самите снимки трия като трия цялата папка с име: ИД-то на обявата. (Ползвам една функция, която трие всичко в папкта + самата папка)
 
Ок, това което си постнал ми върши идеална работа......
относно допълненията ти (за всяка обява отделна папка) - аз не проектирах така нещата, при мен е следното:
Тъй като при качане на снимките се рисайзват до определени от мен размери ги качам в различни папки (не споря, че е логично, просто така се случи най -практично)
Имам следното - една основна снимка с резмер №1, и допълнителни снимки с размер №2 и размер №3 всяка. идеята е че основната снимка не се отваря в голям размер, докато допълнителните - да (именно за това имам два размера за тях). Когато ъплоудна нова новина, основната снимка се рисайзва и кача в папка 1 (името й в таблицата със съдържанието на новината), всяка допълнителна снимка се рисайзва и кача съответно рисайз №2 в папка 2 и рисайз №3 в папка 3 (в отделна таблица). Всички снимки са с различни (рендъм) имена, като на допълнителните имената съвпадат (за конкретната новина)..... абе много не ме бива в обясняването....

Така, че за ради това, че имам три различни по големина снимки (както и по имена ((основна-допълнителна)) , заради това, че се вкарват в различни папки, и различни таблици изпитах трудност при изтриването на конкретна новина.
Следващият път ще знам..... както каза ти "нова новина - нова папка със снимки и съдържание) - признавам, че е доста по удачно и лесно!
Мерси за помощта!!!
 
mnis каза:
Ок, това което си постнал ми върши идеална работа......
относно допълненията ти (за всяка обява отделна папка) - аз не проектирах така нещата, при мен е следното:
Тъй като при качане на снимките се рисайзват до определени от мен размери ги качам в различни папки (не споря, че е логично, просто така се случи най -практично)
Имам следното - една основна снимка с резмер №1, и допълнителни снимки с размер №2 и размер №3 всяка. идеята е че основната снимка не се отваря в голям размер, докато допълнителните - да (именно за това имам два размера за тях). Когато ъплоудна нова новина, основната снимка се рисайзва и кача в папка 1 (името й в таблицата със съдържанието на новината), всяка допълнителна снимка се рисайзва и кача съответно рисайз №2 в папка 2 и рисайз №3 в папка 3 (в отделна таблица). Всички снимки са с различни (рендъм) имена, като на допълнителните имената съвпадат (за конкретната новина)..... абе много не ме бива в обясняването....

Така, че за ради това, че имам три различни по големина снимки (както и по имена ((основна-допълнителна)) , заради това, че се вкарват в различни папки, и различни таблици изпитах трудност при изтриването на конкретна новина.
Следващият път ще знам..... както каза ти "нова новина - нова папка със снимки и съдържание) - признавам, че е доста по удачно и лесно!
Мерси за помощта!!!

:)
Честно казано, не знам до колко е удачно за всяка новина нова папка :) Аз съм го направил така, понеже ползвах наготово код, от една галерия, която правих и където трябваше да са в различни папки.
По-скоро е по-удобно при "ръчни" манипулации. И евентуално при много файлове (CuteFTP, което ползвам за фтп клиент не листва повече от около 20 000 файла :( , което понякога се оказва голям проблем :( )

за името на снимките има разни хватки...
аз лично записвам с някаква представка файловете след преоразмеряване. Примерно thumb_именафайла, large_именафайла и тн... А в базата записвам само "именафайла". Когато искам да покажа снимката, правя следното
<a href="/gallery/thumb_<?=$pic;?>" />
$pic - Променливата съдържаща името на файла прочетано от базата...


Аз не обичам да разчитам на случайности, и за това не ползвам rand() за генериране на имената. Погледни uniqid(), мисля, че ще ти свърши работа (http://lt.php.net/manual/en/function.uniqid.php)

А за главната снимка - може да дадеш възможност на потребителите да разместват реда на показване на снимките към една обява, като първата снимка е главна ;)
 
Много е лесно да се намират забележки при вече свършена работа. :)) Поне при мен е така. Когато завърша нещо, винаги се сещам как би могло да стане по-функционално, с по-малко код, по-юзър френдли, по-незнам си кво и незнам си кво. Но ако се подчинявах постоянно на тези мои размисли, нямаше да ми остава никакво време за нови проекти...... Предполагам и при теб е така.
Така, че когато целият сайт е направен по определен начин, това налага и контролният панел да е по същият начин. Предпочитам новите неща да ги вкарам в следващият проект, отколкото да преработвам вече направеният.
Така е поне при мен!
Относно рендъм-а за имената на снимките - не използвам точно случайни имена, а задавам времето в което е качен файла в UNIX времеви формат. Така няма как да стане съвпадение на имената.....
Относно представките за имената на снимките - и аз го направих по същият начин, но когато "разбих" снимките в отделни папки.... тези прставки станаха излишни... (а не би трябвало)
Това за промяна на последователността на снимките към всяка обява - доста ми хареса идеята, признавам, че не бях се сещал за това. Наистина е хитро, като се замисля няма да е доста сложно....
айде стига съм се замислял, че колко още забележки си откривам..... (добре, че поне визуално не си личи :lol: )

Едит:
тази промяна на снимките (коя да е първа) в този случай няма да стане, защото основната снимка е един размер, първият размер на допълнителните е друг, а вторият е още по друг :)
В смисъл, че примерно:
Основна снимка - 120x90px
Допълнителна снимка (размер "малък") - 76x57px
Допълнителна снимка (голям размер, след отваряне в нов прозорец) - 400x300px
Така, че поне в този случай, не може основната снимка да бъде първата от допълнителните (понеже разликата в ъплоуднатите размери ще повреди качеството)......
офффф поне за това си намерих оправдание :lol:
но както казах по-горе, винаги може но.... дали си струва времето....
 

Back
Горе