Page 1 sur 1

interroger plusieurs bases de données

Posté : 25 oct. 2016, 09:47
par lucafone
j'ai un fichier de type :
require(dirname(__FILE__).'/../../portail/admin/infobase1.php');
$database = mysql_connect($DBserver,$DBuser,$DBpassword) or die("Impossible de se connecter : " . mysql_error());
$select_base = mysql_select_db($DBdatabase,$database) or die("Impossible de se connecter à la base ".$DBdatabase." : " . mysql_error());
j'aimerais d'autres tables de type
require(dirname(__FILE__).'/../../portail/admin/infobase1.php');
require(dirname(__FILE__).'/../../portail/admin/infobase2.php');
require(dirname(__FILE__).'/../../portail/admin/infobase3.php');
require(dirname(__FILE__).'/../../portail/admin/infobase4.php');

$database = mysql_connect($DBserver,$DBuser,$DBpassword) or die("Impossible de se connecter : " . mysql_error());
$select_base = mysql_select_db($DBdatabase,$database) or die("Impossible de se connecter à la base ".$DBdatabase." : " . mysql_error());
comment proceder ?
merci d'avance

Re: interroger plusieurs bases de données

Posté : 25 oct. 2016, 09:57
par moogli
BONJOUR

quel est le problème ?
tu sais te connecter à une base de données rien ne t’empêche de le faire sur 4 ;)
bien sur il faudra nommer autrement les variables pour éviter les collisions.
Tu peux aussi mettre toutes les informations dans un seul fichier, perso j'utiliserais un fichier de configuration (type conf clef valeur, json, yml ou autre) pour simplifier la saisie de celle ci. ensuite tu peux facilement créer une fonction qui te retourne une connexion mysql en fonction des paramètres qui lui sont passés.

bien entendu il te faudra utiliser le second paramètre (optionnel) des fonctions comme mysql_query (pour mysqli il est obligatoire du coup tu n'as pas cet oublie ;) ).

Au passage l'extension mysql à était supprimée avec php7 (et indiquée comme dépréciée depuis php 5.5.0 qui date du 19-Jun-2013) il est temps d'utiliser mysqli ou PDO ;)

@+

Re: interroger plusieurs bases de données

Posté : 25 oct. 2016, 11:01
par lucafone
decidement tu es partout ! :)
les bases que j'interroge on exactement la même configuration. ( prestashop )

j'ai tester j'arrive pas a chopper 2 tables

Re: interroger plusieurs bases de données

Posté : 25 oct. 2016, 11:09
par moogli
je sais tout faire :green:

tu as fait comment ?
j'veux du vrai code ;)

Les bases ont toute une différence au moins (url, utilisateur, mot de passe différents etc).
et c'est qu'est le discriminant.
la structure après c'est autres choses. si c'est identique tant mieux cela va te permettre d'avoir des fonctions / objets génériques au quel tu n'as plus qu'a passer la ressource de connexion pour obtenir les résultats de chaque base ;)

@+

Re: interroger plusieurs bases de données

Posté : 25 oct. 2016, 11:20
par lucafone
Pour faire simple :-D
y a exactement le meme mot de passe et user.
<?php


require(dirname(__FILE__).'/infobase-sites.php');


//Ouverture de la base

$database = mysql_connect($DBserver,$DBuser,$DBpassword) or die("Impossible de se connecter : " . mysql_error());

$select_base = mysql_select_db($DBdatabase,$database) or die("Impossible de se connecter à la base ".$DBdatabase." : " . mysql_error());
$select_base2 = mysql_select_db($DBdatabase2,$database) or die("Impossible de se connecter à la base ".$DBdatabase2." : " . mysql_error());

Re: interroger plusieurs bases de données

Posté : 25 oct. 2016, 15:21
par moogli
ouch ça pique :-)
<?php
$database = mysql_connect($DBserver,$DBuser,$DBpassword) or die("Impossible de se connecter : " . mysql_error());

$select_base = mysql_select_db($DBdatabase,$database) or die("Impossible de se connecter à la base ".$DBdatabase." : " . mysql_error());
$select_base2 = mysql_select_db($DBdatabase2,$database) or die("Impossible de se connecter à la base ".$DBdatabase2." : " . mysql_error());
$DBdatabase(1|2|3...) ça vient du fichier inclus ?

ce que je t'ai indiqué
$requete = mysql_query('select blbalbla from tables where xxx=yyy', $laconnexion_mysql)

mais je crois que l'on ne s'est pas bien compris.

Tu as une base de données et plusieurs schéma appartenant au même utilisateur ? et pas plusieurs bases avec des informations de connexion différentes (genre plusieures bases physiques).

Dans ce cas t'emmerde pas avec les connexions et préfixe le nom de la table par le schéma

select x,y,z from leschema.latable where ....

parce que la ton code va toujours utiliser le même schéma (le dernier sélectionnée).

sinon faut que tu changes le schéma avant chaque requête, cela inclus surement aussi que tu ais récupéré les données avant (a voir) et pense au mysql_free_result !

si j'ai bien compris les requêtes sont réalisées a partir d'info de la précédente ?
Dans ce cas regarde si tu peux faire des jointures inter schéma (jamais testé je sais même pas si c'est possible).

sinon utilise au moins des requêtes préparées afin de gagner un peu en performance (et c'est une très, très bonne raison pour suivre la remarque si dessous ;) )

et change de driver mysql vindiou !!!! :green:


dernière chose, il faudrait p'tet mettre certain chose dans des fonctions utilitaires parce que c'est pas simple a lire.

tu dois pouvoir aussi faire l'insertion dans le fichier dans le while plutôt qu'après (en fait la où tu alimentes le tableau $lignes.) tu gagneras la aussi un peu en perf mais surtout en complexité du code (au final il sert à rien le dernier foreach) .

@+

Re: interroger plusieurs bases de données

Posté : 25 oct. 2016, 15:43
par lucafone
oui exactement ca vient du fichier inclus
j'ai 8 bases a interrogé. je recupere les commandes journaliere.


j'avais dans le FROM
FROM $database2.ps_orders, $database.ps_orders,
JOIN ps_customer  ON  ps_orders.id_customer= ps_customer.id_customer
JOIN ps_lang AS LANG_ORDER ON ps_orders.id_lang=LANG_ORDER.id_lang
LEFT JOIN ps_message  ON  ps_message.id_order= ps_orders.id_order

Re: interroger plusieurs bases de données

Posté : 26 oct. 2016, 09:24
par moogli
8 schémas :)

il faut que tu alias les tables pour le moteur ne se perdent pas au milieu de tous ça.
tu l'as une fois il faut le faire pour toutes les tables c'est plus simple, sinon remettre le schéma devant a chaque fois.
parce que la on ne sais de quel schéma vient ps_customer du coup il va prendre celle du schéma de connexion et il y a de grande change pour la jointure foire avec la table ps_orders d'un autre schéma (problème d'intégrité).

tu peux alléger un peu la syntaxe SQL
JOIN ps_customer ON ps_orders.id_customer= ps_customer.id_customer
devient
JOIN ps_customer using(id_customer)

parce que la colonne est la même dans les deux tables. c'est plus simple à lire (et donc comprendre).

C'est quoi le but final ?
si c'est d'avoir toutes les lignes de commandes de tous les schéma je te conseil plutôt l'union SQL
select ... from ....
union
select ... from ....
union
select ... from ....

seule restriction il faut exactement les mêmes colonnes (enfin les nom et type donc au pire tu alias ;) ).

si tu souhaites connaitre l'origine de la donnée c'est simple tu ajoutes une colonne en dure avec le nom du schéma.
select, c1,c2, ..., cx, 'schéma 1' as sch from table join autretable using(laPK) where cequetuveux='bidulle'
test ta requête dans un client sql (phpmyadmin, heidisql, mysql workbench ou ce que tu veux) tu va gagner du temps (suppression de l'insertitude de la créatin dynamique de la requête) et quand elle fonctionne comme tu le souhaites tu l'utilise dans ton code php ;)

@+

Re: interroger plusieurs bases de données

Posté : 26 oct. 2016, 10:18
par lucafone
C'est quoi le but final ?
si c'est d'avoir toutes les lignes de commandes de tous les schéma je te conseil plutôt l'union SQL
select ... from ....
union
select ... from ....
union
select ... from ....
Pas mal ca, je pense que c'est ce que je veux :-D
comment le gerer du coup ? avec une autre base de donnée ?

merci pour tes reponses en tout cas. c'est sympas de prendre le temps de repondre

Re: interroger plusieurs bases de données

Posté : 26 oct. 2016, 11:42
par moogli
tu dupliques la requête en refixant les tabels avec le nom du schéma.
le mieux pour cela c'est un tableau avec les noms des schémas tu boucles dessus pour construire dynamiquement la requête.
une truc dans le genre
<?php
$schemas = ['s1','s2'];
$sql = '';
foreach ($schemas as $index => $s) {
  if($index > 0){
    // saut de ligne plutôt que des espaces parce que sinon c'est moche à lire quand tu l'affiche pour debug
    $sql .= PHP_EOL.'union'.PHP_EOL;
  }
  $sql .= <<<sql
  select c1,c2,cx, {$s} as 'schema' from {$s}.laTable join {$s}.talejointe using(lacolonneDesdeuxTable) where c28 = 'toto'
sql;
}

// op y a une requête sql identique sur x schemas qui devrait avoir tes données
@+