INSERT et INNER JOIN dans une requête SQL

Résolu
Bonjour,
Dans le cadre de la création d'un site pour un projet scolaire, je rencontre un petit problème. En effet, je dois combiner les fonctions INNER JOIN et INSERT INTO, mais je ne sais comment m'y prendre. J'ai bien essayé quelque chose, mais PHP le compte comme une erreur :

$add = $_POST['adress'];
						$ville = $_POST['ville'];
						$cp = $_POST['CP'];
						$pays = $_POST['pays'];
						
/*Ne fonctionne pas*/	$reqAdd = $bdd->prepare("
						INSERT INTO adresses(adresses.RueAdresse, adresses.CPAdresse, adresses.VilleAdresse, adresses.PaysAdresse) 
						INNER JOIN avoir
						ON avoir.ID_Adresse = adresses.ID_Adresse
						INNER JOIN clients
						ON avoir.ID_Client = clients.ID_Client
						VALUES(:add, :cp, :ville, :pays)
						WHERE clients.PseudoClient = '". $log ."'
						");

						$reqAdd->execute(array(
						'add'=>$add,
						'cp'=>$cp,
						'ville'=>$ville,
						'pays'=>$pays		
						));

La variable log correspond au pseudo stocké dans la session, et est une valeur unique de la BDD. Ainsi, je veux entrer une nouvelle adresse assignée à un membre en particulier.

Merci d'avance pour vous réponses.

7 réponses

  1. J'ai bien essayé de décomposer la requête, mais je rencontre le même problème :

    /*Ne fonctionne pas*/	$reqAdd = $bdd->prepare("
    						SELECT * FROM adresses
    						INNER JOIN avoir
    						ON avoir.ID_Adresse = adresses.ID_Adresse
    						INNER JOIN clients
    						ON avoir.ID_Client = clients.ID_Client
    						
    						");
    						
    						$reqAdd = $bdd->prepare("
    						INSERT INTO adresses(adresses.RueAdresse, adresses.CPAdresse, adresses.VilleAdresse, adresses.PaysAdresse) VALUES(:add, :cp, :ville, :pays)
    						WHERE clients.PseudoClient = '". $log ."'
    						");
    
    						$reqAdd->execute(array(
    						'add'=>$add,
    						'cp'=>$cp,
    						'ville'=>$ville,
    						'pays'=>$pays		
    						));
    1. Ce n'est pas un problème de PHP, mais de SQL.

      La syntaxe "INSERT INTO ... VALUES ... " ne peut inclure de jointures, ni de clause WHERE.

      En revanche, "INSERT INTO ... SELECT ... " accepte jointures et clauses WHERE.

      Ainsi
      INSERT INTO tableA (champA, champB, champC)
      SELECT NULL, client.id, 'nouvelle valeur'
      FROM client
      INNER JOIN tableB ON tableB.champD = client.champE
      WHERE client.login = 'A.Nonymous'

      Je ne comprends pas bien ce que tu veux faire de ton INSERT, je ne peux aider plus.
      1. En fait, ici, trois tables entrent en jeu :
        - La table adresses
        - La table avoir (qui lie clients à adresses)
        - La table clients

        Cette requête a donc pour but d'ajouter une adresse à un client, en fonction de son pseudo unique dans la table client et stockée préalablement dans une session et assigné ici dans la variable $log.

        En tout cas, merci, je vais essayer ta solution ^^

        EDIT :
        Et aussi, les valeurs $add, $ville, $cp, et $pays, destinée à être insérées comme valeurs dans la BDD, ont été définies plus tôt via un $_POST.
        Re-EDIT : Hm, je dois mal m'y prendre, ça ne fonctionne pas x_x

        En fait, si j'arrive bien à ajouter l'adresse en trifouillant, rien ne se passe dans la table "avoir", qui est justement censée relier ladite adresse au client.
        1. Désolé du double post, mais le problème est résolu. J'ai simplement décomposé le problème d'une autre manière :

          $reqAdd = $bdd->prepare("INSERT INTO adresses (RueAdresse, CPAdresse, VilleAdresse, PaysAdresse) VALUES(:add, :cp, :ville, :pays) ");
          						$reqAdd->execute(array(
          						'add'=>$add,
          						'cp'=>$cp,
          						'ville'=>$ville,
          						'pays'=>$pays		
          						));
          						
          						$sqlId = $bdd->query("
          						SELECT ID_Client FROM clients
          						WHERE PseudoClient = '". $log ."'
          						");
          						$donneesId = $sqlId->fetch();
          						$idCli = $donneesId['ID_Client'];
          						
          						$sqlAdd = $bdd->query("SELECT adresses.ID_Adresse FROM adresses
          						
          						WHERE  adresses.RueAdresse = '". $add ."' AND  adresses.CPAdresse = '". $cp ."' AND  adresses.VilleAdresse = '". $ville ."' AND  adresses.PaysAdresse = '". $pays ."'
          						");
          						$donneesAdd = $sqlAdd->fetch();
          						$idAdd = $donneesAdd['ID_Adresse'];
          						
          						$reqId = $bdd->prepare("INSERT INTO avoir (avoir.ID_Client, avoir.ID_Adresse) VALUES(:idCli, :idAdd) ");
          						$reqId->execute(array(
          						'idCli'=>$idCli,
          						'idAdd'=>$idAdd		
          						));						
          1. Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' in C:\wamp\www\projet_web_3\site_marchand\newadress.php on line 140

            ( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse INNER J' at line 2 in C:\wamp\www\projet_web_3\site_marchand\newadress.php on line 140