Renvoie de deux requêtes SQL

Eléphant du PHP | 398 Messages

05 juin 2008, 17:33

Yop,

J'aimerai savoir comment je peux renvoyer deux requetes SQl dans une méthode. J ai un formulaire d'inscription, et je dois renseigner deux tables de ma base de donnée.

J'utilise deux methodes pour construire ma requete SQl, qui est renvoyée dans une méthode d'une classe supérieure pour être traitée.
Le probleme c est que le script fonctionne tres bien si je n'utilise une requete SQL (remplissage d'une table) mais se corse pour l'insertion dans deux tables. J ai pensé à la concaténation des deux requetes avant de les renvoyer mais ça ne doit pas être la solution.
Peut-on renvoyer deux variables ?

Pour mieux comprendre, voilà mon code :
Les données du formulaire sont recuperées comme ceci :
if ($_POST['btnEdit']=='Sauver' and !$this->m_bModeEdition) {
         if($this->_verifDispoUser(pg_escape_string($_POST['login_user']))){
		$this->_SauverInsert();
	}//fin if
	else { 
		echo '<span class="consignes-form">Erreur : S&eacute;lectionner un autre login, celui-ci est d&eacute;j&agrave; utilis&eacute;. Merci</span>';
		}//fin else
				
	if ($this->m_bRequeteValide){
		$this->m_bModeEdition = false;
	}//fin if
}//fin if sauver
Si le login est disponible, les données sont envoyées dans la méthode _sauverInsert(), qui se trouve dans la classe au dessus, qui fait appelle aux méthodes suivantes qui traite la requete SQL (vive l'objet ^^) :
Voila al classe _sauverInsert(); pour ceux qui veulent :
	function _SauverInsert(){
		//Génération de la requête SQL 
		$sRequeteInsert = $this->_GenereSQLInsert();
		//Si aucune erreur de saisie n'a été détéctée -> la requête est valide, execution
		if ($this->m_bRequeteValide) {
			$this->m_nAccesBD->connexion();
			$rResultat = $this->m_nAccesBD->requete($sRequeteInsert);
			$this->m_nAccesBD->deconnexion();
			$this->m_sMessageErreurRequete = 'L\'insertion a bien &eacute;t&eacute; effectu&eacute;e.';// : '.$sRequeteInsert;
		}//fin if
		//Affichage du Resultat de la requete
		echo '<span class="consignes-form">' . $this->m_sMessageErreurRequete . '</span>';
	}
et on revient là :
	//Premiere partie de la requete
	function _GenereSQLInsert(){
	
		//Requete valide
		$this->m_bRequeteValide = true;
		
		//Génération de la requête SQL 
		$sRequete = 'INSERT INTO tsig_usr_agr ("num_user","num_sica", "num_level", "login", "mot_de_pass", "nom_user", "prenom_user", "adresse", "commune", "num_telephone", "e_mail") ';
		//$sRequete2 = 'INSERT INTO tsig_usr_expl_int("num_user","num_level","login","num_pacage")';
			
		$sRequete .= $this->_GenereSQLValues();
		//$sRequete2 .= $this->_GenereSQLValues();
		
		return $sRequete1;
	}//fin fonction	

	//Valeurs à inserer ds la requete
	function _GenereSQLValues(){
		
		/*Recuperation des variables*/
		$gnNumUser = pg_escape_string($_POST['num_user']);
		$gnNumPacage = pg_escape_string($_POST['num_pac']);
		$gnNum_Sica = pg_escape_string($_POST['sica']);
		$gnLogin = pg_escape_string($_POST['login_user']);
		$gnNom_User = pg_escape_string($_POST['nom_user']);		
		$gnPrenom_User = pg_escape_string($_POST['prenom_user']); 
		
		$gnMDP = pg_escape_string($_POST['mpassword']);
		$gnMDP = md5($gnMDP);
		$gnAdresse = pg_escape_string($_POST['adresse']);
		$gnCommune = pg_escape_string($_POST['commune']);		
		$gnNum_Tel = pg_escape_string($_POST['tel']); 	
		$gnE_Mail = pg_escape_string($_POST['mail']);
			
		//Insertion pour la requete 1
		$sRequete .= 'VALUES(';	
		$sRequete .= ' \''.$gnNumUser.'\', ';	
		
		if ($gnNum_Sica !='') {
			$sRequete .= ' \''.$gnNum_Sica.'\', ';
		}else{
			$this->m_bRequeteValide = false;
			$this->m_sMessageErreurRequete = 'Erreur : Avancement : La valeur Numero Sica doit &ecirc;tre saisie';
			return;
		}
		
		//insertion du niveau de level
		$sRequete .= 4 .',' ;	
		
              /* etc. pour les autres champs recupérés, je ne les mets pas pour alléger la présentation du code */

		//Suppression du dernier ', ' en surplus
		$sRequete = substr($sRequete, 0, strlen($sRequete) - 2);
		$sRequete .= ')'; 
		
		//Insertion pour la requete 2
		//$sRequete2 .= 'VALUES(';	
		//$sRequete2 .= ' \''.$gnNumUser.'\', ';	
		//$sRequete2 .= 4 .',' ;
		//if ($gnLogin !='') {
		//	$sRequete2 .= ' \''.$gnLogin.'\', ';
		//}else{
		//	$this->m_bRequeteValide = false;
		//	$this->m_sMessageErreurRequete = 'Erreur : Avancement : Le login doit &ecirc;tre saisie';
		//	return;
		//}
		//$sRequete2 .= '\''.$gnNumPacage.'\',';
		//$sRequete2 = substr($sRequete2, 0, strlen($sRequete2) - 2);
		//$sRequete2 .= ')'; 
		
		//concatenation des requetes
		//$sRequete = $sRequete1.' AND '.$sRequete2;
		return $sRequete;
	}//fin fonction

J ai mis en commentaire ma deuxième requête. J aimerai pouvoir la traiter mais je sais pas trop comment :/. J aimerai surtout éviter de construire une nouvelle méthode pour cette deuxième requête.
Merci de votre aide ^^.
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

05 juin 2008, 17:45

Non une méthode ne renvoie qu'une variable. Il faut réorganiser ton code d'une façon ou d'une autre.

Mammouth du PHP | 1668 Messages

05 juin 2008, 18:04

Vive PostGreSQL !
Il me semble que PDO serait plus adapté pour ça, si non, pourquoi ne fais-tu pas une seul fonction avec une transaction ?
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 443 Messages

05 juin 2008, 21:51

Salut,
Sors les méthodes d'interaction avec SQL de l'objet lui même et fabrique un objet type PersistenceManager. C'est pas une bonne idée de lier tes "data objects" à la base.


Tracker.

Eléphant du PHP | 398 Messages

06 juin 2008, 09:59

J ai pas très bien compris ce que vous me conseillez katagoto et Tracker mais j'ai trouvé une solution,que je ne voulais pas faire à la base, c est de créer une petite méthode pour la deuxième insertion. Les deux requêtes sont séparées du moins.

Code :
	//Fonction qui fait l insertion dans la table intermediaire
	function _SauverInsertIntermd(){
		$this->m_bRequeteValide = true;
		$gnNumUser = pg_escape_string($_POST['num_user']);
		$gnNumPacage = pg_escape_string($_POST['num_pac']);
		$gnLogin = pg_escape_string($_POST['login_user']);
		
		//Construction de la requete
		$sRequete = 'INSERT INTO tsig_usr_expl_int("num_user","num_level","login","num_pacage")';
		$sRequete .= 'VALUES(';	
		$sRequete .= ' \''.$gnNumUser.'\', ';	
		$sRequete .= 4 .',' ;
		if ($gnLogin !='') {
			$sRequete .= ' \''.$gnLogin.'\', ';
		}else{
			$this->m_bRequeteValide = false;
			$this->m_sMessageErreurRequete = 'Erreur : Avancement : Le login doit &ecirc;tre saisie';
			return;
		}
		$sRequete .= '\''.$gnNumPacage.'\'';
		//$sRequete = substr($sRequete, 0, strlen($sRequete) - 2);
		$sRequete .= ')'; 		
		//Traitement de la requete
		$this->m_nAccesBD->connexion();
		$rResultat = $this->m_nAccesBD->requete($sRequete);
		$this->m_nAccesBD->deconnexion();
	}
Ke penses que "Resolu" peut-être mis mais vu que ça ne représente qu'une petite partie de ce que je dois faire, je risques fort de revenir sur ce topic ^^.
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 juin 2008, 10:00

Ke penses que "Resolu" peut-être mis mais vu que ça ne représente qu'une petite partie de ce que je dois faire, je risques fort de revenir sur ce topic ^^.
Ou, encore mieux, tu marques ce sujet comme étant résolu, et si tu as une autre question, tu postes un nouveau sujet en pensant à mettre un lien vers ce sujet ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer