За последние 24 часа нас посетили 21227 программистов и 1661 робот. Сейчас ищет 1091 программист ...

Записывается в БД только 1 картинка

Тема в разделе "Обработка изображений средствами PHP", создана пользователем keaks88, 25 фев 2016.

  1. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    Ребят, доброго времени суток. Такая вот проблемка уже голову сломал себе. В общем отправляю через форму

    Код (PHP):
    1. <p><input type="file" name="files[]"></p>
    2.                     <p><input type="file" name="files[]"></p>
    3.                     <p><input type="file" name="files[]"></p> 
    изображения, запись в бд происходит нормально. к объекту добавляется сразу 3 фото. Но проблема в том что фото эти все одинаковые. Вот сам код.

    Код (PHP):
    1. if (isset($_FILES['files'])) {
    2.             $id_news = $objekt_id;        
    3.             foreach ($_FILES['files']['name'] as $k => $files) {
    4.                 $ext = strrchr($files, ".");
    5.                 $filetypes = array('.jpg','.gif','.bmp','.png','.JPG','.BMP','.GIF','.PNG','.jpeg','.JPEG');
    6.                 if (!in_array($ext,$filetypes)) {
    7.                  msgbox('Обнаружена ошибка', 'Вы пытаетесь загрузить запрещенный к загрузке файл.');
    8.                 } else { 
    9.                   $imagepath = "uploads/photo/" . date("YmdHis", time()) . "$ext";
    10.                     if ($r = move_uploaded_file($_FILES['files']['tmp_name'][$k], $imagepath)) {
    11.                         $files = $db->query("INSERT INTO photos VALUES(NULL,'$id_news', '$imagepath')");
    12.                     } else {
    13.                         msgbox('Обнаружена ошибка заполнения формы', 'Ошибка загрузки файла.');
    14.                     }
    15.                 }
    16.             }
    17.         } 
    В чем ошибка? подскажите пожалуйста почему в бд появляется 3 записи к объекту, но фото во всех трех записях одинаковые.

    Заранее благодарен за помощь.

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    всё станет понятней, если перед выполнением insert-запроса в БД, сделать вывод самой строки запроса - как она сформировалась (;
     
  4. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    Код (PHP):
    1. (
    2.     [files] => Array
    3.         (
    4.             [name] => Array
    5.                 (
    6.                     [0] => РёР·РѕР±СЂР°Р¶РµРЅРёРµ viber.jpg
    7.                     [1] => РёР·РѕР±СЂР°Р¶РµРЅРёРµ viber2.jpg
    8.                     [2] => РёР·РѕР±СЂР°Р¶РµРЅРёРµ viber3.jpg
    9.                     [3] => РёР·РѕР±СЂР°Р¶РµРЅРёРµ viber4.jpg
    10.                 )
    11.  
    12.             [type] => Array
    13.                 (
    14.                     [0] => image/jpeg
    15.                     [1] => image/jpeg
    16.                     [2] => image/jpeg
    17.                     [3] => image/jpeg
    18.                 )
    19.  
    20.             [tmp_name] => Array
    21.                 (
    22.                     [0] => C:\Windows\TEMP\phpEA41.tmp
    23.                     [1] => C:\Windows\TEMP\phpEA42.tmp
    24.                     [2] => C:\Windows\TEMP\phpEA43.tmp
    25.                     [3] => C:\Windows\TEMP\phpEA44.tmp
    26.                 )
    27.  
    28.             [error] => Array
    29.                 (
    30.                     [0] => 0
    31.                     [1] => 0
    32.                     [2] => 0
    33.                     [3] => 0
    34.                 )
    35.  
    36.             [size] => Array
    37.                 (
    38.                     [0] => 0
    39.                     [1] => 0
    40.                     [2] => 0
    41.                     [3] => 0
    42.                 )
    43.  
    44.         )
    45.  
    46. )
    Вот aray
     
  5. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    если перед выполнением insert-запроса в БД
     
  6. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    Как посмотреть?
     
  7. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Код (PHP):
    1. echo "INSERT INTO photos VALUES(NULL,'$id_news', '$imagepath')" 
    (;

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  8. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    Код (PHP):
    1. INSERT INTO photos VALUES(NULL,'203', 'uploads/photo/20160225210650.jpg')
    2. INSERT INTO photos VALUES(NULL,'203', 'uploads/photo/20160225210650.jpg')
    3. INSERT INTO photos VALUES(NULL,'203', 'uploads/photo/20160225210650.jpg')
    4. INSERT INTO photos VALUES(NULL,'203', 'uploads/photo/20160225210651.jpg') 
    Добавлено спустя 1 минуту 24 секунды:
    первые 3 почему то заменились, и стали одинаковыми "20160225210650.jpg" хотя загружаю 4 разных фото
     
  9. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    предположу, что у тебя ошибка, как раз строкой выше перед выполнением sql-запроса в БД ((:)
    дебаж - и смотри, почему не меняется...
     
  10. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    p@R@dox 55RU я гадаю что строка двумя строками выше :)
     
  11. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    denis01, возможно... Формат "YmdHis" надо изменить (:)
     
  12. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    дебажил ничего не показало, с форматом времени менял такая же ерунда.
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да нет, там формат-то времени правильный. его использование не очень правильно. у тебя много картинок за одну единицу времени успевает залиться вот они друг друга и перетирают. добавь какую-нибудь переменную-счетчик к своей итерации массива загруженных файлов и получишь для них для всех уникальные имена.
     
  14. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    Суть в том что с инпутов, данные приходит нормально. В БД пишется тоже правильное количество. Но вот имя файла приписывается либо одинаковое у всех, либо у всех кроме одного. Так же и в папке за груженых изображений появляется только то изображение которое прописалось в бд.
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    * рядом с уникальными тут умалчивается фраза "в рамках твоего проекта и уровня познаний". потом научишься как лучше делать.
     
  16. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    предложу заменить на такой вариант
    Код (PHP):
    1. date( 'YmdHis' ) . '-' . rand( 10 , 100 )
    свой
    Код (PHP):
    1. date("YmdHis", time())
    (;
     
  17. Ganzal

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

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

    Добавлено спустя 1 минуту 23 секунды:
    p@R@dox 55RU, не надо рандома. рандом может случайно дать одинаковое число. он же псевдорандом. и что тогда? счетчик, ну ё-моё, счетчик. и все дела.
     
  18. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Ganzal, ты зря беспокоишься (((; Уже много раз проверенный трюк - всё уникально, без проблем ((:)
     
  19. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    а что лучше uniqid или счетчик?
     
  20. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну не знаю. ты взял ружье с отсыревшими патронами, направил себе в лицо и дрочишь курок, убеждая окружающих в том, что ружье НИКОГДА не выстрелит. а оно ведь может выстрелить. и скорее всего выстрелит. ну это ж физический процесс, в котором много случайностей. подсохнут патроны и твои мозги украсят потолок. так же и такой код (назовем своими именами - говнокод. без обид). в нем уникальность только мнимая. а когда вдруг случится коллизия ты ой. потому что зачем тебе правильно писать если и такие костыли работают. ты сейчас зачем-то отстаиваешь право на логические ошибки в алгоритме.

    для решения твоего затыка достаточно просто подставить переменную $k в нужное место. идеология "объявить переменную-счетчик перед циклом, а в цикле подставлять инкремент её значения" у тебя уже наполовину доступна через то как ты итерируешь массив.
     
  21. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Ganzal, это чисто твое воображение, а я тебе говорю о своей действительности - то что у меня ни раз было на практике. Смекаешь?
    К тому же, чем больше разброс между числами, тем менее вероятнее, что будут совпадения. Допустим, не от 10 до 100, а от 1 до 1000.
    Я лишь предложил вариант, который мне пришел по памяти, а выбирать только автору ((:)
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    p@R@dox 55RU, да я-то смекаю. просто не очень понимаю почему ты не допускаешь для себя использования нормально алгоритма, зато с пеной у рта отстаиваешь условно неправильный. но это твоё личное дело. проехали.
     
  23. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    p@R@dox 55RU псевдослучайное число или другое случайное число в конкретно этой задачи это гавнокод.

    Ganzal думаю счётчик тоже не подойдёт, так как несколько пользователей могут отправить в один момент форму.

    Я бы получил auto_increment строки в базу и дал имя картинки по id.
     
  24. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    блин... я что-то представил что он новости на сайт выкладывает. подумал что он один, и поэтому проблемы не возникнет.
     
  25. keaks88

    keaks88 Новичок

    С нами с:
    13 июн 2015
    Сообщения:
    37
    Симпатии:
    0
    Это я образно написал о новостях.
    В общем сделал так,
    Код (PHP):
    1. $imagepath = "uploads/photo/". md5(uniqid().$files).'_'.rand(1,1000) . "$ext"; 
    Что скажете гуру?