@mega-epic

Какой порядок выполнения скриптов PHP?

Новичок в php, вопрос следующий. Несколько пользователей на сайте в один момент делают одно и тоже действие(в моем случае хотят забронировать один и тот-же автомобиль на одно и то же время). Их клиенты ajax-ом вызывают скрипт на сервере и отправляют JSON с данными о бронировании (вот фрагмент):
if($_POST['query'] == "create"){
	$connect = mysqli_connect($config['DB_IP'], $config['DB_LOGIN'], $config['DB_PASS'], $config['DB_NAME']);
	$input_json = json_decode($_POST['json']);
	for($i = 0; $i < count($input_json->book); $i++){//в массиве book даты, на которые нужен авто
		$date = new DateTime($input_json->book[$i]);
		$check = mysqli_query($connect, "
		SELECT * 
			FROM schedule
				INNER JOIN booking
					ON schedule.booking = booking.id
						WHERE booking.auto = ". $input_json->car_id ."
						AND schedule.date = '". $date->format('Y-m-d') ."'
			");
	}
	if(mysqli_num_rows($check) == 0){
		$book = mysqli_query($connect, "INSERT INTO booking (verify,client,auto,comm) VALUES (0,".$input_json->client.",".$input_json->car_id.",'null')");
		$id_book = mysqli_insert_id($connect);
		$schedule = "INSERT INTO schedule (booking,date) VALUES ";
		for($i = 0; $i < count($input_json->book); $i++){
			if($i > 0) $schedule .= ",";
			$date = new DateTime($input_json->book[$i]); 
			$schedule .= "(".$id_book.",'".$date->format('Y-m-d')."')";
		}
		$schedule .= ";";
		$create = mysqli_query($connect, $schedule);
		echo 'ok'; 
	}
	else {
		echo 'error'; //на клиент возвращается ошибка, что машина уже забронирована на это время
	}

В цикле проверяется, нет ли в базе данных бронирований на те дни, на которые хочет пользователь. Если нету, то условие выполняется и в базу записывается новое бронирование. Соответственно кто первый успел, того и сапоги.
В чем суть вопроса: Как выполняются скрипты? Если параллельно, то получается что может произойти коллизия - например в двух одновременно запущенных скриптах проверка в бд ничего не найдет, и сработает условие на запись, а там . Правильно я понимаю?
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
gobananas
@gobananas
finishhim.ru
В целом вы понимаете всё правильно. Суть в том что мы люди, для нас клик с разницей в одну сотую секунды это "одновременно" а для машины нет. Тот кто первый - забронирует. Тот кто второй - получит ошибку. Если сомневаетесь - перед запросом заблокируйте таблицу
LOCK TABLES
после запроса разблокируйте
UNLOCK TABLES
Но аккуратнее с этим, при большом количестве запросов это может создать проблемы
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы