Почему PHP отправляет запросы к базе данных не по порядку?

В общем, столкнулся с такой проблемой. Есть кусок кода:
$validation = Booking::findByUserProduct( $user_id, $product_id );
$answer = Booking::queryAddReturn($validation, $product_id, $way, $user_id, $count);

В него передаются параметры для записи в БД. Сначала происходит проверка, не записана ли информация в БД, чтобы не было дублей. Если есть, то $validation приравнивается false, иначе - true. Затем отправляется запрос (в методе Booking::queryAddReturn ). В нём обрабатывается $validation, в зависимости от него запись создаётся или нет. Вместе с этим пользователю выдаётся соответствующее сообщение.

В чём проблема: такое ощущение, что php отдаёт сначала второй запрос (на запись в БД), а затем - первый (на проверку существования записи). Если я уберу вторую строчку, то var_dump($validation) выдаёт bool(true), то есть записи нет. Если я её верну, то bool(false).

Код Booking::findByUserProduct:
public static function findByUserProduct( $user_id, $product_id ) {
	$sql = 'SELECT * FROM booking WHERE `user_id`=:user_id AND `product_id`=:product_id';
	$res = \Yii::$app->db->createCommand($sql)
			->bindValue(':user_id', (int) $user_id)
			->bindValue(':product_id', (int) $product_id)
			->queryall();
	return count($res) === 0;
}


Код Booking::queryAddReturn:
public static function queryAddReturn($validation, $product_id, $way, $user_id, $count) {
		
	if( $validation !== true ) {
		return '<p class="text-light">Ошибка: товар уже заказан</p>';
	}
	else{
		if( Booking::addOne( $product_id, $way, $user_id, $count ) )
			return '<p class="text-light">Заказ успешно принят</p>';

		return '<p class="text-light">Ошибка: не удалось обработать заявку</p>';
	}
}


Причём в findByUserProduct var_dump($res) выдаёт массив с теми самыми значениями $user_id и $product_id, которые передавались.

В чём может быть причина?
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 2
Ну если вы хотите чтобы всё было по порядку, то используйте транзакции. Я код ваш не очень посмотрел. но суть транзакций такова: он блокирует другие операции, пока не будет выполнен запрос.
Ответ написан
Комментировать
@diman2000linda Автор вопроса
Оказалось. всё было из-за того, что на стороне клиента код вызывался дважды. Точнее, на одной кнопке на клик были назначены два одинаковых обработчика. Ajax-запрос шёл дважды.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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