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

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

15.02.2013, 19:16. Показов 1744. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru