Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 1
Регистрация: 01.11.2010
Сообщений: 43

Работа с mysql_insert_id() и генерирование уникального имени файла

15.02.2013, 19:16. Показов 1771. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Пред история:
Был запущен проект без особых надежд на не дорогом купленном движке для загрузки файлов. Вот работал этот движок и я только иногда менял что то в шаблоне и почти никогда не лез в код (так как после покупки я его увидел и мне было страшно туда лезть ). Но вот пришло мне письмо от хостера про высокую нагрузку. Я уже был на дорогом шаред хостинге и пришлось все таки арендовать ВПС. После настройки я все запустил и все залетало дальше, хотя иногда проскакивали и тормоза. Я уже всерьез взялся после переноса за движок так как уже смотрел более подробно за нагрузкой. И после анализа тяжелых запросов я начал понемногу менять архитектуру движка.

А теперь о самом вопросе:
Добавление файлов на сервер оказалось происходило очень не правильно. В случае картинок сначала генерировалось превью и имя конечного файла которое будет на сервере и производилась запись файлов на диск. Дальше добавлялась запись в таблицу.

Вот тут я и был сильно удивлен. Имя файла генерировалось по такому шаблону id.xxx где xxx тип файла. Такой шаблон меня устраивал но для всего этого требовалось 4 запроса в базу.
И так. Внимание! Первый запрос брал с базы данных последний ИД (который создавался автоинкрементом) и добавлял ему единицу. И это было название нашего файла. По заданному алгоритму генерировалось превью для картинки и получало имя id-thumb.xxx где xxx тип файла. Єтот ИД хранился в переменной и использовался дальше для создания имени новой полной картинки.
Дальше происходила запись в таблицу где в определенных полях хранился полный путь к файлу и имя файла.
Потом был ужас. (Заметка: Авторизация пользователей происходила при помощи сессий). Выбирался с базы ИД пользователя где ИД был равен ИД который был в массиве сессии (они всегда были одинаковы и эта операция была выброшена).
Потом для генерации ссылок на файл проис ходил еще один запрос к базе где выбиралась уже информация по загруженному файлу (пути, кто загрузил) и генерировалась ссылка.

Оптимизация: Первым делом я решил убрать генерацию ИД при помощи запроса к базе и выбора ИД последней записи так как кто его знает сколько еще может быть и инсертов после этого селекта.

План был таков. Делать всего одну запись в базу. Но тут появилась проблема. Для генерации имени нужен ИД который будет присвоен этому файлу. Его решил брать при помощи функции mysql_insert_id(). И вот беда,во идее после инсерта должны быть заполнены поля с путями к файлу, но их нельзя заполнить так как генерация ИД происходит во время создания записи.

Решением этой проблемы чтобы не создавать еще один запрос но уже апдейт данных я думал решить так:
Первая мысль фантастическая. Чтобы мускуль каким то образом сам дописал ид в поле имени файла но мне это показалось не правильным и не возможным. И я оставил такую затею.

Вторая мысль. Генерировать имя файла не связывая его и ИД. Но вот как сделать алгоритм чтобы имя файла было всегда разным? Думал использовать в алгоритме временную метку и например размер файла.
Или может кто подскажет как правильней это сделать. Чтобы был минимум запросов а также не большое время на выполнение скрипта.
Если я упустил что то важное для решения то пишите. Обязательно напишу.

Добавлено через 10 минут
Вот кусочек код с запросами
Кликните здесь для просмотра всего текста

PHP
1
2
3
4
5
6
$stat  = mysql_fetch_assoc(mysql_query('SELECT id FROM files ORDER BY id DESC LIMIT 0,1'));
$new_id  = $stat['id']+1;
 
