В общем есть таблица, в которой ID (поле INT auto_increment Primary key) привязываю к файлу. Т.е. при добавлении файла через форму в БД запиывается ID и расширение файла. Полный путь к файлу выходит таким образом:
Код
/каталог/ID.расширение
Проблема возникла вот в чем. Как определить, когда сохраняю файл, с каким именем его сохранять? Например, есть 4 записи, тогда следующий ID будет 5. Т.е. называем файл 5.расширение. Как корректно определить эту цифру 5?
Есть SQL-функция MAX(), т.е. запрашиваю
Код
SELECT max(ID)+1 FROM MyTable;
Вроде бы это должен быть новый ID, который будет при вставке. И все работает.

Есть функция LAST_INSERT_ID(). Но она работает только сразу после вставки данных. Т.е. как вариант - сначала записывать в БД, а потом вызывать move_upload_file. Но если move_upload_file по каким-либо причинам вызовет ошибку? Т.е. надо удалять запись из БД. Как-то некорректно совсем.
Подскажите как вы делаете в данном случае и есть ли такая функция.
Спустя 2 часа, 42 минуты, 8 секунд (15.02.2008 - 10:01) mechanic написал(а):
InnoDB-таблица
начинаем транзакцию
вставка записи
получение last_insert_id()
если move_uploaded_file() == false -> rollback
иначе commit

начинаем транзакцию
вставка записи
получение last_insert_id()
если move_uploaded_file() == false -> rollback
иначе commit

Спустя 3 минуты, 50 секунд (15.02.2008 - 10:04) mechanic написал(а):
последний ID в любом случае лучше получать ф-цией last_insert_id, ибо надежнее, чем самопальные алгоритмы-попытки определить его
какой-то LOCK таблиц тоже желательно использовать, если системой будет пользоваться несколько человек одновременно
если innodb не катит, можно ввести столбец для флага активности и задействовать примерно следующий алгоритм:
вставить запись с флагом "Неактивна", и если move_uploaded_file() != false -> проапдейтить флаг на активный
какой-то LOCK таблиц тоже желательно использовать, если системой будет пользоваться несколько человек одновременно
если innodb не катит, можно ввести столбец для флага активности и задействовать примерно следующий алгоритм:
вставить запись с флагом "Неактивна", и если move_uploaded_file() != false -> проапдейтить флаг на активный
Спустя 40 минут, 37 секунд (15.02.2008 - 10:45) Sylex написал(а):
Цитата(mechanic @ 15.2.2008, 13:01) [snapback]33624[/snapback]
InnoDB-таблица
начинаем транзакцию
вставка записи
получение last_insert_id()
если move_uploaded_file() == false -> rollback
иначе commit

начинаем транзакцию
вставка записи
получение last_insert_id()
если move_uploaded_file() == false -> rollback
иначе commit

Спасибо. Значит вариант - использование транзакций

Спустя 2 минуты, 35 секунд (15.02.2008 - 10:48) vasa_c написал(а):
Цитата
Есть функция LAST_INSERT_ID(). Но она работает только сразу после вставки данных. Т.е. как вариант - сначала записывать в БД, а потом вызывать move_upload_file. Но если move_upload_file по каким-либо причинам вызовет ошибку? Т.е. надо удалять запись из БД. Как-то некорректно совсем.
Корректо. Более того, в основном так и делают.
Кстати, ознакомьтесь с функцией mysql_insert_id
Спустя 4 минуты, 12 секунд (15.02.2008 - 10:52) Sylex написал(а):
Цитата(vasa_c @ 15.2.2008, 13:48) [snapback]33627[/snapback]
Цитата
Есть функция LAST_INSERT_ID(). Но она работает только сразу после вставки данных. Т.е. как вариант - сначала записывать в БД, а потом вызывать move_upload_file. Но если move_upload_file по каким-либо причинам вызовет ошибку? Т.е. надо удалять запись из БД. Как-то некорректно совсем.
Корректо. Более того, в основном так и делают.
Кстати, ознакомьтесь с функцией mysql_insert_id
Знаком с функцией mysql_insert_id. Таже тока PHP:). Спасибо!
_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.