Добрейший день.
Делаю загрузку аудиофайлов. Также есть возможность сортировать их (drag&drop). У каждой строки (аудиофайла) в таблице MySQL есть столбец "position", его я у каждого загруженного файла устанавливаю на 1 больше, чем у предыдущего. Делаю я это прибавлением к счетчику, который находится в таблице альбомов (собственно в строку альбома, в который добавляется аудиозапись). После добавления записи в таблицу аудиофайлов, я обновляю счетчик в альбоме (+1) и PHP-скрипт завершается.
JS отправляет следующий запрос со следующим файлом, но увы, MySQL почему-то не успела обновить счетчик в альбоме и там до сих пор старое количество аудиозаписей, получается что каждые две аудиозаписи идут с одинаковой позицией. На второй аудиозаписи MySQL, благо, удосуживается зафиксировать обновление.
Ajax-запросы точно идут по порядку, друг друга не перекрывая. Т.е. первый файл загрузился - только потом начинается загрузка второго. В этом я уверен. Вот интересно, почему PHP завершает скрипт до того, как MySQL закончит свои дела? Может есть какая-то функция закрытия запроса и процесс будет висеть пока MySQL не закончит?
Заранее большое спасибо:)
Кому интересно решение, то вот код до решения:
if($id and $title and $AudioFile) {
$id = trim($id);
$title = trim($title);
if($id !== '' and $title !== '') {
// Передаём данные формы
// Проверяем загружен ли файл
if (is_uploaded_file($AudioFile["tmp_name"])) {
if ($AudioFile["type"] == "audio/mp3") {
$name = md5($AudioFile['name'] . time()) . ".mp3";
$n = $dbh->query("SELECT count_audios FROM audio_albums WHERE id='$id' LIMIT 1", PDO::FETCH_NUM);
if($n and $n->rowCount() == 1) {
$n = ((int)$n->fetch()[0])+1;
// Если файл загружен успешно, перемещаем его
// из временной директории в конечную
$dbh->beginTransaction();
$dbR = $dbh->exec("insert into audios (title, src, album, `position`) VALUES ('" . $title . "', '$name', '" . $id . "', '$n')");
if ($dbR and $dbR == 1) {
$mvR = move_uploaded_file($AudioFile["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . "/media/audio/" . $name);
if ($mvR) {
$dbh->exec("UPDATE audio_albums SET count_audios='$n' WHERE $id='$id' LIMIT 1");
$dbh->commit();
} else {
$dbh->rollBack();
Destroy('Не удалось переместить файл.');
}
} else {
Destroy('Не удалось создать запись.');
}
}
} else {
Destroy('Неверный формат аудиозаписи.');
}
} else {
Destroy('Файл не был загружен.');
}
echo '{"err":"null"}';
}
}
else {
Destroy('Не указаны данные.');
}
И, собственно, код после решения, все работает отлично:) Спасибо за наставления,
Евгений Вольф.
if($id and $title and $AudioFile) {
$id = trim($id);
$title = trim($title);
if($id !== '' and $title !== '') {
if (is_uploaded_file($AudioFile["tmp_name"])) {
if ($AudioFile["type"] == "audio/mp3") {
$name = md5($AudioFile['name'] . time()) . ".mp3";
$dbh->beginTransaction();
$dbR = $dbh->exec("INSERT INTO `audios` (`title`, `src`, `album`, `position`) SELECT '$title','$name','$id', COUNT(*)+1 FROM audios WHERE album='$id' LIMIT 1");
if ($dbR && $dbR == 1) {
$mvR = move_uploaded_file($AudioFile["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . "/media/audio/" . $name);
if (!$mvR) {
$dbh->rollBack();
Destroy('Не удалось переместить файл.');
}
} else {
Destroy('Не удалось создать запись.');
}
$dbh->commit();
} else {
Destroy('Неверный формат аудиозаписи.');
}
} else {
Destroy('Файл не был загружен.');
}
echo '{"err":"null"}';
}
}
else {
Destroy('Не указаны данные.');
}