За последние 24 часа нас посетили 31979 программистов и 1363 робота. Сейчас ищут 857 программистов ...

Изменение картинки в img

Тема в разделе "PHP для новичков", создана пользователем Alex870, 8 дек 2013.

  1. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Доброго времени суток.
    Недавно начал писать на PHP, поэтому прошу помидорами не закидывать.
    Проблема такая: на странице есть картинка (тэг <img src =...>) В ней хранится аватар пользователя. Предусмотрена кнопка загрузки на сайт нового аватара. При нажатии её новая картинка загружается на сайт, путь к ней сохраняется в БД MySQL. Это всё написано на PHP, всё работает, но вот как поменять картинку в уже отображенном на странице теге <img> я не знаю, хотелось бы это сделать без перезагрузки страницы. Ну и по возможности без использования JS и JQuery. Спасибо.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это к Гарри Поттеру. Просто подмени через js адрес картинки и тогда картинка обновится.
     
  3. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Хорошо, js так js. Мне нужно это сделать в блоке <?php>
    Код (Text):
    1.  <?php
    2.     if($_SESSION['id'])
    3.     {
    4.      $image ='';
    5.       $id = $_SESSION['id'];
    6.       $result = mysql_fetch_assoc(mysql_query("SELECT Photo FROM mb_details WHERE id = $id"));
    7.       if($result['Photo']){
    8.         echo '<img id="avatar" src="'.$result['Photo'].'" class="UserPhoto" alt="Photo">';
    9.       } else{
    10.          echo '<img id="avatar" src="images/NoPhoto.png" class="UserPhoto" alt="Photo">';
    11.          }
    12.      
    13.       echo '<FORM ENCTYPE="multipart/form-data" ACTION="cabinet.php" METHOD=POST>
    14.             <INPUT TYPE="file" STYLE="DISPLAY:none" NAME="userfile" >
    15.             <input type=submit class="send" NAME="open" VALUE="Обзор..." onclick="userfile.click()">
    16.             <INPUT TYPE="submit" class="send" NAME="submit" VALUE="Загрузить">
    17.             </FORM>';
    18.         if(!empty($_FILES)){
    19.           $image_size=$_FILES['userfile']['size'];
    20.          // Ограничение на размер файла, в моём случае 1Мб
    21.           if($image_size>1024*1024||$image_size==0)
    22.           {
    23.               $ErrorDescription="Каждое изображение не должно привышать 1Мб!";
    24.            } else
    25.             if(substr($_FILES['userfile']['type'], 0, 5)=='image')
    26.             {
    27.              $uploaddir = './avatars/';
    28.              $uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
    29.                 // Копируем файл из каталога для временного хранения файлов:
    30.              move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
    31.              $id = $_SESSION['id'];
    32.              mysql_query("UPDATE mb_details SET Photo = '$uploadfile' WHERE id = $id");
    33.  
    34.             //Вот тут надо обновить картинку в тэге img
    35.             }
    36.           }            
    37.           }
    38.           ?>
    Как в указанное место вставить код Js? Путь к файлу изображения находится в $uploadfile
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пхп не связан с js
    где-то после загрузки картинки сделай подмену пути в src
    Код (Text):
    1.  
    2. $('#avatar').attr('src', 'новый путь');
    только это с подключением jQuery.
     
  5. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Спасибо, подключил JQuery, но так и не понял, как в указанное место (я там в коде написал "//Вот тут надо обновить картинку в тэге img") вставить этот (приведенный Вами код). Браузеру же надо дать понять, что это код Js, или я не прав?
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    надо.
    можно вставить js код КУДА УГОДНО. он не связан ни с чем. вставляется от в тегах <script> или в подключаемых js файлах.
     
  7. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Вот, как я вставил, но это не верно. Как я понял скрипт можно вставлять в html, а не в php.
    Моя задача, чтобы скрипт выполнился после команды php
    mysql_query("UPDATE mb_details SET Photo = '$uploadfile' WHERE id = $id");

    Код (Text):
    1. <?php
    2.    if($_SESSION['id'])
    3.    {
    4.     $image ='';
    5.      $id = $_SESSION['id'];
    6.      $result = mysql_fetch_assoc(mysql_query("SELECT Photo FROM mb_details WHERE id = $id"));
    7.      if($result['Photo']){
    8.       echo '<img id="avatar" src="'.$result['Photo'].'" class="UserPhoto" alt="Photo">';
    9.      } else{
    10.          echo '<img id="avatar" src="images/NoPhoto.png" class="UserPhoto" alt="Photo">';
    11.        }
    12.      
    13.      echo '<FORM ENCTYPE="multipart/form-data" ACTION="cabinet.php" METHOD=POST>
    14.          <INPUT TYPE="file" STYLE="DISPLAY:none" NAME="userfile" >
    15.          <input type=submit class="send" NAME="open" VALUE="Обзор..." onclick="userfile.click()">
    16.          <INPUT TYPE="submit" class="send" NAME="submit" VALUE="Загрузить">
    17.          </FORM>';
    18.       if(!empty($_FILES)){
    19.            $image_size=$_FILES['userfile']['size'];
    20.           // Ограничение на размер файла, в моём случае 1Мб
    21.           if($image_size>1024*1024||$image_size==0)
    22.           {
    23.               $ErrorDescription="Каждое изображение не должно привышать 1Мб!";
    24.          } else
    25.            if(substr($_FILES['userfile']['type'], 0, 5)=='image')
    26.           {
    27.           $uploaddir = './avatars/';
    28.           $uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
    29.              // Копируем файл из каталога для временного хранения файлов:
    30.           move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
    31.           $id = $_SESSION['id'];
    32.           mysql_query("UPDATE mb_details SET Photo = '$uploadfile' WHERE id = $id");
    33.  
    34.          <script type="text/javascript">
    35.     var afile = '<?php echo $uploadfile;?>';
    36.     $('#avatar').attr('src', afile);
    37.          </script>
    38.           }
    39.         }          
    40.         }
    41.         ?>
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    дело в том, что ты не понимаешь что делаешь =)

    пхп выполняется на сервере. Он подготавливает ТЕКСТ страницы. Текст страницы интерпретируется браузером, теги расковыриваются, скрипты исполняются. В браузере. А пхп - на сервере. Это раз.

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

    =)
    Добро пожаловать в программисты!
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А где бубен и набор костылей с велосипедами на первое время? )
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    На антресолях найдется, думаю.

    Добавлено спустя 35 секунд:
    если на антресолях пусто, то в программистах не задержаться, поди. :D
     
  11. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Спасибо, буду разбираться. На счет бубна это серьезное замечание :). Вообще опыт программирования очень большой, на чем только не писал, но вот с web-технологиями столкнулся недавно. На счет перезагрузки страницы понял, понял так же, что
    Главное замечание, которое я не учел во всем этом.
    Вывод сделал такой: js здесь не нужен, нужно просто обновить страницу. Как ... буду искать.

    Добавлено спустя 29 минут:
    В общем вышел из положения перезагрузкой.
    Вот так:
    Код (Text):
    1. header("Location: cabinet.php");
    Это вставил после
    Код (Text):
    1. mysql_query("UPDATE mb_details SET Photo = '$uploadfile' WHERE id = $id");
    Получил желаемый результат.
    Всем спасибо! Особенно Igordata!!! Вот за это:
    Пока правда не очень разобрался в том, как же тогда работают события типа onclick в PHP.
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Так вам igordata уже долго объясняет - никак! События типа onclick - клиентские! Их обрабатывает JavaScript, и, если нужно, посылает на сервер запросы при помощи технологии AJAX. Вообще, задача php - всего лишь сформировать вывод страницы. Как говорят, php рождён, чтобы умирать - имеется в виду, что как только вывод страницы сформирован, выполнение программы прекращается, и вывод передаётся к браузеру. Если такая ситуация не устраивает, ищите другие системы. В Node.JS это, к примеру, не так, насколько я читал. Но всё равно, клиент должен послать запрос к серверу, сервер сам не знает, что там какой клиент кликнул у себя в окне :)

    У меня ещё не было ни одного проекта, при том, что я пишу пока очень несложные заказы, где бы можно было обойтись только PHP, везде приходится использовать и JavaScript, и часто отправлять запросы AJAX
     
  13. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Понял, спасибо! Буду читать литературу, в начале так всегда, спотыкаешься из за незнания матчасти.
    Ещё один вопрос, если можно, не стал для этого новую тему заводить. Проблема в том, что я решил картинки сохранять как $id+расширение. Т.е. при загрузке новой картинки она сохраняется в виде 1.jpg или 1.png или 1.gif в зависимости от типа загружаемого файла. Вот тут столкнулся с тем, что браузер не обновляет картинку, если до этого старая была загружена с таким же расширением, помогает только кнопка обновить страницу. Сама картинка в папке avatar меняется, но название файла остается старое, поэтому, как мне кажется, браузер не прегружает её. Как быть?

    Добавлено спустя 3 минуты 52 секунды:
    На всякий случай вот новый код того же, что уже писал:
    Код (Text):
    1.  <?php
    2.     if($_SESSION['id'])
    3.     {
    4.      $image ='';
    5.       $id = $_SESSION['id'];
    6.       $result = mysql_fetch_assoc(mysql_query("SELECT Photo FROM mb_details WHERE id = $id"));
    7.       if($result['Photo']){
    8.         echo '<img id="avatar" src="'.$result['Photo'].'" class="UserPhoto" alt="Photo">';
    9.       } else{
    10.          echo '<img id="avatar" src="images/NoPhoto.png" class="UserPhoto" alt="Photo">';
    11.          }
    12.      
    13.       echo '<FORM ENCTYPE="multipart/form-data" ACTION="cabinet.php" METHOD=POST>
    14.             <INPUT TYPE="file" STYLE="DISPLAY:none" NAME="userfile" >
    15.             <input type=submit class="send" NAME="open" VALUE="Обзор..." onclick="userfile.click()">
    16.             <INPUT TYPE="submit" class="send" NAME="submit" VALUE="Загрузить">
    17.             </FORM>';
    18.         if(!empty($_FILES)){
    19.           $image_size=$_FILES['userfile']['size'];
    20.          
    21.           $image_type=$_FILES['userfile']['type'];
    22.           if ($image_type == 'image/jpeg') {
    23.             $filename = $id.'.jpg';
    24.           }
    25.           if ($image_type == 'image/gif') {
    26.             $filename = $id.'.gif';
    27.           }
    28.           if ($image_type == 'image/png') {
    29.             $filename = $id.'.png';
    30.           }
    31.          // Ограничение на размер файла, в моём случае 1Мб
    32.           if($image_size>1024*1024||$image_size==0)
    33.           {
    34.               $ErrorDescription="Каждое изображение не должно привышать 1Мб!";
    35.            } else
    36.             if(!empty($filename))
    37.             {
    38.              $uploaddir = './avatars/';
    39.              $uploadfile = $uploaddir.basename($filename);
    40.                 // Копируем файл из каталога для временного хранения файлов:
    41.              move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
    42.              $id = $_SESSION['id'];
    43.              mysql_query("UPDATE mb_details SET Photo = '$uploadfile' WHERE id = $id");
    44.              header("Location: cabinet.php");
    45.             }
    46.           }            
    47.           }
    48.           ?>
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    при сабмите формы собственно происходит переход по урлу формы. так что всё просто.
    вообще лучше делать проще.
    пхп по сути консольный до ужаса. он принимает входящий поток из STDIN, включая весь POST-запрос. Потом он просто выдает что-то в STDOUT и умирает. Поэтому в пхп никто не следит за утечками памяти, занятыми файловыми дескрипторами и т.п. - один хрен они через одну десятую секунды все освободятся.
    Но соотв. на пхп нельзя написать долгоиграющее приложение без вышеупомянутого бубна. Даже больше. По умолчанию любой скрипт, набравший процессорного времени на 30 секунд будет убит насильно. Меняется в конфиге, но и одна секунда для пхп это очень долгое исполнение и надо что-то чинить и менять если так бывает.

    допиши к ее урлу какойнить рандомный get-параметр типа
    /images/1.png?alalala=dkfjkejfkejf
    только имей в виду, что путь начинающийся без слеша - это относительно текущего положения. такие вещи лучше задавать от корня.
     
  15. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Спасибо! Познавательно! Но процесс, точнее трэд в нем всё равно должен быть уникален, я так понимаю за этим следит сам вэб-сервер, точнее php-процессор, установленный на нем. В общем буду знать.
    А это к сожалению не помогает :-(. Более того, выяснилось,вся эта ... ну в общем мой код работает только в IE. Ни мозила ни хром вообще картинки не грузят, в смысле в папке avatars они не обновляются. Вот теперь займусь этим расследованием, но это уже оффтоп.
    А на счет get-параметра, разве он будет работать в свойстве src? Ну типа:
    Код (Text):
    1. echo '<img id="avatar" src="'.$result['Photo'].'?alalala=dkfjkejfkejf" class="UserPhoto" alt="Photo">';
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    надо чтобы он был разный каждый раз как надо перезагрузить картинку.
    а че б нет?
     
  17. Alex870

    Alex870 Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    121
    Симпатии:
    2
    Ну да, ключевое слово рандомный (ранее сказанное), спасибо!
    извиняюсь, что сомневался. Просто интуиция подводит, здесь я действительно новичок.
     
  18. freelancer.rnd

    freelancer.rnd Новичок

    С нами с:
    5 май 2014
    Сообщения:
    33
    Симпатии:
    0
    Блин а если я получаю сгенерированную картинку в PHP и ее нету на сервере она отправляется сразу клиенту , как ее вывести в браузер? (динамически подгружаю капчу - ReCaptch)

    Добавлено спустя 4 минуты 8 секунд:
    Оп, все я разобрался , нужно просто заного указывать путь на генератор капчи в SRC.