• ベストアンサー

単純ですが、意外と穴?なデータベースリソースの鮮度

よろしくお願い致します。 環境PHP5.2.5 / SQLite3 /*---------------------------------------- * インサート -----------------------------------------*/ $sql_1 = 'INSERTなんたら~(id = 25 を作成)'; $db_pass = 'db_hoge.sqlite'; $db_res = sqlite_open($db_pass); //★タイム(1) $result = sqlite_query($db_res,$sql_1);      :   ~ INSERT処理($sql_1)をしてます ~      : //sqlite_close($db_res) ここではクローズせず      :      : /*---------------------------------------- * デリート -----------------------------------------*/ $sql_2 = 'DELETEなんたら~(id = 25 を削除)'; //省略しちゃうわけです。$db_pass = 'db_hoge.sqlite'; //省略しちゃうわけです。$db_res = sqlite_open($db_pass); //★タイム(2) $result = sqlite_query($db_res,$sql_2);      :   ~ DELETE処理($sql_2)をしてます ~      : /*---------------------------------------- * /処理完了 -----------------------------------------*/ //ここで、ようやく、クローズ sqlite_close($db_res); //============================================== 何が疑問かと言いますと、 ★タイム(1)と、★タイム(2)の時点では、 $db_res の中身の鮮度が違うのでは?と思うわけです。 つまり、 ★タイム(1)の時点では、id=25のデータは作成されていません。 ★タイム(2)の時点では、id=25のデータは作成済みです。 id=25が作成されていない状態のDBリソースを、 ★タイム(2)の所で、使用しています。 言い換えると、 id=25が存在していないDBのリソースを、 タイム(2)の時点で使用し、 そのリソースをもとに、 id=25のデータを消そう(DELETEしよう)としているわけです。 「//省略しちゃうわけです。」 という所で、省略する場合と、しない場合とでは、 結果はやはり異なるのでしょうか? 検査対象がリソースだけに、調べにくいなと思い、 質問させて頂きました。 どなたか、この辺りの正式な作法も含めて、 教えて頂けてませんでしょうか。 上記の「//省略しちゃうんです。」の方法で、 問題ないですよ、 ということであれば、今後も、省略しちゃう方向で、 コーディングしていこうと思います。笑

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>後者の方法だと、リソースが新鮮に保たれないため、 >インサート処理の結果が影響するデータについて処理を行う場合(例では、インサートされたデータをすぐデリートしている)、 >正常に処理できないことになりますよね。 同じ $db_res を使っている限り、正常に処理できると思います。 明示的にトランザクションを開始した場合、コミットしない限り本物のDBには反映されませんが、 そのトランザクションを開始した同じ$db_resを使っていれば、insertしたものをdeleteしてもエラーにはならないと思います。 それどころか、SQLiteはトランザクションが常に1つしかないと思われるので、常に最新であるように思います。 SQLiteの場合、トランザクションを使うメリットは、高速に動かしたい場合と、排他というか他の人のアクセスを拒否したい場合のようです。 これはPHPによるウェブアプリケーションの話ですよね。 ということは、1サイクル中(クライアントが1ページ表示している間)の話ですよね。 INSERTしてDELETEするのも1サイクル中の話ということになるかと思います。 であれば、鮮度は考えなくても問題ないと思うのですが、駄目なんでしょうか。 1サイクル中であれば、同じ $db_res で操作する限り、常に最新の状態で操作しているのと変わらないと思います。 トランザクションで保護された情報はコミットされない限り、本物のDBには反映されないので 別なサイクル(他の人がアクセスして来た時とか)では、古いままですが、SQLiteは、トランザクションを開始すると、テーブル全体がロックされて他からのアクセスを拒否するようです。(エラーになります) http://blog.zunbe.com/archives/2009/03/sqlite.html ので、他の人も常に最新の状態でしかアクセスできないという事になると思います。 アクセス過多によるロック http://oshiete1.goo.ne.jp/qa4310712.html テーブルがロックされている間、ページの表示を待機させるような仕組みも実装できると思いますが、どうすればいいか、今の私には思いつきません。 ロックの状態を検査できる関数とかあれば、それを使ってループで回すとか、PHPには例外ハンドラがあったと思うので、エラーがでたらループするとか。 (操作の量にもよると思いますが、待たされるのは一瞬だと思います。なので利用者は待たされてるとは感じないと思います。アクセスが集中した場合には、別ですが、そういう状況になるようなら既にSQLiteでは、さばけなくなっていると思います。) 「アクセスが集中して混み合っています」とか「他の人が処理中です」のようにページに表示するようにする事もできますが。 削除のエラー処理に例外ハンドラの例となるような部分が有ります http://study.rakuto.net/exec/bbs/browse/146/ ここまで踏まえて最初の質問のソースを見ると open - insert - delete - close と open - insert - close - open - delete - close の違いは、途中がcloseとopenがあるか無いかだけの違いのように思います。 トランザクションを明示的に開始しなければ自動で開始されるので、クエリーを発行した直後、本物のDBにも繁栄され、常に最新です。 >コミットしなくても、インサート処理自体はDBに反映されているのでしょうかね。 本物のDBには反映されないですが、同じ $db_res を使ったクエリーは、それまでのクエリーの累積した結果が反映されていると思います。 そうじゃないとテンポラリテーブルを使ったデータ処理 BEGIN TRANSACTION; CREATE TEMPORARY TABLE temp(); INSERT INTO temp SELECT * FROM xxx; DROP TABLE temp; COMMIT; みたいな事ができないですよね。

