web-dev-qa-db-fra.com

Comment vous connectez-vous à plusieurs bases de données MySQL sur une seule page Web?

J'ai des informations réparties sur quelques bases de données et je souhaite mettre toutes les informations sur une seule page Web à l'aide de PHP. Je me demandais comment je pouvais me connecter à plusieurs bases de données sur une seule page Web PHP.

Je sais comment me connecter à une base de données unique en utilisant:

$dbh = mysql_connect($hostname, $username, $password) 
        or die("Unable to connect to MySQL");

Cependant, puis-je simplement utiliser plusieurs commandes "mysql_connect" pour ouvrir les autres bases de données, et comment PHP peut savoir de quelle base de données je veux que les informations soient extraites si plusieurs bases de données sont connectées.

178
JoshFinnie

Avertissement: Les fonctions mysql_xx sont obsolètes depuis PHP 5.5 et supprimées depuis PHP 7.0 (voir http://php.net/ manual/intro.mysql.php ), utilisez les fonctions mysqli_xx ou voyez la réponse ci-dessous de @Troelskn


Vous pouvez effectuer plusieurs appels à mysql_connect(), mais si les paramètres sont identiques, vous devez indiquer la valeur true pour le paramètre '$new_link' (quatrième), sinon la même connexion est réutilisée. Par exemple:

$dbh1 = mysql_connect($hostname, $username, $password); 
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1);
mysql_select_db('database2', $dbh2);

Ensuite, pour interroger la base de données 1, passez le premier identifiant de lien:

mysql_query('select * from tablename', $dbh1);

et pour la base de données 2, passez le second:

mysql_query('select * from tablename', $dbh2);

Si vous ne transmettez pas d'identificateur de lien, la dernière connexion créée est utilisée (dans ce cas, celle représentée par $dbh2), par exemple:

mysql_query('select * from tablename');

Autres options

Si l'utilisateur MySQL a accès aux deux bases de données et qu'elles se trouvent sur le même hôte (c'est-à-dire que les deux bases de données sont accessibles à partir de la même connexion), vous pouvez:

  • Gardez une connexion ouverte et appelez mysql_select_db() pour permuter entre les deux. Je ne suis pas sûr que ce soit une solution propre et vous pourriez finir par interroger la mauvaise base de données.
  • Spécifiez le nom de la base de données lorsque vous référencez des tables dans vos requêtes (par exemple, SELECT * FROM database2.tablename). Cela risque d’être pénible à mettre en œuvre.

Lisez également la réponse de troelskn, car c’est une meilleure approche si vous pouvez utiliser PDO plutôt que les anciennes extensions.

330
Tom Haigh

Si vous utilisez PHP5 (Et vous devriez, étant donné que PHP4 est obsolète), vous devriez utiliser PDO , car cela devient lentement le nouveau standard. Un avantage (très) important de PDO est qu'il supporte les paramètres liés, ce qui rend le code beaucoup plus sécurisé.

Vous vous connecteriez via PDO, comme ceci:

try {
  $db = new PDO('mysql:dbname=databasename;Host=127.0.0.1', 'username', 'password');
} catch (PDOException $ex) {
  echo 'Connection failed: ' . $ex->getMessage();
}

(Bien sûr, remplacez le nom de la base de données, le nom d'utilisateur et le mot de passe ci-dessus)

Vous pouvez alors interroger la base de données comme ceci:

$result = $db->query("select * from tablename");
foreach ($result as $row) {
  echo $row['foo'] . "\n";
}

Ou, si vous avez des variables:

$stmt = $db->prepare("select * from tablename where id = :id");
$stmt->execute(array(':id' => 42));
$row = $stmt->fetch();

Si vous avez besoin de plusieurs connexions ouvertes à la fois, vous pouvez simplement créer plusieurs instances de PDO:

try {
  $db1 = new PDO('mysql:dbname=databas1;Host=127.0.0.1', 'username', 'password');
  $db2 = new PDO('mysql:dbname=databas2;Host=127.0.0.1', 'username', 'password');
} catch (PDOException $ex) {
  echo 'Connection failed: ' . $ex->getMessage();
}
96
troelskn

Je viens de rendre ma vie simple:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

j'espère que c'est utile ... à la vôtre ...

9
Ihsan Kusasi

Au lieu de mysql_connect utilisez mysqli_connect .

mysqli fournit une fonctionnalité permettant de connecter plusieurs bases de données à la fois.

$Db1 = new mysqli($hostname,$username,$password,$db_name1); 
// this is connection 1 for DB 1

$Db2 = new mysqli($hostname,$username,$password,$db_name2); 
// this is connection 2 for DB 2
6
kaushik

Essayez ci-dessous le code:

    $conn = mysql_connect("hostname","username","password");
    mysql_select_db("db1",$conn);
    mysql_select_db("db2",$conn);

    $query1 = "SELECT * FROM db1.table";
    $query2 = "SELECT * FROM db2.table";

Vous pouvez récupérer les données de la requête ci-dessus à partir de la base de données ci-dessous

$rs = mysql_query($query1);
while($row = mysql_fetch_assoc($rs)) {
    $data1[] = $row;
}

$rs = mysql_query($query2);
while($row = mysql_fetch_assoc($rs)) {
    $data2[] = $row;
}

print_r($data1);
print_r($data2);
4
Paks

À moins que vous n'ayez vraiment besoin de plusieurs instances d'un objet PDO, tenez compte des points suivants:

$con = new PDO('mysql:Host=localhost', $username, $password, 
      array(PDO::ATTR_PERSISTENT => true));

Notez l'absence de dbname= dans les arguments de construction.

Lorsque vous vous connectez à MySQL via un terminal ou un autre outil, vous n'avez pas besoin du nom de la base de données. Vous pouvez passer d'une base de données à l'autre à l'aide de l'instruction USE dbname via la méthode PDO::exec().

$con->exec("USE someDatabase");
$con->exec("USE anotherDatabase");

Bien sûr, vous voudrez peut-être envelopper ceci dans une déclaration catch try.

3
Michael Ratcliffe
$dbh1 = mysql_connect($hostname, $username, $password);  
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1); 
mysql_select_db('database2',$dbh2); 

mysql_query('select * from tablename', $dbh1);
mysql_query('select * from tablename', $dbh2);

C’est la solution la plus évidente que j’utilise, mais rappelez-vous que si le nom d’utilisateur/mot de passe de la base de données est identique dans le même hôte, cette solution utilisera toujours la première connexion. Alors ne soyez pas confus que cela ne fonctionne pas dans un tel cas. Ce que vous devez faire est de créer 2 utilisateurs différents pour les 2 bases de données et cela fonctionnera.

2
Lazy Fellow

Vous pourrez peut-être utiliser la syntaxe MySQLi, ce qui vous permettrait de mieux la gérer.

Définissez les connexions à la base de données, puis, chaque fois que vous souhaitez interroger l'une des bases de données, spécifiez la bonne connexion.

Par exemple.:

$Db1 = new mysqli('$DB_Host','USERNAME','PASSWORD'); // 1st database connection 
$Db2 = new mysqli('$DB_Host','USERNAME','PASSWORD'); // 2nd database connection

Ensuite, pour les interroger sur la même page, utilisez quelque chose comme:

$query = $Db1->query("select * from tablename")
$query2 = $Db2->query("select * from tablename")
die("$Db1->error");

Passer à MySQLi de cette façon vous aidera.

2
user3857891

Vous n'avez pas réellement besoin de select_db. Vous pouvez envoyer une requête à deux bases de données simultanément. Tout d'abord, accordez une autorisation à DB1 pour sélectionner DB2 par GRANT select ON DB2.* TO DB1@localhost;. Ensuite, FLUSH PRIVILEGES;. Enfin, vous pouvez faire une 'requête sur plusieurs bases de données' comme SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2 etc. (n'oubliez pas qu'il vous faut un accès 'root' pour utiliser la commande grant)

2
Nagibaba

si vous utilisez mysqli et avez deux fichiers db_connection. comme le premier est

define('Host','localhost');
define('USER','user');
define('PASS','passs');
define('**DB1**','database_name1');

$connMitra = new mysqli(Host, USER, PASS, **DB1**);

le second est

    define('Host','localhost');
    define('USER','user');
    define('PASS','passs');
    define(**'DB2**','database_name1');

    $connMitra = new mysqli(Host, USER, PASS, **DB2**);

SO suffit de changer le nom du paramètre pass dans mysqli comme DB1 et DB2. Si vous transmettez le même paramètre dans mysqli, supposons que DB1 soit dans les deux fichiers, la seconde base de données ne se connectera plus. Donc rappelez-vous lorsque vous utilisez deux connexions ou plus, passez un nom de paramètre différent dans la fonction mysqli

1
Kamal Bunkar
<?php
    // Sapan Mohanty
    // Skype:sapan.mohannty
    //***********************************
    $oldData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
    echo mysql_error();
    $NewData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
    echo mysql_error();
    mysql_select_db('OLDDBNAME', $oldData );
    mysql_select_db('NEWDBNAME', $NewData );
    $getAllTablesName    = "SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'";
    $getAllTablesNameExe = mysql_query($getAllTablesName);
    //echo mysql_error();
    while ($dataTableName = mysql_fetch_object($getAllTablesNameExe)) {

        $oldDataCount       = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $oldData);
        $oldDataCountResult = mysql_fetch_object($oldDataCount);


        $newDataCount       = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $NewData);
        $newDataCountResult = mysql_fetch_object($newDataCount);

        if ( $oldDataCountResult->noOfRecord != $newDataCountResult->noOfRecord ) {
            echo "<br/><b>" . $dataTableName->table_name . "</b>";
            echo " | Old: " . $oldDataCountResult->noOfRecord;
            echo " | New: " . $newDataCountResult->noOfRecord;

            if ($oldDataCountResult->noOfRecord < $newDataCountResult->noOfRecord) {
                echo " | <font color='green'>*</font>";

            } else {
                echo " | <font color='red'>*</font>";
            }

            echo "<br/>----------------------------------------";

        }     

    }
    ?>
0
Sapan Mohanty