INSERT et INNER JOIN dans une requête SQL [Résolu/Fermé]

Signaler
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013
-
 A.Nonymous -
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

salut,

quel message d'erreur te retourne PHP ?
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

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		
						));
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.
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

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.
On ne peut insérer dans 2 tables à la fois.
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

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
Messages postés
18
Date d'inscription
mercredi 20 juin 2012
Statut
Membre
Dernière intervention
23 janvier 2013

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		
						));