march4
質問者

補足

>1サイクル中であれば、同じ $db_res で操作する限り、常に最新の状態で操作しているのと変わらないと思います。 >トランザクションで保護された情報はコミットされない限り、本物のDBには反映されないので >本物のDBには反映されないですが、同じ $db_res を使ったクエリーは、それまでのクエリーの累積した結果が反映されていると思います。 なるほど、なるほど。 私を混乱させていた「トランザクション」について、分かるようになってきました。 頂いた回答の中に何度か登場した「本物のDB」という言葉が印象的でした。 イメージ的には、 SQLiteのDBにおける、 ビギン→コミットの間の1サイクル中においては、 ここで言う$db_resの中身には、 最新状態のDBリソースが常に格納されていて、 この状態は、 ビギンされたDB(DBリソース)がコミットされるまでの間、 仮の(メモリ上の?)スペースに一時的に保管されているような、 そんな状態なのでしょうかね。 で、コミットされるまでの間、 その一時保管されているDBリソース(常に新鮮)に対して、 インサートしたりデリートしたりするので、 正常にDB処理ができ、 最終的にコミットされると、その一時保管されていたデータの、 最終状態が「本物のDB」へと書き込まれる、 といった感じになるのでしょうね。 イメージ的には、そういうことをおっしゃられているのだと思います。 また、紹介頂いたURLも参考にさせて頂きました。 (昨夜の段階では、「教えて!goo」によるURLチェックが入っていたため、 その間は、こちらの回答(NO.2)を見ることはできませんでしたが、 最終的には読むことができるようになりました。 どなたかのブログのURLがまずかったのでしょうかね。) で、話を戻し… トランザクションを利用する場合、 処理速度を速める以外に、「ロック(排他)」も行われるということが よく分かりました。 処理速度を速めることについては、「良い」としか思いませんが、 ロックについては、もちろん、これも「良い」のですが、ただ多少、弊害もありそうだなという印象です。 その弊害とはつまり、 ロックされている間、他のアクセスを待機させるということを指しています。 弊害でもあり、有り難い処理でもあり、といった 痛し痒しな処理だなと思っています。 ただ、余談ですが、こちらについては正直、私のサイト規模では、 今のところ、問題なさそうです。 しかし、頭の片隅には入れておきます。重要な事だと思いますので。 以上を踏まえ、私にとってベストな解を導き、 それをもとにサイトの設計に当たりたいと思います。 この度は私のためにご尽力頂き、ありがとうございました。 また分からないことがありましたら、色々教えて下さいね。

その他の回答 (2)

回答No.3

http://www.techscore.com/tech/sql/11_01.html トランザクションとは、一連の作業単位を意味するので、 INSERT⇒DELETEという一連の作業が成功したらCOMMITするということを考えれば、トランザクション内でINSERTしたidを同一トランザクション内でDELETEの条件として加えてやれば、存在しているとされ削除が行われると考えるのは自然と思えます。 実際、疑問に思ったのであれば、一度試してみてはいかがでしょうか。 http://reddog.s35.xrea.com/wiki/TkSQLite.html こちらにWindowsで動作する、Sqliteを操作するGUIアプリケーションもありますので。 実際に、 ------------------------- BEGIN; INSERT INTO hoge (id, name) VALUES (1, 'hogemoge'); UPDATE hoge SET name = 'momoge' WHERE id = 1; COMMIT; ------------------------- このSQL文を投げたら、id=1でname=momogeというデータが反映されてます。 ------------------------- BEGIN; INSERT INTO hoge (id, name) VALUES (2, 'hogemoge'); DELETE FROM hoge WHERE id = 2; COMMIT; ------------------------- こちらも、INSERTの後にDELETEしてるので、正常に何もINSERTされませんでした。(これは、どちらにしても、DELETE文の構文自体正しいので、単純にid=2の条件に適合するものが無ければ処理なしとして反映されるのでINSERTがされてようがされてまいが、処理は一緒ですけど)

march4
質問者

お礼

いつもお世話になっております。 >トランザクションとは、一連の作業単位を意味するので、(~中略~)と考えるのは自然と思えます。 私はトランザクションというものをよく理解していなかったのだと思います。 そのことがよく分かりました。(もはや、PHPの話ではなくなっている。笑) >実際、疑問に思ったのであれば、一度試してみてはいかがでしょうか。 このようなソフトもあるのですね~。便利ですね~。 (と言いつつ、DLはしたものの、上手く使いこなせなかった私。苦笑) なにはともあれ、 NO.2の補足でも既に書いたことですが、 ビギン→コミット の間で行われる処理は、 ちゃんと更新されているんですよね。 (そう考えるのが自然ということですよね。) それがよく分かりました。 今回もどうもありがとうございました。 P.S. 教えて頂いたSQLiteのアプリケーションは、 頑張って使えるようになりたいと思います。 マスターしたら便利そうなので。笑

回答No.1

SQLiteとは疎遠なので、あんまりよく分かってないんですが。 http://net-newbie.com/sqlite/lang.html#transaction ・SQLiteはネストしたトランザクションを許していません ・トランザクション中を除いてはデータベースに対する変更は出来ません ・データベースを変更するコマンドを発行するとき、自動的にトランザクションが開始されます。 ・自動的に開始されたトランザクションは、そのコマンドの終了を持ってコミットされます とあります。 BEGIN でトランザクションを明示的に開始していない場合は INSERTやDELETE毎に自動的に開始され、コマンドが終了すると、コミットされるのでしょう。 ということは、INSERTしたID=25のレコードは、sqlopenしたままでも、直後にコミットされるので、DELETE する時には既にID=25のレコードは存在しているという事になると思います。 より明確にしたい場合には、トランザクションを明示したほうがよいでしょう。 以下に使い方が有ります。 http://cgi.crystal-creation.com/web-appli/technical-information/sqlite/php.htm SQLite以外の話ですが DBの中には、トランザクションのデフォルトの動作を指定できる場合が有ります。そういったものの初期値がロールバックになっている場合、コミットもロールバックもせずにデータベースを閉じると、自動的にロールバックされて、INSERTしても反映されないというような不具合で悩む事もあるかもしれないので、そういった事も記憶の片隅にでも入れておくと、良いのではないかなと思います。

march4
質問者

お礼

読みやすく、分かりやすい回答をありがとうございます。 とてもよく分かりました。 >BEGIN でトランザクションを明示的に開始していない場合は >INSERTやDELETE毎に自動的に開始され、コマンドが終了すると、 >コミットされるのでしょう。 ということですので、 タイム(1)とタイム(2)、それぞれの時点における$db_resには、 その時点における最新のDBリソースが格納されているということになりますね。 (疑問だったことの核心部分ですね) よって、 「//省略しちゃうわけです。」の所における、省略の有無は、 動作に影響を及ぼさないということになりそうですね。 ただ、ソースの保守性などの観点から、 これらを省略すべきかどうか、今一度考えてみたいと思います。 また、意識的にBEGIN,COMMITするべきかどうかも併せて考えてみようと思います。 SQLiteの場合、毎回BEGIN,COMMITを繰り返すようだと、動作が極端に遅くなるようなので、この辺りのことも含め、再検討してみます。

march4
質問者

補足

(「お礼」を書いた後に、「補足」を書いています。読む順番に気をつけて下さい。) 「お礼」の最後の所が、ちょっと変な内容になってしまっている気がするので少々修正を。 質問で挙げたサンプルは、下記の例(変数の代入式などは省略してあります) と等価であると思います。 ※自動的に行われるトランザクション処理を明示的に書き加えた点が、質問のサンプルと異なります。他は同じ。 /*---------------------------------------- * インサート -----------------------------------------*/ //★タイム(1) sqlite_query("BEGIN;",$db_res);//明示的に $result = sqlite_query($db_res,$sql_1); sqlite_query("COMMIT;",$db_res);//明示的に //sqlite_close($db_res) ここではクローズせず /*---------------------------------------- * デリート -----------------------------------------*/ //★タイム(2) sqlite_query("BEGIN;",$db_res);//明示的に $result = sqlite_query($db_res,$sql_2); sqlite_query("COMMIT;",$db_res);//明示的に /*---------------------------------------- * /処理完了 -----------------------------------------*/ で、上とは別に、また別のパターンとして、 /*---------------------------------------- * インサート -----------------------------------------*/ //★タイム(1) sqlite_query("BEGIN;",$db_res);//明示的に $result = sqlite_query($db_res,$sql_1); //ここではコミットしない! //sqlite_close($db_res) ここではクローズせず /*---------------------------------------- * デリート -----------------------------------------*/ //★タイム(2) $result = sqlite_query($db_res,$sql_2); sqlite_query("COMMIT;",$db_res);//ようやくここでコミット。(余談ですが、省略可能なのかな。 /*---------------------------------------- * /処理完了 -----------------------------------------*/ という書き方も考えられます。 後者の場合、 コミットされるのが、タイム(2)の後になりますから、 $db_resの鮮度が常に新鮮に保たれているわけではないですよね。 さて、ここまで考えて、 思っていた以上に奥深い問題なのかな、と思い始めました…。 そう思った根拠を書きますと、 後者の方法では、コミットをまとめて最後に行うため、 前者の方法に比べ、処理が速くなるはずですが (2回くらいのDB処理では、さほど変わらないでしょうが)、 後者の方法だと、リソースが新鮮に保たれないため、 インサート処理の結果が影響するデータについて処理を行う場合(例では、インサートされたデータをすぐデリートしている)、 正常に処理できないことになりますよね。 (id=25がコミットされていないのに、id=25のデータをデリートできやしない、という意味で。) よって、まとめると、 前者フローだと、処理時間は多少要すが、正確な処理が常に可能。 後者は、処理時間短縮は期待できるが、正確に行える処理が限定的となる。 ということになりますでしょうか。 と、ここまで書いて、 コミットはあくまで確定的なものにする処理であって、 コミットしなくても、インサート処理自体はDBに反映されているのでしょうかね。 とすれば、後者の方法で問題ないことになりますね。 (ごちゃごちゃと、すみません。苦笑)

