[SQL] Requète SQL impliquant 2 bases de donne

Résolu/Fermé
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 - 6 févr. 2008 à 14:06
 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
A voir également:

12 réponses

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 ...).
15
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

?>
4
toxi Messages postés 69 Date d'inscription jeudi 6 novembre 2008 Statut Membre Dernière intervention 22 novembre 2010 15
13 nov. 2008 à 16:16
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
3
Utilisateur anonyme
6 févr. 2008 à 14:11
normal, Mysql n'est pas multibases :) Tu ne peut pas sélectionner deux bases en même temps :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
6 févr. 2008 à 14:39
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
Utilisateur anonyme
6 févr. 2008 à 15:26
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 ?
0
pauvre con
0
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
6 févr. 2008 à 16:11
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
Utilisateur anonyme
7 févr. 2008 à 11:41
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 :)
++
0
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
7 févr. 2008 à 13:04
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 !
0
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
30 oct. 2008 à 22:52
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.
0
smile88 Messages postés 51 Date d'inscription mardi 23 mars 2010 Statut Membre Dernière intervention 29 décembre 2014 3
10 avril 2010 à 00:13
bjr,
est ce qu'il est possible dinserer les données dans lé deux table au meme temps????
0
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;	
}
?>
0