• 締切済み

MySQL 複数のDB接続で上書きされる

あるphpファイル内の最上段で、 二つのデーターベース接続を行っています。 二つのdsnを使ってそれぞれDBにコネクトしています。 例えばこんな感じです。 //ページ先頭で $mdb2 = db_connect(); //関数内でコネクトされています。 $mdb2_a = db_connect_a(); //関数内でコネクトされています。 で、最初の$mdb2内に格納されているDB接続情報を、 そのphpファイル内で使いまわそうとすると、 後から作られた$mdb2_aに上書きされるようで、$mdb2は使い道がなくなります。 コレを回避する方法としては、 dsnの割り当て情報に、'new_link' => true を追加したり、SQLセーフモードをオンにしたりと、 小細工すれば上手くいくようですが、 これらの方法を使わずにすむ方法はないものでしょうか? 一つのphpファイルで二つのDBに接続しない方法を模索すればいいかもですが、 その手法はないものとして、知恵をお貸しください。 各SQLの発行前にその都度、DB接続を行えばいけるようですが、 分散トランザクションを行い、上記のように二つのDB接続をトランザクション前に取得しようと考えております。 分散トランザクションであっても、その過程内でその都度DB接続しても遅延等で問題が起こらないでものでしょうか? どうもDBの接続ってものすごく処理に負荷がかかる気がして・・・・。 何かいい方法を教えていただきますと助かります。 よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

db_connect() と、 db_connect_a() の中身を教えてもらえませんでしょうか?(もちろんID,パスワード等は伏字で大丈夫です) それから、「都度DBに接続して」というくだりがありますが、それを行なってしまうと、分散トランザクションの意味が無いのではないでしょうか。 それらを踏まえて、もう少し具体的に何をしたいのか教えて頂けると、回答しやすいかと思います。 ちなみに、仰るとおり、DBの接続処理は負荷がかかりますので、一度接続処理を行った後はそれをプールしておくのが一般的です。

n-yuuki
質問者

補足

分散トランザクションについて、やはりそうですよね。 その都度DB接続するとなると、トランザクションじゃなくなりますよね。 下記が、コネクト関数の中身です。 function db_connect(){ require_once("MDB2.php"); require_once('MDB2/Extended.php'); $dsn = array( 'phptype' => 'mysql', 'username' => '****', 'password' => '****', 'hostname' => 'localhost', 'database' => '----' ); $db = MDB2::connect($dsn); $db->setFetchMode(MDB2_FETCHMODE_ASSOC); $db->loadModule('Extended'); if(PEAR::isError($db)){ print "MDB2 Connect Error!"; exit; } return $db; } ------------------------------- 別ファイル function db_connect_a(){ require_once("MDB2.php"); require_once('MDB2/Extended.php'); $dsn = array( 'phptype' => 'mysql', 'username' => '****', 'password' => '****', 'hostname' => 'localhost', 'database' => '++++' ); $db = MDB2::connect($dsn); $db->setFetchMode(MDB2_FETCHMODE_ASSOC); $db->loadModule('Extended'); if(PEAR::isError($db)){ print "MDB2 Connect Error!"; exit; } return $db; }

  • t_ohta
  • ベストアンサー率38% (5080/13275)
回答No.1

$mdb2 が上書かれるのは、どこかで上書く処理をしてしまっているか、db_connect_a() 関数の内部に問題があるように思います。 db_connect_a() の中ではどのような処理をしているのでしょうか。

n-yuuki
質問者

補足

回答ありがとうございます。 下記がそれぞれの関数です。 それぞれ別々のphpファイルに記述しています。 ※関数専用ファイルが二つあると言う意味です。 function db_connect(){ require_once("MDB2.php"); require_once('MDB2/Extended.php'); $dsn = array( 'phptype' => 'mysql', 'username' => '****', 'password' => '****', 'hostname' => 'localhost', 'database' => '----' ); $db = MDB2::connect($dsn); $db->setFetchMode(MDB2_FETCHMODE_ASSOC); $db->loadModule('Extended'); if(PEAR::isError($db)){ print "MDB2 Connect Error!"; exit; } return $db; } //------------------------------------------ function db_connect_a(){ require_once("MDB2.php"); require_once('MDB2/Extended.php'); $dsn = array( 'phptype' => 'mysql', 'username' => '****', 'password' => '****', 'hostname' => 'localhost', 'database' => '++++' ); $db = MDB2::connect($dsn); $db->setFetchMode(MDB2_FETCHMODE_ASSOC); $db->loadModule('Extended'); if(PEAR::isError($db)){ print "MDB2 Connect Error!"; exit; } return $db; }

関連するQ&A

  • Microsoft Access DBへの接続

    Microsoft Access MDBへの接続方法で先日投稿致しましたが、 接続方法が違う事が判明し別の方法で試しているのですが こちらの方法でも問題が発生しました。 require_once "adodb/adodb.inc.php"; $db = ADONewConnection("access"); $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\\yoyaku.mdb;Uid=Admin;Pwd=;"; $db->Connect($dsn); if (!$db) { echo "NG"; } $sql = "select * from T_YOYAKU"; $rs = $db->Execute($sql); if ( $row = $rs->Fields(1) ) {  if ( $row[YOYAKU_CODE] == "1" ) { $a="×"; } else { $a="○"; } } else {  $a="○"; } DB接続の部分(Connectの部分)では問題は起きてないのですが、Execute文のところで問題が発生し、その下に記述してある処理が実行されていないのが現状です。 インターネット等で調べても何も解決しなかったため、投稿致しました。 ご教授お願い致します。

    • 締切済み
    • PHP
  • PEARのDBが動かない・・orz

    PEARのDBを使ってMYSQLに接続しようとしているのですが、動作しません。 試しに↓のようなコードを書いたところ 画面「a」は出たのですが「b」が出ませんでした。 --コード----------------------------------------- require_once("DB.php"); $dsn = "mysql://user:password@localhost/db_name; echo("a"); $db = DB::connect($dsn , true); echo("b"); -------------------------------------------------- なにかエラーがでれば手がかりになるのですが、 エラーも何もでません。 MDB2で試しても結果は同じでした。 解決方法を教えて頂けないでしょうか? ちなみにPHPのversionは5.1.2 MYSQLは4.1.7になります。

    • 締切済み
    • PHP
  • PEAR::DBでのMySQL接続

    初心者で、環境が分からなくて困っています。 環境は、OS:Win2000 , PHP-V5.2.4 , MySQL-V5.0.45 , PEAR::DB -V1.7.13 です。 MySQLと、PEAR::DBをインストールして、CONNECTするPGを実行したところ、CONNECTエラーとなりました。 1.PHPソース require_once("DB.php"); $dsn="mysqli://pearusr:pearpass@localhost/pear"; $option=array( "autofree"=> TRUE, "debug"=>3, "portability"=> DB_PORTABILITY_ALL); $db=DB::connect($dsn,$option); if(DB::isError($db)){ die("接続失敗:".$db->getMessage().$db->getCode().$db->getDebuginfo()); } print("データベースへの接続に成功しました。"); $db->disconnect(); 2.エラーメッセージ 接続失敗:DB Error: connect failed-24 [nativecode=Can't connect to MySQL server on 'localhost' (10061)] ** mysqli://pearusr:pearpass@localhost/pear MySQL側の環境について、他QAでいろいろ教えていただき、ちゃんと起動できていそうです。 そうすると、次に疑うのは、PEAR::DBの環境がおかしいのではないか? という想像のもと、PEAR::DBの環境設定まわりで、確認すべき項目を教えていただけませんか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • MDB接続

    PHP、MDB接続時に下記のようなエラーメッセージが出力されるのですが、原因が今一つ掴めません・・・。 Fatal error: Call to undefined function: query() in /home/h041117455-1087/www/test/yoyaku/studio.php on line 27 プログラムの方では、 <? require_once("MDB.php"); global $db; /********************************* * DB接続 ********************************/ $dsn = "pgsql://nobody:@localhost/yoyaku"; // データベースへ接続 $db = MDB::connect($dsn); if (MDB::isError($err)) { echo "接続NG" . $err; } else { echo "接続OK"; // Ast、Bst予約確認 $sql = "select YOYAKU_CODE from T_YOYAKU where YOYAKU_ID = '" . $l . "'"; $result = $db->query($sql); } と記述しております。 $result = $db->query($sql); の部分でエラーが発生しているのはわかるのですが、原因がつかめません。 申し訳ありませんが、ご教授お願い致します。

    • ベストアンサー
    • PHP
  • MySqlに接続できない

    環境:PHP5,MySql5,XP 下記の構文でDBへの接続エラーがでます。 php.iniでのインクルードpathの設定もあっています。 (DB.phpも上記インクルードpathにあります) 'pear list'コマンドでDBも確かにインストールされています。 これ以外でチェックするところがあれば、教えてください。 <?php // DBクラスモジュールをインクルード require_once("DB.php"); $dbtype = "mysql"; $sv = "localhost"; $dbname = "********"; $user = "root"; $pass = "******"; // データベースに接続する $dsn = "$dbtype://$user:$pass@$sv/$dbname"; $conn = DB::connect($dsn); if (DB::isError($conn)) { die("接続エラー"); } ?>

    • ベストアンサー
    • PHP
  • FC4でmysqlを使用して PEAR DB への接続ができない

    FC4に、yumでPHP5.0.4、php-pear-5.0.4、php-mysql-5.0.4、(mysql-4.1.20,mysql-server-4.1.20)をインストールしました。 <?php $con = mysql_connect("localhost","taro","password") or die("接続出来ません"); print "接続しました"; mysql_close($con); ?> を実行すると、「接続しました」と出ます。ところが、 <HTML> <HEAD><TITLE>PHP test</TITLE></HEAD> <BODY> <?php require_once("DB.php"); $dbUser="taro"; $dbPass="password"; $dbHost="localhost"; $dbName="testdb"; $dbType="mysql"; $dsn="$dbType://$dbUser:$dbPass:@$dbHost/$dbName"; $conn = DB::connect($dsn); if(DB::isError($conn)){ die($conn->getMessage()); } print ('DBに接続しました'); $conn->disconnect(); ?> </BODY></HTML> を実行すると、DB Error: connect failed と出て、接続できません。 php.iniは、 include_path = ".:/usr/share/pear:/php/includes" としてあり、 [root@FC4 ~]# ls -l /usr/share/pear/ で調べても drwxr-xr-x 2 root root 4096 5月 27 18:06 DB -rw-r--r-- 1 root root 38937 11月 8 2005 DB.php となっています。 パスの切り方が間違っているでしょうか? どのようにすれば接続できるでしょうか?よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • PHPからMySQL・異なるDBにコピー

    PHPからMySQL・異なるDBに接続し同じ構造のテーブルのデータをコピーすることは可能ですか? 以下を実行するとクエリが実行されず「コピーできません」が表示されてしまいます。 どのようにすればコピーできるか教えてください。 $connect1 = mysql_connect("localhost", "user1", "pass1") ; mysql_select_db("db1", $connect1); //db1内にtable1 $connect2 = mysql_connect("localhost", "user2", "pass2") ; mysql_select_db("db2", $connect2); //db2.内にtable2 $sql = "INSERT INTO `db1` . `table1` SELECT * FROM `db2` .`table2`;"; $result = mysql_query($sql, $connect1)or die("コピーできません"); //$result内「$connect1」でも「$connect2」結果は同じです。 //table1とtable2の構造は同じです。

    • ベストアンサー
    • PHP
  • XserverでpearのDBでMySQLに接続

    xserver(レンタルサーバー)でPHPでpearのDBクラスを使ってMySQL(データベース)に接続ができません。 Xserver(レンタルサーバー)環境 MySQL5 バージョン:5.0.77 MySQL5 ホスト名:xxx.xserver.jp(仮名) PHP Version 5.3.3 include_path .:/usr/share/php53/pear :/usr/share/php Xserver PHP関連の仕様一覧 PEARインストール済み <インストール済みライブラリ> ・Archive_Tar ・Auth ・Console_Getopt ・DB ・HTML_Common ・HTML_QuickForm ・HTTP ・HTTP_Header ・HTTP_Download ・Mail ・Net_SMTP ・Net_Socket ・Pager ・PEAR ・XML_Parser ・XML_RPC ・Structures_Grap データベースは同じくXserverに設置されているphpmyadmin(MySQL5)で作成しました。 /xxx.xsrv.jp/public_html/php_sample/Section63 の中に(dbtest2.php) でおいています。 ★以下のコードで接続ができません。 どこが間違っているのか教えて下さい。 ↓ <?php require_once("DB.php"); $dbUser = "sample"; // ユーザー名(仮名) $dbPass = "password"; // パスワード(仮名) $dbHost = "xxx.xserver.jp"; // ホスト名(仮名) $dbName = "sampledb"; // データベース名(仮名) $dbType = "mysql"; // データベースの種類 $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; $conn = DB::connect($dsn); // 接続に失敗したらメッセージを表示して終了します。 if (DB::isError($conn)) { die($conn->getMessage()); } print('接続に成功しました。'); // データベースから切断します。 $conn->disconnect(); ?> ★ちなみにPHPのmysql_connect関数からは接続成功しました。 ↓ <?php $con = mysql_connect("xxx.xserver.jp", "sample", "password") or die("接続できません。"); print "接続に成功しました。"; mysql_close($con); ?>

    • ベストアンサー
    • PHP
  • mysqlに接続が出来ません

    mysqlとphpを使ってウェブアプリを作ろうとしていますが、mysqlへの接続が出来ません。接続に失敗するのではなく「not found」と言われます。試しにgetDebugInfo()の出力は、「Unable to include the DB/.php file for ''」となります。 環境は、WinXpのxampp1.5.5 です。あるサイトで上記のようなメッセージはpearがおかしいのではという記述を見て、xampp自体を再インストールもして見ましたが変わりません。 DB/table共に存在しデータも入っておりコマンドラインからは、アクセスが出来ます。 もう一つデストラクタを宣言していると、以下の様なエラーが出るので コメントアウトしています。 Fatal error: Call to a member function disconnect() on a non-object in hogehoge.php 以下にコードを載せますので何が間違っているのかご教授ください。 ------------------------------------------------------------ require_once("DB.php"); class MyDb {  private $_db;  private $dsn = array(         'phptype' => "mysqli",         'hostspec' => "localhost",         'database' => "vhmaster",         'username' => "webuser",      );  private $option = array(         "autofree"=>TRUE,         "debug"=>1,         "portability"=>DB_PORTABILITY_ALL       );  public function __construct(){    $_db=DB::connect($dsn,$option);    if(DB::isError($_db)){      #print_r(get_loaded_extensions());      die("接続失敗:".$_db->getDebugInfo());    }  }  /*  public function __destruct(){    $_db->disconnect();  }  */ } --------------------------------------------------------

    • 締切済み
    • PHP
  • PHPでMySQLのDBに接続

    PHP,MySQLが使えるレンタルサーバーを借りているのですが, PHPでMySQLに接続し、php_dbを選択をするようにしたいのですが、 この時DBファイルはどこに置けばいいのでしょうか? 現在はMySQLの管理コマンド(?)とは別にpublic_htmlの中に PHPフォルダを作り、そこにDBファイルを入れています。 PHPのスクリプトは <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>練習</title> <meta http-equiv="content-language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head><body> <?php $con = mysql_connect(); if (!$con) { echo ("Error:MySQLに接続できませんでした。<br />"); } else { echo ("接続ID=$con<br>\n"); } $selectdb = mysql_select_db("php_db" ,$con); if (!$selectdb) { echo ("Error:データベースを選択できませんでした"); } else { echo ("データベースphp_dbを選択しました。"); } ?> </body></html> としています。 MySQLには接続ができるのですが、php_dbには接続ができません。 php_dbのおき場所を変えるのか、ファイルの指定が間違っているのか その他、どの要に変更をしたらよいのでしょうか? お願いします。 環境はレンタルサーバーがLINUXでPHPのバージョンなどはわからないんです・・・!! 開発がOSがW2kでFTPで転送してます。

    • ベストアンサー
    • PHP