За последние 24 часа нас посетили 25360 программистов и 1739 роботов. Сейчас ищут 874 программиста ...

Удаление фото из папки

Тема в разделе "PHP и базы данных", создана пользователем nixx, 12 апр 2013.

  1. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Код (Text):
    1. if(isset($_GET['delfoto']))
    2. {$result = mysql_query ("DELETE FROM upload_file WHERE id_file_name='$_GET[delfoto]'");
    3. header("location: test.php?foto=view");
    4. exit;}
    Этот запрос удаляет строчку с именем фото из бд.Подскажите как прикрутить сюда удаление файла с таким же именем из папки.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Что-то такое состряпал,но думаю,что это х...ня .... не пашет ((
    Код (Text):
    1. $result= mysql_query("SELECT file_name FROM  upload_file ");while($file_db = mysql_fetch_array($result))
    2.  $file=scandir($fotodir);
    3. if ($file!=$file_db) unlink("$fotodir/$file");
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну как бэ это приведет к тому что вся база будет сравниваться со всей ФС после каждого удаления. накладно.
    плюс вы получаете что есть в базе и смотрите чего нет в ФС. вы так никогда ничего не удалите потому что у вас файл есть а записи для него нет.

    кто виноват и что делать? сначала получаете имя файла, если оно хранится в бд, потом удаляете его физически и в случае удачи - удаляете из бд.
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    А зачем тут scandir? Она возвращает список имен файлов. Вызывать её в цикле вообще нет смысла.
    Раз есть известное имя файла, то можно просто вызывать unlink.
     
  6. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    Спасибо за подсказку igordata,Ganzal,YSandro.Нашел решение.
    Код (Text):
    1. if(isset($_GET['delfoto']))
    2. {$del= mysql_query("SELECT file_name FROM  upload_file  WHERE id_file_name='$_GET[delfoto]'");
    3.  
    4. $myrow = mysql_fetch_array ($del);unlink("$fotodir/$myrow[file_name]");
    5.    
    6. $result = mysql_query ("DELETE FROM upload_file WHERE id_file_name='$_GET[delfoto]'");
    7.    
    8. header("location: test.php?foto=view");
    9. exit;}
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    забыли про экранирование входящих данных как минимум
     
  8. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    В скрипте стоит
    Код (Text):
    1. foreach ($_POST as $key => $value) { $_POST[$key] = mysql_real_escape_string($value);} //This stops SQL Injection in POST vars
    2. foreach ($_GET as $key => $value) { $_GET[$key] = mysql_real_escape_string($value); }  //This stops SQL Injection in GET vars
    и плюс файлы переименовываются.
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    nixx, скажи, пожалуйста, с чего это ты вдруг в цикле все пост и гет запросы очищаешь?

    Добавлено спустя 26 секунд:
    Просто я уже в 5 раз такое встречаю, не понимаю зачем все данные эскейпить, половина из них же могут даже не участвовать в общении с базой...
     
  10. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    В мануале php
    Я как новичек ,не имея опыта ,следую пока сему.
     
  11. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Я не о том спрашиваю...
    Но раз речь зашла о мануале, то там указано что данное расширение устарело.

    Добавлено спустя 19 секунд:
    Я спрашиваю зачем цикл? Фильтруй то что будет использоваться базой... Такой цикл я встречал неоднократно, вот и возникло ощущение что все вы читали один и тот же мануал, но какой вот что интересно...
     
  12. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    В мануале на php.net про mysql_real_escape_string не нашел [deprecated] ???
    С другой стороны воткнул цикл и спи спокойно ))
    Если не нравится цикл ,вот есть нейтральный вариант
    Код (Text):
    1. function safe($value){
    2.    return mysql_real_escape_string($value);
    3. }
    4. $name = safe($_POST["name"]);
    Для id например достаточно
    Код (Text):
    1. $id=isset($_GET($id)) ? intval(Sid) : ;
     
  13. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Не нашел слово deprecated???

    Добавлено спустя 4 минуты 31 секунду:
    Для этого надо читать мануал на английском языке :)
    http://php[dot]net/manual/en/function.mysql-real-escape-string.php

    Добавлено спустя 17 секунд:
    Лишние итерации, не хороший стиль, не люблю такой код.