mysql_query("INSERT INTO files(name, owner, date, path, thumb_path) VALUES ('$name', '".$_SESSION['id']."','".$time."', '$path', '$thumb')");
$res = mysql_fetch_assoc(mysql_query("SELECT * FROM user WHERE id='".$_SESSION['id']."'")); //я не понял зачем эта строка так как дальше нужен только ид владельца файла
$file = mysql_fetch_assoc(mysql_query("SELECT * FROM `files` WHERE `name`='".$name."' ORDER BY `id` DESC")); // и тут не понятно. так как это совсем другое имя файла которое можно задать при загрузке и оно будет отображаться в тайтле. Они могут быть одинаковыми.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2013, 19:16
Ответы с готовыми решениями:

Генератор уникального имени файла при загрузке
Товарищи, прошу у вас помощи, накидал форму загрузки файла на сервер, с последующей записью имени файла в бд. Но чет не вкуриваю каким...

Генерирование нового имени для файла
Добрый день! Вот смотрите. Есть форма, на которой присутствует FileUpload, с помощью которого пользователь загружает изображение на...

Как сделать проверку на наличие похожего имени файла и запрос нового имени файла?
При загрузке изображения присваивается имя foto.jpg. Вопрос, как сделать проверку на то что фото с таким именем существует и если он...

2
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
16.02.2013, 09:29

Не по теме:

Цитата Сообщение от PlayTime Посмотреть сообщение
И так. Внимание! Первый запрос брал с базы данных последний ИД (который создавался автоинкрементом) и добавлял ему единицу. И это было название нашего файла. По заданному алгоритму генерировалось превью для картинки и получало имя id-thumb.xxx где xxx тип файла. Єтот ИД хранился в переменной и использовался дальше для создания имени новой полной картинки.
Дальше происходила запись в таблицу где в определенных полях хранился полный путь к файлу и имя файла.
Типичное «чудо». :D


Цитата Сообщение от PlayTime Посмотреть сообщение
План был таков. Делать всего одну запись в базу. Но тут появилась проблема. Для генерации имени нужен ИД который будет присвоен этому файлу.
Думаю, по-хорошему так и делается. Вставляем запись, получаем новый ID, сохраняем файл и либо обновляем либо удаляем запись в случае успешного и неуспешного сохранения соответственно.

Если поддерживаются транзакции, то для целостности данных лучше запустить транзакию перед insert'ом (или savepoint, если всё целиком уже происходит в транзакции). Затем после успешного сохранения файла update и commit (или сохранение savepoint). В случае ошибки сохранения файла откат транзакии (или savepoint'а).
1
2 / 2 / 1
Регистрация: 01.11.2010
Сообщений: 43
17.02.2013, 20:22  [ТС]
В общем как я сделал.
Имя файла генерируется перед запросом к БД.
PHP
1
$filename = md5(uniqid().$filesize);
Подумал что вероятность загрузки одновременно двух файлов с абсолютно одинаковым размером очень очень мала.

А потом один запрос к базе данных
MySQL
1
mysql_query("INSERT INTO files(owner, date, path, thumb_path) VALUES ('".$_SESSION['id']."','".$time."', '$path', '$thumb')");
Добавлено через 6 минут
PS. Наверно все таки добавлю к имени файла еще и ИД. Тогда уж точно один пользователь не загрузит одновременно два одинаковых файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2013, 20:22
Помогаю со студенческими работами здесь

Сделать проверку на наличие похожего имени файла и запрос нового имени файла
Пользователь задает имя для создания файла. Вопрос, как сделать проверку на наличие похожего имени файла и запрос нового имени файла?

Работа с выделенным файлом. Получение имени выделенного файла
Здравствуйте, как можно в python работать с выделенным файлом или получить его имя(путь)? Например у меня есть функция, срабатывающая...

Создание уникального файла
Подскажите, как создать файл с уникальным именем? Т.е. - набрали случайную последовательность символов, что делать потом? ...

Работа с файлами. Как менять часть имени файла с каждым проходом цикла?
Пользователь вводит данные о сотрудника. Ввод данных должен происходить циклически после запроса пользователя - хочет ли он ввести...

Создание временного уникального файла
Помогите пожалуйста, нужно создать временный файл с уникальным именем, я знаю что это делается с помощью tmpfile вот так: $temp =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru