8768 sujets

Développement web côté serveur, CMS

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.
Modérateur
Et l'eau,

l'erreur de syntaxe n'est pas étrange.... insert into .... where ....

Par contre tu as droit de faire :

INSERT INTO
    (un_champ, un_autre_champ, encore_un_champ, encore_un_autre_champ)
AS 
    SELECT
        un_champ, 
        etc 
    FROM 
        une_table
    WHERE 
        un_champ = 'une donnée'

Modifié par niuxe (27 Jul 2019 - 11:33)
Salut Niuxe,

Merci de ta réponse.


$sql = 'INSERT INTO bookings (client_id, arrival_date, departure_date, booking_date, room_id)
            AS 
            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';


Le problème persiste avec cette requête.
Idem si je mets :client_id... après AS

Avec celle-ci plus d'erreur SQL mais il n'y a aucune insertion:

$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)'


Où me suis je trompé ?
Modérateur
Je ne me suis pas vraiment penché sur ton souci. Tes requêtes ne sont pas claires. Stp, indente ton code....

Dans ton terminal ou phpmyadmin ou avec HeidiSQL ou avec Dbeaver ou etc.

Que te donne ces requêtes ?

SELECT 
    client_id, 
    arrival_date, 
    departure_date, 
    booking_date, 
    room_id 
FROM  
    bookings


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


WHERE NOT EXISTS permet de savoir si une sous requete va retourner un résultat ou pas. Donc jumeler ça avec un insert, je ne suis pas sûr que ça soit la bonne chose à faire.
Modifié par niuxe (30 Jul 2019 - 02:55)