[MySQL] Erreur de syntaxe étrange

Petit nouveau ! | 7 Messages

27 juil. 2019, 04:46

Bonjour,

Je cherche à faire un filtre avant l'insertion de données pour éviter les doublons en base de données.

Pour cela j'ai fait ceci:
public function addBooking(Booking $booking)
	{
		$sql ='INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id)
			   WHERE NOT EXISTS (SELECT client_id, arrival_date, departure_date, booking_date, room_id FROM bookings
			   		WHERE client_id=:client_id AND arrival_date=:arrival AND departure_date=:departure AND booking_date=:today AND room_id=:room_id)';

		$stmnt = $this->_db->prepare($sql);
		$clientId = $booking->getClientId();
		$arrival = $booking->getArrivalDate();
		$departure = $booking-> getDepartureDate();
		$today = $booking->getToday();
		$roomId = $booking->getRoomId();
		$stmnt->bindParam(':client_id', $clientId);
		$stmnt->bindParam(':arrival', $arrival);
		$stmnt->bindParam(':departure', $departure);
		$stmnt->bindParam(':today', $today);
		$stmnt->bindParam(':room_id', $roomId);
		$stmnt->execute();

		//gestion des erreurs
		$errors = $stmnt->errorInfo();
		if ($errors[0] != '00000') 
		{
			echo 'Erreur SQL (addbooking). ' . $errors[2] . '<br>';
		}
		else
		{
			$success_msg = 'Les données ont bien été enregistrées en base de données';
		}
	}

Or, il y a un problème car cela affiche ceci:

Erreur SQL (addbooking). Erreur de syntaxe près de 'WHERE NOT EXISTS (SELECT client_id, arrival_date, departure_date, booking_date, ' à la ligne 2


Vous noterez que cela n'affiche pas ce qui se trouve après booking_date alors qu'il y a encore une donnée.

J'ai également noté que si j'écris la requête comme ceci:
$sql ='INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id)
			   WHERE NOT EXISTS (
			   		SELECT client_id, arrival_date, departure_date, booking_date, room_id FROM bookings
			   		WHERE client_id=:client_id AND arrival_date=:arrival AND departure_date=:departure AND booking_date=:today AND room_id=:room_id)';

Cela mange un morceau de la requête et affiche ceci:

Erreur SQL (addbooking). Erreur de syntaxe près de 'WHERE NOT EXISTS ( SELECT client_id, arrival_date, departure_date, book' à la ligne 2


D'où peut venir ce problème ?

D'avance merci.

Mammouth du PHP | 559 Messages

27 juil. 2019, 11:58

bonjour,
INSERT est toujours suivi de SELECT

Code : Tout sélectionner

INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id) SELECT client_id, arrival_date, departure_date, booking_date, room_id FROM bookings WHERE NOT EXISTS (SELECT room_id FROM bookings WHERE arrival_date=:arrival AND departure_date=:departure AND booking_date=:today AND room_id=:room_id)';

Petit nouveau ! | 7 Messages

27 juil. 2019, 17:41

Salut Yann

Merci pour ta réponse j'ai testé ton code:
INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id)
SELECT client_id, arrival_date, departure_date, booking_date, room_id FROM  bookings
WHERE NOT EXISTS 
 (SELECT  room_id FROM bookings
         		WHERE  arrival_date=:arrival AND departure_date=:departure AND booking_date=:today AND room_id=:room_id)';

Et j'obtiens ceci:
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp64\www\PHP04-02-test\class\Bookingmanager.php on line 78

La ligne 78 coresspondant à:
$stmnt->execute();

J'ai donc ajouté client_id pour obtenir ceci:
$sql ='INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id)
				SELECT client_id, arrival_date, departure_date, booking_date, room_id FROM  bookings
				WHERE NOT EXISTS 
 					(SELECT  room_id FROM bookings
         			WHERE client_id=:client_id AND arrival_date=:arrival AND departure_date=:departure AND booking_date=:today AND room_id=:room_id)';

Je n'ai plus d'erreur PHP ni d'erreur SQL en revanche aucune insertion n'est effectuée, où me suis je trompé ?

Mammouth du PHP | 1562 Messages

30 juil. 2019, 14:05

cette requète est écrite n'importe comment.

https://stackoverflow.com/questions/164 ... esnt-exist
INSERT INTO funds (ID, date, price)
SELECT 23, DATE('2013-02-12'), 22.5
  FROM dual
 WHERE NOT EXISTS (SELECT 1 
                     FROM funds 
                    WHERE ID = 23
                      AND date = DATE('2013-02-12'));
comme tu le vois dans l'exemple chaque valeur se trouve à la fois dans l'INSERT et dans le SELECT
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie