Menu

[SQL] Requète SQL impliquant 2 bases de donne [Résolu/Fermé]

Messages postés
410
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
5 décembre 2009
- - Dernière réponse :  anonyme - 19 juin 2013 à 16:58
Bonjour à tous et toutes,

J'aurais aimé savoir s'il était possible de faire des requètes SQL sur 2 bases de donnees distinctes du genre :

mysql_connect('localhost','root','');
mysql_select_db('DB1');
mysql_select_db('DB2');

$test = mysql_query("SELECT DB1.champ1.id, DB2.champ2.acc_number FROM DB1.champ1,DB2.champ2 WHERE DB1.champ1.exemple=DB2.champ2.exemple");



J'ai essayé et ça marche pas :(
Je précise que pour l'instant les 2 bases de donnees sont sur le même serveur avec le même root et le même mot de passe (enfin en local, avec root et sans mot de passe quoi...)

D'avance merci
Edit : Au fait je tourne sous mysql, désolé d'avoir oublié de le préciser
Afficher la suite 

12 réponses

Meilleure réponse
14
Merci
C'est bien migon votre querelle de clocher à 2 balles ... mais la réponse à la question initiale : elle est où.
Vous semblez fort intelligents, limite incollables, alors montrez et expliquez, communiquez à la communauté votre savoir, au lieu de vous foutre dessus.
J'ai le même souci que sly-bzh et je vourais la suite. De plus, je suis maxi-pressé (et également Breton d'origine !!).
En tout cas, votre baston est drôle pour les visiteurs.
Merci d'expliquer vos affirmations, contraintes de sécurité éventuelles, et scripts (le luxe ...).

Dire « Merci » 14

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM a aidé 34313 internautes ce mois-ci

4
Merci
Ca n'a rien avoir directement avec ce post, sauf que je suis tombée dessus quand je cherchais ma solution et ça m'a aidé pour débuter mon code.
Je souhaitais comparer deux bases de données qui ont la meme structure mais avec des données différentes avec PHP / MYSQL.

En espèrant que ça puisse vous servir:
Vous devez seulement changer

$mysqlServer = "localhost";
$mysqlUser = "adminsql";
$mysqlPassword = "";
$mysqlBase1 = "NomBase1";
$mysqlBase2 = "NomBase2";


Voici le code:

<?
$mysqlServer = "localhost";
$mysqlUser = "adminsql";
$mysqlPassword = "";


$mysqlBase1 = "NomBase1";
$mysqlBase2 = "NomBase2";




$defaultConnexion = mysql_connect($mysqlServer, $mysqlUser, $mysqlPassword)
or die("Impossible de se connecter au serveur ".$mysqlServer." avec le user ".$mysqlUser.". Essayez de vous reconnecter.");





//NOM BDD 1

// On selectionne la base par defaut
mysql_select_db($mysqlBase1, $defaultConnexion)
or die("Impossible de selectionner la base par defaut ".$mysqlBase1);

//NOM BDD 2

mysql_select_db($mysqlBase2, $defaultConnexion)
or die("Impossible de selectionner la base par defaut ".$mysqlBase2);

/////////////////////////////////////////
//POUR CHAQUE TABLE
/////////////////////////////////////////
$mysql_resultTable = mysql_query("SHOW TABLES;",$defaultConnexion);
//prendre chaque rangée
while ($ligneTable = mysql_fetch_row($mysql_resultTable))
{
// afficher le nom d'une table
$table=$ligneTable[0];






/////////////////////////////////////////
//POUR CHAQUE COLONNE -> liste colonnes et clef
/////////////////////////////////////////

//lISTES COLONNES
$listeColonnes=array();
$listeClef=array();
//liste des champs

$resultColonne = mysql_query("SHOW COLUMNS FROM ".$table."");
if (!$resultColonne)
{
echo 'Impossible d\'exécuter la requête : ' . mysql_error(); exit;
}
if (mysql_num_rows($resultColonne) > 0)
{
while ($rowColonne = mysql_fetch_assoc($resultColonne))
{
$listeColonnes[count($listeColonnes)]=$rowColonne['Field'];

if($rowColonne['Key']=='PRI')
{
$listeClef[count($listeClef)]=$rowColonne['Field'];
//echo "Table".$table." clef".$rowColonne['Field']."</br>";
}
}
}

//prendre données d'une table de la première base
$sqlDonnes="SELECT * FROM ".$mysqlBase1.".".$table."";
//echo $sql;
$mysql_resultDonnees = mysql_query($sqlDonnes) ;
/////////////////////////////////////////
//POUR CHAQUE LIGNE D'UNE TABLE D'UNE DES BASES
/////////////////////////////////////////
//prendre chaque rangée
while ($ligneDonnes = mysql_fetch_array($mysql_resultDonnees))
{
$difference="";
// print($ligne["idCritere"]);
$requeteCompare="SELECT * FROM ".$mysqlBase2.".".$table." ";

$clefs="";
for($countclef=0;$countclef<count($listeClef);$countclef++)
{
if($countclef==0)
{
$requeteCompare.= "WHERE ";
}
else
{
$requeteCompare.= " AND ";
}

$clefs.=" ".$listeClef[$countclef].": ".$ligneDonnes[$listeClef[$countclef]]." ";
$requeteCompare.= "".$mysqlBase2.".".$table.".".$listeClef[$countclef]."='".$ligneDonnes[$listeClef[$countclef]]."'";
}//fin boucle clefs
// echo $requeteCompare."</br>";

/////////////////////////////////////////
//POUR CHAQUE LIGNE D'UNE TABLE D'UNE DES BASES COMPARER AVEC LES DONNES DE LA DEUXIEME
/////////////////////////////////////////
$mysql_result2 = mysql_query($requeteCompare);
while ($ligne2 = mysql_fetch_array($mysql_result2))
{
for ($listeColonnescount=0 ; $listeColonnescount<count($listeColonnes) ; $listeColonnescount++)
{
if( $ligne2[$listeColonnes[$listeColonnescount]]!=$ligneDonnes[$listeColonnes[$listeColonnescount]])
{

$difference.="<strong>Colonne</strong> ".$listeColonnes[$listeColonnescount]."<strong> : Base</strong> '".$mysqlBase2."'<strong>:(</strong> ".$ligne2[$listeColonnes[$listeColonnescount]]." <strong>)- Base </strong> '".$mysqlBase1."'<strong>: ( </strong> ".$ligneDonnes[$listeColonnes[$listeColonnescount]].")</br>";
}
}

if($difference!="")
{
echo "<strong>Table</strong> '".$table."' <strong>differences pour clefs</strong> '".$clefs."' <strong>:</strong></br>".$difference." </br>";
}
}
}

}//fin table

?>
Messages postés
69
Date d'inscription
jeudi 6 novembre 2008
Dernière intervention
22 novembre 2010
3
Merci
Bonjour je confirme il est possible d'utiliser 2 base sql dans une même requet

si je me trompe pas

SELECT * FROM `base1`, `base2` HERE `bob=$variable`

*=tous
0
Merci
normal, Mysql n'est pas multibases :) Tu ne peut pas sélectionner deux bases en même temps :)
Messages postés
410
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
5 décembre 2009
0
Merci
Alors désolé de te contredire mais après avoir réessayé (et oui je suis BRETON moi, on me fais pas lacher comme ça xD), ça marche parfaitement. J'avais du faire une faute de frappe ou une connerie comme ça.

Mais mercid'avoir essayé de me répondre, même si en l'occurence, quand on ne sait pas on ne répond pas... J'aurais été Français [;)] j'aurais pu être découragé par ton post et abandonné.

Merci quand même...
0
Merci
euh, je te confirme qu'un serveur Mysql 4X est bien multi thread, mais pas multicast, tu perds ton temps ma couille...
http://www.mysql.com/wiki
Le seul moyen est de séparer les requêtes tables par tâbles, mais la sécurité d'un serveur ne t'autorisera de toutes les façons jamais sur un serveur d'exploitation à linker plusieures bases ensemble, c'est tout le temps désactivé par défaut par les administrateurs pour éviter la propagation d'infections par injections mysql... CQFD... Tu en veut une autre couche ?
pauvre con
Messages postés
410
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
5 décembre 2009
0
Merci
Alors ma couille, en l'occurence je m'en contrebalance le coquillard des injections SQL puisque ma question n'était pas là. Et le serveur c'est moi qui le dirige et pas l'inverse !!!!
De toute façon comme je l'ai dit je suis en local. Peut-être ne me suis je pas bien exprimé mais je voulais récupérer des donnees liées des 2 bases pour updater la première... Donc les problèmes de sécurité, queud'chik !!!


Toujours est-il que je l'ai utilisé une bonne dizaine de fois dans la dernière demi-heure et que je compte continuer à l'utiliser, même si comme tu le fais injustement remarquer, ça ne peux pas fonctionner :D

Bonne journée!!!
0
Merci
Ce n'est pas parceque ta voiture va vite que tu es obligé de dépasser tout le temps les limitations de vitesse ?!
Ce n'est pas parceque le système ne te l'interdit pas que tu dois forcément outrepasser les limites du système...
Ce n'est pas parceque tu fais des conneries que c'est la bonne méthode...
En gros, je persiste et je signe, tu essayes de faire monter en courrant léverest à un escargot... C'est possible, c'est sûr, mais je doute des performances ti vois là :)
Ce n'est pas parceque tu es intelligent que tu ne fera pas de grosses conneries :)
Fais donc ce que l'on te dis, et tu verras, qu'en séparant tes requettes, non seulement tu restera compatible avec les serveurs Web, mais de plus, tes requêtes seront nettement plus rapides et ne mettrons pas au taquet les ressources propres du serveur pour faire plaisir à monsieur qui s'obstine à tuer un mouton avec un cure dent :)
++
Messages postés
410
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
5 décembre 2009
0
Merci
Eh l'autre, on sait tous qu'un escargot ça n'a pas de jambe donc ça peut pas courir...
Et mon script il marche puisqu'il PEUT le faire. Du moment que mysql PEUT le faire, c'est que moi je peux demander à mysql de le faire.
Enfin bref j'en ai terminé avec ça donc voila, je l'ai fait et puis c'est tout !
Messages postés
410
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
5 décembre 2009
0
Merci
Oula, mais c'est que ça date tout ça... Presque 9 mois quand même.

Pour ta question, la réponse se situe dans ma réponse à moi même. Si je me rappelle bien le script qui est dans la question fonctionne.
Après, tout dépend de ce que tu veux faire avec. Moi j'en avais besoin pour "jouer" en local avec 2 bases de données que je voulais regrouper en une seule. Dans ce cas là, pas de problème, lance toi.

Maintenant ,si tu veux le faire en routine sur un site, c'est vrai que ce n'est probablement pas la solution idéale. Comme le disais anonyme20080208, ça bouffe de la puissance à plein régime et niveau sécurité c'est vraiment pas le pied.
D'autant qu'aujourd'hui, avec 9 mois de recul, il me semble que ce ne doit pas être super compliqué de faire 2 requêtes qui te boufferont moins de mémoire (toujours diviser pour mieux régner) et qui de plus laisseront moins de possibilités de hacking.

J'espère que ça te suffira comme réponse.
Messages postés
52
Date d'inscription
mardi 23 mars 2010
Dernière intervention
29 décembre 2014
0
Merci
bjr,
est ce qu'il est possible dinserer les données dans lé deux table au meme temps????
0
Merci
Bonjour, comment pourrais-je modifier mon code pour pouvoir faire d'autres requêtes sur d'autre bases de données .

Mon code est dans un fichier nommé "sql.php" que j'inclue dans mon "header" , il ne me reste plus qu'a faire mes requêtes sur les pages voulu et ça marche super.

Le problème qui se pose a moi maintenant c'est que je dois utiliser 2 autres base de données et je ne sais pas trop comment adapté voir simplifier mon code.

J'ai tenter d'ajouter les lignes ci dessous pour prendre en compte mes base de données 2 et 3 :
mysql_select_db($db_table2, $connexion);
mysql_select_db($db_table3, $connexion);


Apparemment ce n'est pas suffisant , quelqu'un qui maitrise la chose pourrait-il m'apporter la solution ?

voici mon code qui fonctionne avec ma première base de données :

<? session_start(); ?>
<?
/* Fichier include SQL : fonctions SQL */
/* CONSTANTES ******************************************* */
$db_host = "AAAA";//host
$db_user = "BBBB";//Login SQL
$db_pass = "CCCC";//Mot de passe SQL
$db_table = "data1";//database
$db_table2 = "data2";//database 2
$db_table3 = "data3";//database 3
$ip = "xxxx"; // localhost 
$port = "yyyy"; // port utiliser par le Login Server
$port2 = "zzzz"; // port utiliser par le Game Server
/* ****************************************************** */
/* Procédure d'appel à la base de données */

$error = true;
$attempts = 1;
while ($error && ($attempts>0)) {
	$connexion = mysql_connect($db_host,$db_user,$db_pass);
	$error = (!$connexion || mysql_errno($connexion)!=0);
	$attempts--;
		echo mysql_error();
		}

if ($error) {
exit();
	}
	
	mysql_select_db($db_table, $connexion);

	
	if (@mysql_errno($mySQLServer)!=0) { 
		print("Erreur sur la base de données +" .mysql_error($connexion));
		exit();
	}
//	return $resultat;
//}
/* ****************************************************** */
//echo phpinfo();

function query($req) {
	global $connexion;
	$rub = mysql_query($req, $connexion);
	$arr = array();
	$i=0;
	
	while ($cal = mysql_fetch_array($rub)) {
		
		$arr[$i] = $cal;
		$i++;		
		
	}
	return $arr;	
}
?>