आप किसी एकल वेबपृष्ठ पर एकाधिक MySQL डेटाबेस से कैसे जुड़ सकते हैं?


179

मेरे पास कुछ डेटाबेस में जानकारी फैली हुई है और PHP का उपयोग करके सारी जानकारी एक वेबपेज पर डालना चाहते हैं। मैं सोच रहा था कि मैं एक ही PHP वेबपेज पर कई डेटाबेस से कैसे जुड़ सकता हूं।

मुझे पता है कि कैसे एक एकल डेटाबेस से कनेक्ट करना है:

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

हालाँकि, क्या मैं अन्य डेटाबेस को खोलने के लिए कई "mysql_connect" कमांड का उपयोग कर सकता हूं, और पीएचपी को कैसे पता चलेगा कि मुझे क्या डेटाबेस चाहिए जिससे अगर मैं एकाधिक डेटाबेस जुड़ा हुआ हूं

जवाबों:


335

चेतावनी: mysql_xx फ़ंक्शन php 5.5 के बाद से हटाए गए हैं और php 7.0 के बाद से हटा दिए गए हैं ( http://php.net/manual/intro.mysql.php देखें ), mysqli_xxफ़ंक्शन का उपयोग करें या @Troelskn से नीचे का उत्तर देखें


आप कई कॉल कर सकते हैं mysql_connect(), लेकिन यदि पैरामीटर समान हैं, तो आपको ' $new_link' (चौथे) पैरामीटर के लिए सही पास करने की आवश्यकता है , अन्यथा उसी कनेक्शन का पुन: उपयोग किया जाता है। उदाहरण के लिए:

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

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

फिर क्वेरी डेटाबेस 1 के लिए पहला लिंक पहचानकर्ता पास करें:

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

और डेटाबेस 2 के लिए दूसरा पास करें:

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

यदि आप एक लिंक पहचानकर्ता को पास नहीं करते हैं, तो बनाया गया अंतिम कनेक्शन का उपयोग किया जाता है (इस मामले में जिसका प्रतिनिधित्व किया जाता है $dbh2) जैसे:

mysql_query('select * from tablename');

अन्य विकल्प

यदि MySQL उपयोगकर्ता के पास दोनों डेटाबेस तक पहुँच है और वे एक ही होस्ट पर हैं (यानी दोनों DBs एक ही कनेक्शन से सुलभ हैं) आप कर सकते हैं:

  • एक कनेक्शन खुला रखें और mysql_select_db()आवश्यकतानुसार बीच में स्वैप करें । मुझे यकीन नहीं है कि यह एक साफ समाधान है और आप गलत डेटाबेस को समाप्त कर सकते हैं।
  • डेटाबेस का नाम निर्दिष्ट करें जब आप अपने प्रश्नों (जैसे SELECT * FROM database2.tablename) के भीतर तालिकाओं का संदर्भ देते हैं । इसे लागू करने के लिए एक दर्द होने की संभावना है।

कृपया ट्रोलेंशकन के जवाब को भी पढ़ें क्योंकि यदि आप पुराने एक्सटेंशन के बजाय पीडीओ का उपयोग करने में सक्षम हैं तो यह एक बेहतर तरीका है।


2
+1 इस समाधान ने मेरे लिए काम किया। डिबगिंग के दो दिनों के बाद क्यों मेरे कस्टम वर्डप्रेस टेम्प्लेट दूसरे डेटाबेस कनेक्शन के कॉल के बाद $ WP_Query ऑब्जेक्ट तक पहुंच खो रहे थे ...
एडी बी

क्या उनमें से एक को डिफ़ॉल्ट के रूप में सेट करना संभव है, और केवल आवश्यकता होने पर $dbh2दूसरे के लिए जोड़ना है ? काम करने के लिए इस दृष्टिकोण के लिए सभी प्रश्नों को बदलने के लिए शायद उन सभी को खोजने में दिन लगेंगे ...
थॉमसके

@ThomasK, आप एक फंक्शन में mysql_query को डिफॉल्ट पैरामीटर के साथ लपेट सकते हैं, कह सकते हैं, db_query($query,$db='db1')और फिर अपने सभी पुराने प्रश्नों को बड़े पैमाने पर अपडेट कर सकते हैं, db_query($query)इसके बाद अपने गैर-डिफॉल्ट को कस्टम अपडेट करकेdb_query($query,'db2')
joshuahedlund

आपकी पद्धति का उपयोग करते हुए, यदि मैं दो कनेक्शनों को परिभाषित करता हूं, तो किस कनेक्शन का उपयोग किया जाएगा, लेकिन यह निर्दिष्ट न करें कि क्वेरी में किस कनेक्शन का उपयोग करना है?
पीटर

1
@Peter: के अनुसार php.net/manual/en/function.mysql-query.php :If the link identifier is not specified, the last link opened by mysql_connect() is assumed.
टॉम हैग

97

यदि आप PHP5 का उपयोग करते हैं (और आपको चाहिए कि, PHP4 को हटा दिया गया है), तो आपको पीडीओ का उपयोग करना चाहिए , क्योंकि यह धीरे-धीरे नया मानक बन रहा है। पीडीओ का एक (बहुत) महत्वपूर्ण लाभ यह है कि यह बाध्य मापदंडों का समर्थन करता है, जो बहुत अधिक सुरक्षित कोड बनाता है।

आप इस तरह से पीडीओ से जुड़ेंगे:

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

(निश्चित रूप से उपर्युक्त डेटाबेसन, यूज़रनेम और पासवर्ड बदलें)

फिर आप डेटाबेस को इस तरह से क्वेरी कर सकते हैं:

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

या, यदि आपके पास चर हैं:

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

यदि आपको एक साथ कई कनेक्शन खोलने की आवश्यकता है, तो आप पीडीओ के कई उदाहरण बना सकते हैं:

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();
}

5
यह जवाब शीर्ष पर क्यों नहीं है ?! यह इसके बारे में जाने का सही तरीका है।
आदित्य सांसद

10
@ मेरी राय में, कुछ करने का सही तरीका अक्सर सवाल का सही जवाब नहीं होता है। एस्कर अपने प्रश्न में पीडीओ का उपयोग नहीं कर रहा था, लेकिन मूल निवासी mysql फ़ंक्शन का उपयोग कर रहा है, इसलिए मुझे विश्वास है कि सबसे उपयुक्त उत्तर पूछने वाले कोड का पालन करेंगे।
जोनाथन डॉस सैंटोस

2
@adityamenon किसके अधिकार में है? याद रखें कि उपयोगकर्ता हमेशा सही होता है ... पीडीओ सबसे अच्छा तरीका है, लेकिन दोनों ही तरीके उपयोगकर्ताओं की समस्या को हल करने का सही तरीका है। कृपया सही और सर्वश्रेष्ठ के बीच अंतर पर ध्यान दें। हाँ ... मैं ऊब गया हूँ इसलिए मुझे एक बयान देना था।
जस्टिनकेज़

क्या $ db1 और $ db2 कई mysql कनेक्शन का प्रतिनिधित्व करते हैं? यदि हां, तो यह अच्छा नहीं है। क्या सिर्फ एक कनेक्शन के साथ कई डेटाबेस को समायोजित करने का कोई तरीका है?
datasn.io

@kavoir आप ऐसा क्यों चाहेंगे? यदि आवश्यक हो, तो आप वर्तमान कनेक्शन पर डेटाबेस को बदल सकते हैं use DATABASENAME, लेकिन मैं बिंदु नहीं देखता हूं?
troelskn

9

मैंने अपने जीवन को सरल बनाया:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

आशा है कि यह उपयोगी है ... चीयर्स ...


1
यदि आप दोनों डेटाबेस में एक ही नाम के साथ टेबल नहीं रखते हैं तो यह सबसे आसान समाधान है। आप इसे एक बार करते हैं, और फिर आपको किसी भी अधिक डेटाबेस के बारे में चिंता करने की आवश्यकता नहीं है।
एरेल सहगल-हलेवी

@ ErelSegal-Halevi जब तक आपको केवल अन्य डीबी से डेटा तक केवल पढ़ने की आवश्यकता है, है ना?
बुटिक बटुकस

6

इसके बजाय mysql_connect उपयोग mysqli_connect

mysqli एक समय में कई डेटाबेस कनेक्ट करने के लिए एक कार्यक्षमता प्रदान करता है।

$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

1
$ hostname = 'Your DB_Hostname'; $ उपयोगकर्ता नाम = 'Your DB_Username'; $ पासवर्ड = 'आपका DB_password; $ db_name1 =' आपका DB_Name 1 '; $ db_name2 = 'आपका DB_Name 2';
कौशिक

यह सिर्फ गलत है कि यह काम नहीं करेगाmysql_connect
निको हसे

4

कोड के नीचे आज़माएं:

    $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";

आप नीचे दिए गए डेटाबेस से उपरोक्त क्वेरी का डेटा प्राप्त कर सकते हैं

$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);

दिए गए दो प्रश्न एक ही तरह से mysql_select_dbएक बार भी कॉल किए बिना काम करेंगे - साथ ही, बीच में किसी और चीज के बिना दो बार कॉल करना बेकार है
निको हसे

4
$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);

यह सबसे स्पष्ट समाधान है जो मैं उपयोग करता हूं लेकिन बस याद रखें, यदि दोनों डेटाबेस के लिए उपयोगकर्ता नाम / पासवर्ड एक ही मेजबान में बिल्कुल समान है, तो यह समाधान हमेशा पहले कनेक्शन का उपयोग करेगा। इसलिए भ्रमित न हों कि यह ऐसे मामले में काम नहीं कर रहा है। आपको क्या करने की आवश्यकता है, 2 डेटाबेस के लिए 2 अलग-अलग उपयोगकर्ता बनाएं और यह काम करेगा।


3

जब तक आपको वास्तव में खेलने में पीडीओ ऑब्जेक्ट के एक से अधिक उदाहरणों की आवश्यकता नहीं है, तब तक निम्नलिखित पर विचार करें:

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

dbname=निर्माण तर्कों में अनुपस्थिति पर ध्यान दें ।

जब आप किसी टर्मिनल या अन्य टूल के माध्यम से MySQL से जुड़ते हैं, तो डेटाबेस नाम बल्ले से बंद होने की आवश्यकता नहीं होती है। आप विधि के USE dbnameमाध्यम से बयान का उपयोग करके डेटाबेस के बीच स्विच कर सकते हैं PDO::exec()

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

बेशक आप इसे कैच ट्राई स्टेटमेंट में लपेट सकते हैं।


उन लोगों के लिए, जो उपरोक्त दृष्टिकोण की कोशिश करेंगे, इससे पहले कि stackoverflow.com/a/14933070/1623579
TheFrost

मैं इस समाधान प्यार करता हूँ! मैं लगातार सेटिंग के बिना कर सकता हूं, लेकिन पीडीओ की तात्कालिकता एक महान समाधान है। आपको किसी विशिष्ट डेटाबेस से जुड़े बिना एक डिफ़ॉल्ट कनेक्शन मिलता है।
चक बर्गेस

2

आप MySQLi सिंटैक्स का उपयोग करने में सक्षम हो सकते हैं, जो आपको इसे बेहतर तरीके से संभालने की अनुमति देगा।

डेटाबेस कनेक्शन को परिभाषित करें, फिर जब भी आप डेटाबेस में से किसी एक को क्वेरी करना चाहते हैं, तो सही कनेक्शन निर्दिष्ट करें।

उदाहरण के लिए:

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

फिर उन्हें उसी पृष्ठ पर क्वेरी करने के लिए, जैसे कुछ का उपयोग करें:

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

इस तरह से MySQLi में बदलने से आपको मदद मिलेगी।


कृपया अपने सिंटैक्स में सुधार करें (यह एक एसएमएस नहीं है) और अपने कोड को टूल के साथ प्रारूपित करें (उदाहरण के लिए Ctrl + K)।
फेडोरक्वी 'एसओ स्टॉप' नुकसान

2

आप वास्तव में जरूरत नहीं है select_db। आप एक ही समय में दो डेटाबेस को क्वेरी भेज सकते हैं। सबसे पहले, के लिए एक अनुदान देने DB1से चयन करने के DB2द्वारा GRANT select ON DB2.* TO DB1@localhost;। फिर, FLUSH PRIVILEGES;। अंत में, आप SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2आदि जैसे 'कई-डेटाबेस क्वेरी' करने में सक्षम हैं (यह मत भूलो कि अनुदान आदेश का उपयोग करने के लिए आपको 'रूट' एक्सेस की आवश्यकता है)


1

यदि आप mysqli का उपयोग कर रहे हैं और आपके पास दो db_connection फ़ाइल है। पहले की तरह है

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

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

दूसरा है

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

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

तो बस DB1 और DB2 की तरह mysqli में पैरामीटर पास का नाम बदलें। यदि आप दोनों फ़ाइल में mysqli suppose DB1 में एक ही पैरामीटर पास करते हैं तो दूसरा डेटाबेस कोई और कनेक्ट नहीं करेगा। इसलिए याद रखें कि जब आप दो या अधिक कनेक्शन का उपयोग करते हैं तो mysqli फ़ंक्शन में विभिन्न पैरामीटर नाम पास करते हैं


-1
<?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/>----------------------------------------";

        }     

    }
    ?>

अधिक जानकारी के लिए आप github.com/sapankumarmohanty/CountRecordsAtMigrationFinalSync
htngapi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.