Как правильно сделать выборку, сгенерировать URL для каждого водителя и отправить email?

Здравствуйте!

Есть следующая логика:

1. пользователь заполняет данные заказа трансфера -> редиректит на гейт оплаты (stripe ) -> если данные ОК, оплата ОК -> сохраняем все в базу.
2. Если данные сохранились -> выбираем всех водителей с базы -> для каждого водителя генерируем URL по которому водитель может принять заказ -> каждому водителю отправляем email с этим URL
3. "Кто первый тот молодец" - у каждого водителя своя ссылка ($url). Тут мы потом парсим и получаем ID водителя, который сохраняем в driver_id.

$connection = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$connection->set_charset("utf8");
	
$email_carrier_mode = 'drivers';

if (!$connection) {
		die("Connection failed: " . mysqli_connect_error());
		 // TODO : проверить последнюю оплату и если ошибка, сделать refund - commision - сохранить лог

	} else {
		// получаем все данные
		$departureaddress = $_SESSION['departureaddress'];
		...

		if (isset(
			$_SESSION['order_id'],
			...
		)) {
			// сохраняем
			$sql = "INSERT INTO orders ( ' ', ...)  VALUES ( ' ', ...)";
			$query = mysqli_query($connection,$sql);

			if($query){
				// если был указан код скидки, код в базе уменьшаем на 1

				if(!empty($discount_name)){
					$update = "UPDATE discount SET quantity = quantity - 1  WHERE discountname = '$discount_name'";
					mysqli_query($connection, $update);
				}

				$root = ROOT.'/orders';
				$file = '/'.$transfer_type.'-'.$order_id.'.html';

				if( !file_exists($file)) {
					$fp = fopen($root . $file, "w"); // создаем файл

					$replace = array( ' ', ... );
					$with = array( );

					ob_start();
					include('html-template-web.html');
					$ob = ob_get_clean();

					fwrite($fp, str_replace($replace, $with, $ob));
					fclose ($fp);
				}
				// отправляем емайл на почту  или водителям

				$mail = new PHPMailer();
				$mail->isSMTP();
				$mail->Host = 'smtp.gmail.com';
				$mail->Port = 587;
				$mail->SMTPAuth = true;
				$mail->SMTPSecure = 'tls';
				$mail->Username = '';
				$mail->Password = '';
				$mail->CharSet = 'utf-8';

				if($email_carrier_mode = 'dispatch'){
					ob_start();
						include("html-template-carrier.php");
						$template_carrier = ob_get_contents();
					ob_end_clean();

					$mail->setFrom($email, $name);
					$mail->addAddress('booking@intaxi.si');
					$mail->Subject = 'New "'.$transfer_type.'" order from intaxi.si ';
					$mail->msgHTML(''.$template_carrier.'');
					$mail->send();

				}else if ($email_carrier_mode = 'drivers'){
					$driver_get = "SELECT * FROM drivers";
					$check_driver = mysqli_query($connection, $driver_get);

					ob_start();
						include("html-template-driver-short.php");
						$template_driver = ob_get_contents();
					ob_end_clean();

					while($row = mysqli_fetch_array($check_driver)){
						$mail->setFrom('booking@intaxi.si', 'TransferWay - inTaxi.si');
						$mail->addAddress($row['email']);
						$mail->Subject = '[ CONFIRM RIDE ] - Your get new ride from TransferWay.';
						$url = "https://intaxi.si/accepted.php?order_id=".$order_id."&driver_id=".$row['id'];

						$mail->msgHTML(' Please confirm ride with this URL - '.$url.'');
						$mail->send();
					}
				} else if($email_carrier_mode = 'automate'){
					// интеграция с HiTaxi Dispatch System
				}
				// перенаправляем на success.php
				header("Location: https://intaxi.si/success.php");

			}else{
				$msg = "Data insert into db ERROR";
				// TODO: проверить последнюю оплату и если ошибка, сделать refund - commision - сохранить лог
				header("Location: https://intaxi.si/cancel.php"); 
				exit();
			}
		} else {
			// TODO: проверить последнюю оплату и если ошибка, сделать refund - commision - сохранить лог
			header("Location: https://intaxi.si/cancel.php"); 
			exit();
		}
	}
	mysqli_close($connection);


Код рабочий, но при попытке отправить email водителям происходит следующее:

Если в базе 10 водителей

водитель id1 - получит 10 мейлов в каждом будет сгенерирована ссылка.
водитель id2 - получит 9 мейлов в каждом будет сгенерирована ссылка.
...
водитель id10 - получит 1 эмайл со своей ссылкой.

я понимаю что проблема в
while($row = mysqli_fetch_array($check_driver)){
	$mail->setFrom('booking@intaxi.si', 'TransferWay - inTaxi.si');
	$mail->addAddress($row['email']);
	$mail->Subject = '[ CONFIRM RIDE ] - Your get new ride from TransferWay.';
	$url = "https://intaxi.si/accepted.php?order_id=".$order_id."&driver_id=".$row['id'];
	$mail->msgHTML(' Please confirm ride with this URL - '.$url.'');
	$mail->send();
}


но так и не понял как правильно реализовать :/
может для этого while() и не подходит ?
Прошу помощи знающих :)
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
@KingstonKMS
full-stack web developer
Вам надо в начале цикла очищать получателей.
$mail->clearAddresses();
И из цикла можете вынести те методы, которые не зависят от $row
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 мая 2020, в 02:01
4500 руб./за проект
26 мая 2020, в 00:42
10000 руб./за проект
25 мая 2020, в 22:16
3000 руб./за проект