2008-11-08 9 views
167

मेरे पास कुछ डेटाबेस में जानकारी फैली हुई है और सभी जानकारी को PHP का उपयोग करके एक वेबपृष्ठ पर रखना चाहते हैं। मैं सोच रहा था कि मैं एक ही PHP वेबपृष्ठ पर एकाधिक डेटाबेस से कैसे कनेक्ट कर सकता हूं।आप एक ही वेबपृष्ठ पर एकाधिक MySQL डेटाबेस से कैसे कनेक्ट करते हैं?

मुझे पता है का उपयोग करते हुए एक भी डेटाबेस से कनेक्ट करने के लिए कैसे:

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

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

उत्तर

312

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

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

आप एक लिंक उत्तीर्ण नहीं होते हैं:

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

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

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

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

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

mysql_query('select * from tablename'); 

अन्य विकल्प

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

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

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

+37

कि "सत्य" बस मुझे काम के घंटे बचाएं – PurplePilot

+2

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

+0

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

3

आप भी कई डेटाबेस अबास्ट्रक्शन टूल में से एक को देखना चाहते हैं। हालांकि वे आम तौर पर वही काम करेंगे जो टॉम ने एक ही समय में कई कनेक्शन खोलने के लिए वर्णित किया था।

87

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

आप इस तरह, पीडीओ के माध्यम से कनेक्ट होगा:

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

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

फिर आप इस तरह डेटाबेस क्वेरी कर सकता है (बेशक databasename, उपयोगकर्ता नाम और पासवर्ड को ऊपर)

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

$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

शीर्ष पर यह उत्तर क्यों नहीं है ?! इसके बारे में जाने का यह सही तरीका है। –

+8

मेरी राय में @ आदित्य मेनन, अक्सर कुछ करने का सही तरीका हाथ पर सवाल का सही जवाब नहीं है। पूछताछकर्ता अपने प्रश्न में पीडीओ का उपयोग नहीं कर रहा था, लेकिन php देशी mysql फ़ंक्शंस का उपयोग नहीं कर रहा था, इसलिए मेरा मानना ​​है कि सबसे अच्छा जवाब प्रश्नकर्ता कोड का पालन करेगा। – Jonathan

+2

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

3

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

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

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

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

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

बेशक आप इसे पकड़ने के कथन में लपेटना चाहते हैं।

+0

उन लोगों के लिए, जो दृष्टिकोण से ऊपर की कोशिश करेंगे, इससे पहले कि http://stackoverflow.com/ ए/14 9 33070/1623579 – TheFrost

+0

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

5

कोड के नीचे का प्रयास करें:

$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); 
2
$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 अलग-अलग उपयोगकर्ता बनाएं और यह काम करेगा।

8

मैं बस अपना जीवन आसान बना:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table; 

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

+1

यदि आपके पास दोनों डेटाबेस में एक ही नाम के साथ तालिकाओं नहीं हैं तो यह सबसे आसान समाधान है। आप इसे एक बार करते हैं, और फिर आपको कई डेटाबेस के बारे में चिंता करने की ज़रूरत नहीं है। –

1

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

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

उदा .:

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

फिर, एक ही पृष्ठ पर उन्हें क्वेरी की तरह कुछ का उपयोग करें: इस तरह से आपकी मदद करेंगे में MySQLi को बदलने

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

+0

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

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 = 'आपका डीबी_होस्टनाम'; $ उपयोगकर्ता नाम = 'आपका डीबी_ उपयोगकर्ता नाम'; $ पासवर्ड = 'आपका डीबी_पासवर्ड'; $ db_name1 = 'आपका डीबी_नाम 1'; $ db_name2 = 'आपका डीबी_नाम 2'; – kaushik

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 और डीबी 2 की तरह mysqli में पैरामीटर पास का नाम बदलने है। यदि आप mysqli में समान पैरामीटर पास करते हैं तो दोनों फ़ाइल में डीबी 1 मान लें तो दूसरा डेटाबेस अब और कनेक्ट नहीं होगा। तो याद है जब आप दो या अधिक कनेक्शन का उपयोग mysqli समारोह में

1

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

संबंधित मुद्दे

 संबंधित मुद्दे