আপনি কীভাবে একক ওয়েবপৃষ্ঠায় একাধিক মাইএসকিউএল ডাটাবেসের সাথে সংযোগ স্থাপন করবেন?


179

আমার কাছে কয়েকটি ডাটাবেস জুড়ে তথ্য ছড়িয়ে আছে এবং পিএইচপি ব্যবহার করে সমস্ত তথ্য একটি ওয়েবপৃষ্ঠায় রাখতে চাই। আমি ভাবছিলাম যে আমি কীভাবে একটি একক পিএইচপি ওয়েবপৃষ্ঠায় একাধিক ডাটাবেসে সংযোগ করতে পারি।

আমি কীভাবে একটি একক ডাটাবেসে কানেক্ট করতে জানি তা:

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

তবে, আমি অন্যান্য ডাটাবেসগুলি খোলার জন্য কেবল একাধিক "mysql_connect" কমান্ড ব্যবহার করতে পারি এবং পিএইচপি কীভাবে জানতে পারে যে আমার কাছে একাধিক ডাটাবেস সংযুক্ত থাকলে আমি কী ডাটাবেস থেকে তথ্য টানা চাই।

উত্তর:


335

সতর্কতা: mysql_xx ফাংশনগুলি পিএইচপি ৫.৫ এর পরে অবহিত করা হয়েছে এবং পিএইচপি since.০ থেকে অপসারণ করা হয়েছে (দেখুন http://php.net/manual/intro.mysql.php ), mysqli_xxফাংশনগুলি ব্যবহার করুন বা @ ট্রলস্কন থেকে নীচের উত্তরটি দেখুন


আপনি একাধিক কল করতে 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_select_db()প্রয়োজনের মধ্যে অদলবদল করতে কল করুন । আমি নিশ্চিত নই যে এটি একটি পরিষ্কার সমাধান এবং আপনি ভুল ডাটাবেস অনুসন্ধান করতে পারেন।
  • আপনার প্রশ্নের মধ্যে সারণি রেফারেন্স করার সময় ডাটাবেসের নাম উল্লেখ করুন (যেমন SELECT * FROM database2.tablename)। এটি বাস্তবায়নে ব্যথা হওয়ার সম্ভাবনা রয়েছে।

এছাড়াও দয়া করে ট্রয়স্কেনের উত্তরটি পড়ুন কারণ আপনি যদি পুরানো এক্সটেনশানগুলির চেয়ে PDO ব্যবহার করতে সক্ষম হন তবে এটি আরও ভাল পদ্ধতির।


2
+1 এই সমাধানটি আমার পক্ষে কাজ করেছে। আমার কাস্টমস ওয়ার্ডপ্রেস টেমপ্লেটগুলি দ্বিতীয় ডাটাবেস সংযোগে কল করার পরে কেন আমার কাস্টম ওয়ার্ডপ্রেস টেমপ্লেটগুলি অ্যাক্সেস হারাচ্ছে তার ডিবাগিংয়ের দুই দিন পরে ...
এডি বি

তাদের মধ্যে কোনওটি ডিফল্ট হিসাবে সেট করা সম্ভব হয়েছে, এবং $dbh2যখন প্রয়োজন হয় তখন কেবল দ্বিতীয়টির জন্য যুক্ত করা যায়? কাজের জন্য এই পদ্ধতির জন্য সমস্ত প্রশ্নের পরিবর্তন করা সম্ভবত তাদের সমস্ত সন্ধানে কয়েক দিন সময় লাগবে ...
থমাসক

@ থমাসক, আপনি কোনও ডিফল্ট প্যারামিটার দিয়ে কোনও ফাংশনে মাইএসকিএল_কিউরিটি গুটিয়ে রাখতে পারেন, বলতে পারেন db_query($query,$db='db1')এবং তারপরে db_query($query)আপনার অ- db_query($query,'db2')
ডিফল্টগুলিকে

আপনার পদ্ধতিটি ব্যবহার করে, যদি আমি দুটি সংযোগ সংজ্ঞায়িত করি তবে কোয়েরিতে কোন সংযোগটি ব্যবহার করবেন তা নির্দিষ্ট না করে কোন সংযোগটি ব্যবহার করা হবে?
পিটার

1
@ পিটার: পিএইচপিএন / ম্যানুয়াল /en/function.mysql-query.php অনুসারে :If the link identifier is not specified, the last link opened by mysql_connect() is assumed.
টম

97

আপনি যদি পিএইচপি 5 ব্যবহার করেন (এবং আপনার উচিত হওয়া উচিত যে পিএইচপি 4 নষ্ট হয়ে গেছে), আপনার পিডিও ব্যবহার করা উচিত , যেহেতু এটি আস্তে আস্তে নতুন স্ট্যান্ডার্ডে পরিণত হচ্ছে becoming PDO- এর একটি (খুব) গুরুত্বপূর্ণ সুবিধা হ'ল এটি সীমাবদ্ধ পরামিতিগুলিকে সমর্থন করে যা অনেক বেশি সুরক্ষিত কোড তৈরি করে।

আপনি পিডিওর মাধ্যমে সংযোগ স্থাপন করবেন, এটির মতো:

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
আমার মতে @ আদিত্য মেনন, প্রায়শই কিছু করার সঠিক উপায় হ'ল প্রশ্নের সঠিক উত্তর নয়। প্রশ্নকর্তা তার প্রশ্নে পিডিও ব্যবহার করছেন না বরং পিএইচপি নেটিভ মাইএসকিএল ফাংশন, তাই আমি বিশ্বাস করি যে সবচেয়ে উপযুক্ত উত্তরটি প্রশ্নকারী কোড অনুসরণ করবে।
জোনাথন ডস সান্টোস

2
@ অ্যাডটিয়ামন কার কর্তৃপক্ষের অধীনে? মনে রাখবেন ব্যবহারকারী সর্বদা সঠিক ... পিডিও হ'ল সর্বোত্তম উপায়, তবে উভয় উপায়ই ব্যবহারকারীদের সমস্যা সমাধানের সঠিক উপায়। ডান এবং সেরা মধ্যে পার্থক্য নোট করুন। হ্যাঁ ... আমি বিরক্ত তাই আমাকে একটি বিবৃতি দিতে হয়েছিল।
জাস্টিনকাজ

$ Db1 এবং $ db2 একাধিক মাইএসকিএল সংযোগ উপস্থাপন করে? যদি তাই হয়, ভাল না। একমাত্র সংযোগের সাথে একাধিক ডাটাবেস সংযুক্ত করার কোনও উপায় আছে কি?
datasn.io

@ কেভোইর আপনি কেন এটি চাইবেন? যদি প্রয়োজন হয় তবে আপনি বর্তমান সংযোগের সাথে ডাটাবেস পরিবর্তন করতে পারেন use DATABASENAME, তবে আমি বিন্দুটি দেখতে পাচ্ছি না?
Troelskn

9

আমি কেবল আমার জীবনকে সহজ করে তুলেছি:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

আশা করি এটি সহায়ক ... চিয়ার্স ...


1
উভয় ডাটাবেসে যদি একই নামের টেবিল না থাকে তবে এটি সবচেয়ে সহজ সমাধান। আপনি একবার এটি করেন এবং তারপরে আপনাকে আর একাধিক ডাটাবেস সম্পর্কে চিন্তা করতে হবে না।
এরেল সেগাল-হালেভি

@ যতক্ষণ না আপনার অন্য ডিবি থেকে ডেটাতে কেবলমাত্র পঠনযোগ্য অ্যাক্সেস প্রয়োজন ততক্ষণ ইরেলসাগাল-হালেভি?
বাটাল বাটকাস

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
$ হোস্টনেম = 'আপনার ডিবি_হোস্টনাম'; $ ব্যবহারকারীর নাম = 'আপনার ডিবি_উজারনেম'; $ পাসওয়ার্ড = 'আপনার ডিবি_পাসওয়ার্ড'; $ db_name1 = 'আপনার ডিবি_নাম 1'; ; db_name2 = 'আপনার ডিবি_নাম 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

আপনার যদি খেলতে PDO অবজেক্টের একাধিক ইভেন্টের প্রয়োজন না থাকে তবে নিম্নলিখিতগুলি বিবেচনা করুন:

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

dbname=নির্মাণ যুক্তিগুলির অনুপস্থিতি লক্ষ্য করুন ।

আপনি যখন টার্মিনাল বা অন্য সরঞ্জামের মাধ্যমে মাইএসকিউএলে সংযুক্ত হন, তখন ব্যাট থেকে ডাটাবেসের নামের প্রয়োজন হয় না। পদ্ধতির USE dbnameমাধ্যমে বিবৃতিটি ব্যবহার করে আপনি ডাটাবেসগুলির মধ্যে স্যুইচ করতে পারেন PDO::exec()

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

অবশ্যই আপনি এটি একটি ক্যাচ ট্রাই স্টেটমেন্টে মোড়তে চাইতে পারেন।


যারা, যারা পদ্ধতির উপরে চেষ্টা করবে, একজন বর্ণন আগে নিতে stackoverflow.com/a/14933070/1623579
TheFrost

আমি এই সমাধান ভালোবাসি! অবিচ্ছিন্ন সেটিং ছাড়া আমি এটি করতে পারি, তবে পিডিওর তাত্ক্ষণিকতা একটি দুর্দান্ত সমাধান। নির্দিষ্ট ডাটাবেসে সংযুক্ত না হয়ে আপনি একটি ডিফল্ট সংযোগ পান।
চক বার্গেস

2

আপনি মাইএসকিউএলআই সিনট্যাক্স ব্যবহার করতে সক্ষম হতে পারেন যা আপনাকে এটি আরও ভালভাবে পরিচালনা করতে দেয়।

ডাটাবেস সংযোগগুলি সংজ্ঞায়িত করুন, তারপরে আপনি যখনই কোনও ডাটাবেসটিতে কোয়েরি করতে চান, সঠিক সংযোগটি নির্দিষ্ট করুন।

উদাহরণ:

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

এইভাবে মাইএসকিউএলআই এ পরিবর্তন করা আপনাকে সহায়তা করবে।


দয়া করে আপনার বাক্য গঠনটি উন্নত করুন (এটি কোনও এসএমএস নয়) এবং সরঞ্জামগুলির সাথে আপনার কোডটি ফর্ম্যাট করুন (উদাহরণস্বরূপ 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_ সংযোগ ফাইল রয়েছে। প্রথম মত

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

সুতরাং কেবল ডিবি 1 এবং ডিবি 2 এর মতো মাইসকলিতে প্যারামিটার পাসের নাম পরিবর্তন করুন। যদি আপনি মাইসকিলে একই পরামিতিটি উভয় ফাইলে ডিবি 1 পাস করেন তবে দ্বিতীয় ডাটাবেস আর কোনও সংযোগ করবে না। সুতরাং মনে রাখবেন আপনি যখন দুটি বা ততোধিক সংযোগটি পাস করেন তখন বিভিন্ন প্যারামিটারের নাম মাইএসকিলি ফাংশনে


-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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.