関連するQ&A

  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • c#でデータベースに接続して、sqlリソースファイ

    c#でデータベースに接続して、sqlリソースファイルに記入したselect文を使って、情報を取得する処理を作っているのですが、select文が、 select * from [DB].[スキーマ].[テーブル] where userID =‘11111111’ と、なっているのを、DBとuserIDは固定値ではないので、 select * from @DB.[スキーマ].[テーブル] where userID = @ID にしてリソースファイルに記入し、 c#側で@DBと@IDにパラメータ処理をして、情報を取得したいのですが、エラー発生してしまいます。 エラー内容 .の付近に不適切な… 恐らく@DB部分だと思うのですが、修正方法が分かりません。 分かる方、教えて下さるとうれしいです。 宜しくお願い致します。

  • PHP+ACCESSのデータベース接続について

    こんにちわ。PHP+ACCESSを使って、データベース接続を試みようとしておりますが、最初のところでつまづております。 <?php //データベースに接続する $DB = sqlite_open('db.mdb'); $SQL = "create table db (id integer ,name,time) $result = sqlite_query($DB, $SQL); ?> 上記のPHPで、ACCESSファイルを作成しましたが、作成したファイルを開くと、"データベース形式が認識できません"と表示し、データベースを閲覧することができません。 また、ACCESSから手動で作成したファイルをsqlite_openで接続しようとすると、sqlite_open(): file is encrypted or is not a database inエラーが表示接続することができません。 PHPとACCESSの相性の問題なのでしょうか。この原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか。 宜しくお願い致します。 【php4.3.10 SQLite Library2.8.14 ACCESS2000】

    • ベストアンサー
    • PHP
  • PHPでのsqlite_close();について。

    PHPでSQLiteを使って色々作ったりしている者ですが、sqlite_close();について質問があります。 例えば、 $db = sqlite_open("test.db"); と仮定して接続した時に、 sqlite_close($db); と明示的に切断(リソースの破棄)する必要があるのでしょうか?また、省略しても問題ないのでしょうか。 私の探し方が下手なのか、sqliteのマニュアルサイトばかりで希望の答えが見つかりませんでした。 どなたかご教授いただけませんか。 よろしくお願い致します。

    • 締切済み
    • PHP
  • sqliteでWHERE句に存在しないデータを削除

    PHPのsqliteで $sql=DELETE FROM TABLE WHERE C=データ $db->exec($sql) を使ったところ、WHERE句に存在しないデータがあると、エラーとなります。 sqliteで存在しなくてもエラーとならないような処理はどのようにしたらいいでしょうか?

  • 異なるデータベース間のリレーション

    phpmyadmin上の異なるデータベース間のテーブルでリレーションをかけたいのですが、うまくいきません。 new_linkフラグをtrueにすることで異なるデータベースを開くところまではできました。 アドバイスいただけないでしょうか。 ※DB1の中にtable1が、DB2の中にtable2がある //失敗する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql = "select * from table1,table2 where table1.id = table2.id"; $result = mysql_query($sql) or die(mysql_error()); メッセージ⇒Table 'DB2.table1' doesn't exist //これは成功する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql1 = "select * from table1"; $result1 = mysql_query($sql,$con1) or die(mysql_error()); $sql2 = "select * from table2"; $result2 = mysql_query($sql2,$con2) or die(mysql_error());

    • ベストアンサー
    • MySQL
  • 得られた処理結果を、その前の時点で使いたい。

    echo "項目数".$number; //「下記のwhile文を繰り返した回数」と同値 echo "<br>"; //項目表の作成開始(テーブル形式) echo "<table>"; if($db = sqlite_open($db_pass)){ $query = "SELECT id FROM tbl_test ORDER BY id DESC"; $result = sqlite_query($db, $query); $i = 0; while($data = sqlite_fetch_array($result)){ echo "<tr><td>項目".$data."</td></tr>"; $i++; } sqlite_close($db); } else{die("$dbオープンエラー");} echo "</table>"; //項目表作成完了 $number = $i; //while文を繰り返した回数を変数$numberに格納 //ここで得られた$numberを「項目表」の上で使いたい! /*======================================================== イメージとして、上のようなコードを書きましたが、実際には上のコードでは、言うまでもなくエラーとなります。 項目表を作成する前の時点では、$numberの中身は空っぽなのですから。 なお、ここでは例として、while文の中の処理を簡単なものにしていますが、実際には、100段くらいの長いコードになっています。 現状では、カウントするためだけに短くwhile文を書いて、カウント数を得てそれを使っていますが(以下参照)、賢い方法とは思えないので、質問しました。 ========================================================*/ //カウント用(カウントのみ行う。データ抽出・出力はしない) if($db = sqlite_open($db_pass)){ $query = "SELECT id FROM tbl_test ORDER BY id DESC"; $result = sqlite_query($db, $query); $i = 0; //カウントのみ行うので「$i++;」だけ書く。 while($data = sqlite_fetch_array($result)){ $i++; } sqlite_close($db); } else{die("$dbオープンエラー");} $number = $i; echo "項目数".$number; /*======================================================== そして、ここから、項目表を作るコードを書き始める。 つまり、データベースを開いて、データを抽出する処理を2度も繰り返しているわけです。 私が希望しているのは、1度に、データ抽出とカウントをまとめて行い、カウントで得た数値を、そのカウントの前の時点で使いたいということです。 =========================================================*/ //ここから、項目表の作成開始(テーブル形式) echo "<table>"; //データのみ抽出・出力(カウントは済んでいるため、する必要なし。) if($db = sqlite_open($db_pass)){ $query = "SELECT id FROM tbl_test ORDER BY id DESC"; $result = sqlite_query($db, $query); while($data = sqlite_fetch_array($result)){ echo "<tr><td>項目".$data."</td></tr>"; } else{die("$dbオープンエラー");} echo "</table>"; //項目表作成完了 /*======================================================== 質問内容は以上です。 質問文が長い割には、中身は至ってシンプルです。(笑) どのようなアドバイスを頂けるか分かりませんが、 「参照渡し」などで解決できるのかな??なんて思っています。 どなたか、賢い方法を教えて下さい。お願いします。 ========================================================*/

    • ベストアンサー
    • PHP
  • PHPでデータベース(mySQL)から値を取りだすには

    PHPで値をmySQLに保存するコードを作成するのに 成功したのはいいのですが、値を取り出して 出力するコードがうまく書けません ネットで調べてみたり、参考書を読んで やっているのですがうまくいきません こういうコードを書いたのですが <?php $conn=mysql_connect("localhost", "user", "pass"); if (!$conn) { die('接続失敗です。'.mysql_error()); } mysql_select_db("database", $conn); mysql_query("SET NAMES 'ja-utf8'", $conn); $sql='SELECT caram, FROM table'; $row=mysql_query($sql, $conn); $res=mysql_fetch_assoc($row); echo htmlspecialchars($res, ENT_QUOTES); mysql_close(); ?> どこが間違っているかご指摘いただけると ありがたいです。

    • 締切済み
    • PHP
  • IDとパスワードを認証すコードをかきましたが動きません

    phpの超初心者です、よろしくお願いします。 IDとパスワードを認証すコードをかきましたが動きません。 Formから別に使ったdbにあるIDとパスを見に行くコードでが、 dbにあるIDとパスと同じものを打ち込んでも認証しません、 また別のdbにあるIDとパスを打ち込んでも認証するときがあります。 一体どこが悪いのでしょうか。どこが悪いのかさっぱり分かりません。 よろしくお願いします。 --------------------------------------- <?php $conn = mysql_connect(localhost, "root", ""); //DBにコネクト mysql_select_db('login_test', $conn); //'login_test'をselect mysql_query('SET NAMES utf8'); //defalt $res_init=mysql_query('SELECT * from user'); //userからすべてのdataを取得 while($arr = mysql_fetch_assoc($res_init)){ //結果セットが無くなるまでループ foreach($arr as $k => $v){ echo "フィールド ".$k." の値は ".$v; echo "<br />"; } echo "<br />"; } //formからDATAを取得 $id=$_POST['input_ID']; $pass=$_POST['input_pass']; print("入力したid= ".$id." 入力したpass= ".$pass); //認証check if(auth ($id,$pass,$conn)===true){ print("認証成功"); } else{ print("認証不成功"); } //function function auth ($id,$pass,$conn){ $sql = "SELECT * from user WHERE user_id = $id AND password = '$pass'"; $res = mysql_query($sql, $conn); return $res; } ?> <form action="http://localhost/test/test.php" method="POST"> IDの入力:<input type="text" name="input_ID"><br /><br /> Passの入力:<input type="text" name="input_pass"><br /><br /> <input type="submit" name="delete_submit" value="送信"><br /> </form> </body> </html>

    • ベストアンサー
    • PHP
  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL