За последние 24 часа нас посетили 18100 программистов и 1699 роботов. Сейчас ищут 1515 программистов ...

Редактирование. Не сохраняются картинки

Тема в разделе "PHP для новичков", создана пользователем viktor72, 27 авг 2016.

  1. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Добрый вечер!
    Такая проблема - на сайте есть не сложная админка, в неё выводятся в цикле статьи . Статью можно отредактировать. В статьях есть картинки , которые хранятся в папке.
    Проблема в следующем - если редактирую текст, то картинки не сохраняются, их надо загружать заново каждый раз когда редактирую текст.
    Можно ли сдлеать так, чтоб сохранялись старые картинки , если я не заменяю их новыми
    PHP:
    1. $id = $_GET['ID'];
    2.  
    3. $sql = mysql_query("SELECT * FROM `vakans` WHERE `id_vakans`='$id'");
    4.  
    5. $row = mysql_fetch_array($sql);
    HTML:
    1.  
    2. <form action="update2_vakans.php?ID=<?php echo $id; ?>"  method="post" enctype="multipart/form-data">
    3. .......
    4. <tr>
    5.                 <td>Картинка:</td>
    6.                 <td><img src="file/<?echo $row['foto']?>" width="100" height="150" id="foto"></td>
    7.             </tr>
    8.             <tr>  
    9.                 <td>
    10.                 <input type="file" name="foto" size="50" value="<?echo $row['foto']?>">
    11.                 </td>
    12.             </tr>
    13. ..........
    14. <input type="submit" name ="save" value="Отредактировать">
    15.  
    фаил редактирования

    PHP:
    1. $id = $_GET['ID'];
    2.  
    3. $sql = mysql_query("SELECT * FROM `vakans` WHERE `id_vakans`='$id'");
    4.  
    5.  
    6. $row = mysql_fetch_array($sql);
    7.  
    8. if(isset($_POST['save']))
    9.     {
    10. $foto = strip_tags(trim($_FILES['foto']['name']));
    11. mysql_query("UPDATE `vakans`SET
    12. foto='$foto',
    13. WHERE id_vakans = '$id' " );
    14.  
    15.  }
    16.  
    17.  if ($_FILES['foto']['error'] == 0) {
    18.  
    19.  $tempp = $_FILES['foto']['tmp_name'];
    20.  $name_files = iconv("UTF-8", "WINDOWS-1251", $_FILES['foto']['name']);
    21.  move_uploaded_file($tempp, "file/" . $name_files);
    22.  
    23.  }
     
  2. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    У тебя фото обновляется при каждом редактировании. Т.к. фото может не быть, то, возможно, в базу просто уйдёт NULL, перезаписав старую картинку.
    Выход - проверить, была ли загружена картинка
     
    viktor72 нравится это.
  3. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    как это сделать практически?
    if (!empty($row['foto'])){
    ??????
    }
    и не соображу, куда вписывать, в запрос?
    Ещё раз скажу: - если картинка есть в базе и я не меняю её во время редактирвоания, то она должна остаться после редактирования статьи.
    - так же должна быть возможность загрузить новую картинку вместо старой;
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Что касается твоего запроса, то проверяй на empty поступающие данные в массиве files.
    И далее если они пусты не обновляй их.
    PHP:
    1. if(!empty($_FILES['foto']['name'])) {
    2.        // обновляй базу
    3. }
    4. // двигай дальше код...
    Вот что это за кошмар. Иди перечитай https://php.ru/forum/threads/zaschita-avtorizacii.59752/#post-483035

    если в следующем твоём посте не изменишь mysql на mysqli или pdo, больше не буду помогать.
    --- Добавлено ---
    @viktor72 что не понятно спрашивай, пробуй и экспериментируй!
     
    viktor72 нравится это.
  5. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    .... весь код придётся переписывать под mysqli ....
     
    askanim нравится это.
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @viktor72 ну так вперёд бери и переписывай. У тебя поверь его пока ещё не так много!
     
  7. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6

    К сожалению не понимаю...куда вставлять..как делать...
    --- Добавлено ---
    Присягаю на верность Mysqli и клянусь отречься от mysql и предать его анафиме и забверию!
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Как так?
    Попробуй как видится тебе и покажи. А дальше будем понимать, что и зачем.
    Так, но перед этим дам тебе маленькое задание. Переделать данный текст/код с использованием mysqli, далее прокомментировать каждую строчку твоего кода, на твоё понимание, что ты там делаешь. И потом скинуть сюда.
     
    #8 askanim, 27 авг 2016
    Последнее редактирование: 27 авг 2016
  9. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Присягаю на верность Mysqli и клянусь отречься от mysql и предать его анафиме и



    HTML:
    1.  
    2. [LIST=1]
    3. <form action="update2_vakans.php?ID=<?php echo $id; ?>"  method="post" enctype="multipart/form-data">
    4. .......
    5. <tr>
    6.               <td>Картинка:</td>
    7.                <td><img src="file/<?echo $row['foto']?>" width="100" height="150" id="foto"></td>
    8.          </tr>
    9.            <tr>              <td>
    10.               <input type="file" name="foto" size="50" value="<?echo$row['foto']?>????
    11.          if(!empty($_FILES['foto']['name']))   {???? ???">
    12.                </td>
    13.            </tr>
    14. ..........
    15. <input type="submit" name ="save" value="Отредактировать">
    16. [/LIST]
    17.  
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Кстати один момент, комментирование собственного кода, это очень крутой плюс будет, если ты научишься всё грамотно комментировать.
    --- Добавлено ---
    @viktor72 это php код, по твоему ты мне скинул? Или это всё же html?
    Или ты на до мной прикалываешься?
    Во первых сейчас html в топку, не трогаем его, комментируй и выкладывай сюда php код.
     
  11. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    PHP:
    1. <form action="update2_vakans.php?ID=<?php echo $id; ?>"  method="post" enctype="multipart/form-data">
    2.  
    3. ........
    4.  
    5. <tr>
    6.  
    7.              <td>Картинка:</td>
    8.  
    9.               <td><img src="file/<?echo $row['foto']?>" width="100" height="150" id="foto"></td>
    10.  
    11.       </tr>
    12.  
    13.         <tr><td>
    14.  
    15.              <input type="file" name="foto" size="50" value="<?echo$row['foto']?>????
    16.  
    17.       if(!empty($_FILES['foto']['name']))   {???? ???">
    18.  
    19.                </td>
    20.          </tr>
    21. .........
    22. <input type="submit" name ="save" value="Отредактировать">
    --- Добавлено ---
    данные картинки не попадают в html форму для редактирования... и соответственно во время редактирования из формы в базу отправлятеся null
     
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @viktor72 где твой php код? обработчик который ! Меня интересует, твой обработчик где ты добавляешь в базу? Куда приходят у тебя данные с поста? Там и пиши условие. Ты же не отправляешь форму на html документ, ты её отправляешь на какой то обработчик соответственно там у тебя и буду приниматься пост запросы. Вот и пиши там! И вообще перед тем как что - то куда то добавлять, или записывать, или сохранять, привыкни делать проверки, на существование и наличие якобы сохраняемых или добавляемых данных, потому что если их нет или не существует, то зачем исполнять в пустую весь этот код?
     
    #12 askanim, 27 авг 2016
    Последнее редактирование: 27 авг 2016
  13. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    данные картинки не попадают в html форму для редактирования... и соответственно во время

    PHP:
    1. $id = $_GET['ID'];
    2.  
    3. $sql = mysql_query("SELECT * FROM `vakans` WHERE `id_vakans`='$id'");
    4.  
    5. $row = mysql_fetch_array($sql);
    6.  
    7. if(isset($_POST['save']))
    8.     {  
    9.     $foto = strip_tags(trim($_FILES['foto']['name']));
    10.  
    11.     mysql_query("UPDATE `vakans`SET
    12.                              
    13.                                foto='$foto',
    14.                                    
    15.                WHERE id_vakans = '$id' " );
    16.     if ($rezum) {
    17.         header('Refresh: 1; URL=http://localhost/dosvid/landing/vakans/del_vakans.php');
    18.          
    19.         echo "<p><h2>Запись отредактирована.</2></p>
    20.        <p><h3>Через 1 секунду страница перегрузится на список вакансий</3></p>";
    21.     }
    22.     mysql_close();
    23.     }
    24.     if ($_FILES['foto']['error'] == 0) {
    25.         $tempp = $_FILES['foto']['tmp_name'];
    26.         $name_files = iconv("UTF-8", "WINDOWS-1251", $_FILES['foto']['name']);
    27.         move_uploaded_file($tempp, "file/" . $name_files);
    28.  }
    29. ?>
     
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Нахрена ты везде налипил strip_tags ? Ты что думаешь что если у тебя там будет написано <?php echo 'АХАХАХАХ Я ЗЛОЙ ЧИТЕР И Я ТЕБЯ ПОЛОМАЛ'; > Или ладно хер с ним вставит кто нибудь видео с порнухой типа с ютуба откуда нибудь, и оно потом вылезет на сайте?
    Если ты специально не засунешь в функцию eval у тебя это в php как было строкой так и останется строкой! Убери нахрен. А от sql инъекций это не спасёт. Я уже писал пост ты вообще хоть, что нибудь от туда прочитал? Где mysqli :? Где защита от инъекций, которую я вчера объяснял ?

    Смотри на пальцах.
    Объясню на примере пдо, так как мой любимый стиль кодинга - это ООП.

    PHP:
    1. function db_config() {
    2.     return array(
    3.         'host' => '192.168.0.44',
    4.         'dbname' => 'DB_NAME',
    5.         'user' => 'USER',
    6.         'password' => 'PASSWORD',
    7.         'charset' => 'utf-8'
    8.     );
    9. }
    10. function db_connect () {
    11.     $params = db_config();
    12.     $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}";
    13.     $db = new \PDO($dsn, $params['user'], $params['password']);
    14.     return $db;
    15. }
    16. function db_prepare_query($array_prepare, $id) {
    17.     $db = db_connect();
    18.     $sqlUpdate = '';
    19.     $i = 0;
    20.  
    21.     foreach ($array_prepare As $key => $value) {
    22.         // Где $key - это наше поле в бд
    23.         // Где $value - это названия поля в посте(По другому пусть будет в твоём понимании это name из поля формы), того что вносим в бд
    24.         if($i == 0) {
    25.             $el = '';
    26.         }
    27.         else {
    28.             $el = ', ';
    29.         }
    30.         $sqlUpdate .= $el.$key.'=:'.$value;
    31.  
    32.         //$i - это переменная нужна для определения итерации,
    33.         // С помощью которой мы сможем проставить запятые в строке. $sqlUpdate
    34.         $i++;
    35.     }
    36.     $result = $db->prepare('"UPDATE vakans SET '.$sqlUpdate.'WHERE id_vakans =:id ');
    37.     $result->bindParam(':id', $id);
    38.     // И возвращаем наш результ, в котором находится подготовленный запрос, в том виде в котором нам нужен
    39.     return $result;
    40.  
    41. }
    42. // Теперь стряпаем нужный нам массив из наших пост данных.
    43. // Я там видел у тебя неймы и поля в бд одинаковые =)) А значит можно сделать так!
    44. $prepare_array = [];
    45. foreach ($_POST as $key => $value) {
    46.     if(!empty($_POST[$key])) {
    47.         $prepare_array[$key] = $key;
    48.     }
    49. }
    50. $query = db_prepare_query($prepare_array, $_GET['ID']);
    51.  
    52. // Теперь состряпаем массив для execute
    53. $execute_array = [];
    54. foreach($_POST As $key => $value) {
    55.     if(!empty($_POST[$key])) {
    56.         $execute_array[':'.$key] = $value;
    57.     }
    58. }
    59. // И отправляем запрос в бд. Вот так вот всё не хитро и не сложно разгребай!
    60. $query->execute($execute_array);
    --- Добавлено ---
    Разберай код и колупай его, так как он может тебе ещё пригодится не только в этом случае, но его слегка нужно доработать, и кое что изменить. Ты также можешь по типу как я сделал update сделать where! И предовать туда массив с where. В общем у тебя ноль понимания.. Читай статьи, что я дал вчера.
     
    viktor72 нравится это.
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @viktor72, Для input[type='file'] атрибут value не работает, не трудись его даже заполнять. Вообще не указывай. Проверяй на входе массив $_FILES. Если он пустой, то значит не надо менять картинку, если заполнен, то надо. Если надо дать возможность удалять картинку, для этого делают дополнительный чекбокс обычно

    @askanim, зачем ты человеку даёшь PDO, если он хочет на mysqli писать? Ну и твою функцию db_connect(), раз уж ты хочешь её использовать вместо глобальной переменной для соединения, стоит немного переписать:
    PHP:
    1. function db_connect () {
    2.     static $db = null;
    3.     if ($db === null) {
    4.           $params = db_config();
    5.           $dsn = "mysql:host={$params['host']};charset={$params['charset']};dbname={$params['dbname']}";
    6.           $db = new \PDO($dsn, $params['user'], $params['password']);
    7.     }
    8.     return $db;
    9. }
    Практически синглтон :) Суть - теперь, сколько раз не вызывай db_connect(), экземпляр PDO будет создан только один.
    --- Добавлено ---
    О, и кстати, @askanim, в апдейте надо экранировать все значения, а не только id
     
    viktor72 нравится это.
  16. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mkramer потому что я даю готовый пример. Но на том на чём мне нравится больше, если он хочет я кинул статьи, может почитать и сделать там всё понятно.
    --- Добавлено ---
    Ты весь мой пример прочитал?
    Ты внизу execute не видишь с подстановкой туда массива ?
    --- Добавлено ---
    @mkramer так порвало пукан, что даже не досмотрел? Я ему скинул конкретно под задачу работоспособную вещь. И прокомментил всё.
    То что ты изменил не для всего подойдёт.
     
  17. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Вот, теперь более понятно. Я тоже подозревал что с
    HTML:
    1. <input type="file">
    такие номера не проходят.
    Но как проверять на входе $_FILES и как использовать чекбокс для того чтоб поменять картинку не хватает знаний...
    Буду перечитывать всё что тут написали
     
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @viktor72 я тебе дал код он не подошёл?
     
  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @viktor72, совсем нету алгоритмического чутья. Вот комменты и псевдокод
    PHP:
    1. if ($_SERVER["REQEUST_METHOD"] === "POST") {
    2.     // Мы получили post-запрос
    3.     // Обновляем все поля, кроме картинки:
    4.    $mysqli->query("update set .... ");
    5.  
    6.    // Проверяем, пришёл ли к нам с запросом файл:
    7.    if($_FILES['foto']['error']==0) {
    8.         $tempp = $_FILES['foto']['tmp_name'];
    9.         $name_files = iconv("UTF-8", "WINDOWS-1251", $_FILES['foto']['name']); // Вот это зачем, я не въехал, но пусть будет
    10.         move_uploaded_file($tempp, "file/" . $name_files);
    11.         // Обновляем картинку
    12.         $mysqli->query("update set vakans set foto=.... ");
    13.    } elseif (!empty($_POST["delete_foto"])) {
    14.         $mysqli->query("update set vakans set foto='' ...");
    15.         // если надо, удаляем и сам файл
    16.      
    17.    }
    18. }
    Это псевдокод, до реального дополните сами
    --- Добавлено ---
    Да, если что, атрибут value не работает, но вот name необходимо указать для input[type='file']
     
    viktor72 нравится это.
  20. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Смотрю в него..пытаюсь понять... знаний пока не хватате....
    Сейчас у меня написано процедурно .. мне не понятно, как выводится в форму для редактирования... не понимая этого, мне вообще ничегоне понятно... сегодня ещё раз перечитаю всё что тут написано на этой странице...
    код буду разбирать с мануалом в руках.. в коде используется pdo ?
    какое зло несет strip_tags?
     
    askanim нравится это.
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @viktor72 да, у меня это процедурный подход, с использованием PDO
    --- Добавлено ---
    @viktor72 А нахрена он тебе на входящих данных ?
    просто нагромоздить не нужного кода?
    --- Добавлено ---
    @viktor72 только только это без сохранения картинки. По сути если ты сможешь разобрать мой код, я думаю ты дойдёшь до того чтобы его довести до ума, под свою задачу.

    @mkramer ты ему дал код, без защиты от sql инъекций....
     
  22. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6

    Хорошее понятие - "алгоритмическое чутьё", надо запомнить...
    Это код мне более понятен, ... то что в "инпут типе =филе " он не влазит это я уже понял...
    Я представляю так: -
    1. в файл -форму редактирования выводится картинка, что понять что она есть и посмотретьккакая она.
    2. Потом если она меня устравиает я ничего с ней не делаю, наживаю кнопку , всё редактируется а картинка остается не тронутой.
    3. если картинку хочу поменять , подгружаю через "инпут типе =филе " новую картинку и она отправляется на обработку в код кторый выше.

    Я так понял, что надо просто сделать, чтоб если картинку не меняю, нельзя чтоб в базу отправлялось null в ячейку фото...
     
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @viktor72 короче учись, почитай про алгоритмы. Пойми как строится код, вообще смысл того как работает сервер - клиент. Вообще почитай про веб, как он устроен, мне кажется ты не понимаешь как он вообще работает, нет смысла учить тебе ща синтаксис и ман. Не с того начал.
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Я не дал ему код, я дал псевдокод и предупредил об этом.
    --- Добавлено ---
    Если не надо менять картинку, не надо её указывать в команде update. Никак вот эта простая истина до вас не доходит
     
  25. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Что я понимаю:
    для меня не постижимо
    --- Добавлено ---
    да, но в той же форме выводится текст, который если я не меняю он сохраняется а не исчезает после апдейта.
    а мне нужено сделать чтоб был выбор оставлять как есть или поменять...
    приступаю к работе над вашим кодом
    Спасибо