プロが教える店舗&オフィスのセキュリティ対策術

参考書MySQL×PHP(技術評論社)を読んだり検索してサイトをいくつか見てるんですが、どうしてわからなかったのでここで質問させて下さい.

http://dev.mysql.com/doc/mysql/ja/select.html
によると
SQL_CALC_FOUND_ROWS(バージョン 4.0.0 以降)では、LIMIT 節を無視した場合に結果セットに含まれるすべてのレコード数を計算するよう MySQL に指示できる。 その後、SELECT FOUND_ROWS() を使用して、計算されたレコード数を取り出せる。
とありますが、意味がよく分りません
もう少し分りやすい説明をしてるサイトを教えていただけると助かります.

MySQLのデータ(テーブル・レコードセットなど)のテキストなどで格納されてるファイルはあるんですか

一つのphpファイルで2つ以上のデータベースを扱うことについて説明してあるサイトを教えて下さい

A 回答 (4件)

・SQL_CALC_FOUND_ROWS


mysql_num_rows()という関数があります。これはselect文の実行後にコールすると、取得したレコードの数を得る事ができます。で、ページングを行う時に、select * from table limit 10などとしますよね?このようなlimit付きクエリの直後mysql_num_rows()関数を呼ぶと、実際に取得したレコード数、10という数値が返ってきます。ですが、実際に取得した数ではなくlimitが仮になかったら取得できる総数を知りたいケースは多いですね。そういう時にこの句を使います。
select SQL_CALC_FOUND_ROWS * from table limit 10
このクエリを実行した後で
select found_rows();
というクエリを実行すると、limitを無視した全体のデータ総数を取得できます。

・MySQLのデータ
データファイルの格納位置はlinuxのrpmインストールの場合/var/lib/mysql/DB名/ですが、テキストファイルではありません。テキストで取得したい場合はクエリの結果をファイルにリダイレクトするなどして作成する必要があります。

・一つのphpファイルで2つ以上のデータベース
掲示板を作成して、そこに汎用の広告挿入システムを加えた場合など、複数のDBに同時アクセスするように組む事はあります。これについて何が知りたいですか?

ちなみに、質問が複数にわたる場合は、その数だけ質問を立ち上げた方が、答える方も答えやすいですし、のちのちの知的財産として考えると検索もしやすいと思いますので、次回からそうして下さい。
    • good
    • 0
この回答へのお礼

本当に感謝のありがとうさまます.
・SQL_CALC_FOUND_ROWS について
 かなり理解できたように気がします.
 あと、もうすこし、自分でも補うようにして調べてみます.

・MySQLのデータ
 わかりました.保存場所が分ったのは何かスッキリしました

・一つのphpファイルで2つ以上のデータベース
 私の場合は、例えば恋人紹介システムを作るときに
 恋人の現在住所をDBに登録しますが、
 住所の管理は都道府県コード(0~46のintデータ)と
 市・郡以下の住所(文字列)で2フィールド
 使って管理しようと思ってます
 このときに、恋人DBに都道府県マスタテーブルを
 入れておくようにしてしまうと
 他のDBで都道府県マスタを使うとき
 恋人DBから読んできて使ったり、他のDBにも
 都道府県マスタを入れておくのは
 非効率的なやり方だと思いました
 それよりも例えば、地名DBとかを独立に作って
 そこから、都道府県マスタを呼び出して
 使うようにしたいと思いました
 ですから、mysql_query関数,mysql_num_rows関数など
 で恋人DBでなく地名DBの(テーブルの)データを
 利用したいときは、どうすればいいか悩んでいます.
 mysql_query関数,mysql_result関数などでは
 DB名を指定する引数がないのでとくに悩んでいます.

>ちなみに、質問が複数にわたる場合は、
>その数だけ質問を立ち上げた方が、答える方も答えやすいですし、
>のちのちの知的財産として考えると検索もしやすいと思いますので、
>次回からそうして下さい。
はい、そうします.

お礼日時:2005/06/14 15:36

複数DB問題についてです。



改めて自分が書いた複数DBを使うスクリプトを見直していたのですが、その際は複数DBはもちろんですが、複数サーバーに接続していました。ですからいちいち接続し直してたんですね。更にうちではDB関連の関数はクラス化して使っていて、connectとselect_dbを一つのルーチンの中で行っています。同一の接続であれば再利用して再接続はしないはずなので、動作的にはmysql_select_dbでデータベースを切り替えているだけかも知れません。

で、色々試した結果この形になったんですよね。当然No3の方のご指摘のように、linkidを指定する方法も試しているはずなんですが、最終的になぜこういう形になったのか覚えていません(^^;。もう1年位前のスクリプトですので。この件で何かわかったら結果を教えてくれるとありがたいです。
    • good
    • 0
この回答へのお礼

いつもありがとうです
DB操作をクラスにして使っていることにすごい進化を感じました.私は当面は既存の構文を利用するだけだと思いますが合理的にまとめていくのがいいと思いました
とりあえずNo3様から教えて頂いた構文を検証してみようと思います
 結果が出たたらまた書き込みます

お礼日時:2005/06/16 21:11

>phpはdbへの接続を複数持つ事を考慮してないみたいですね。

直前の接続を利用する、といった感じになってます。
php4.3マニュアルから
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]])
int mysql_query ( string query, int [link_identifier])
int mysql_select_db ( string database_name, int [link_identifier])

php4.2 以降mysql_connectにnew_linkフラグを付けて接続IDの違うものを複数同時に持てるようですよ。

$link1 = mysql_connect("localhost", "username", "secret");
$link2 = mysql_connect("localhost", "username", "secret", true);
mysql_select_db ( "database_name1", $link1);
mysql_select_db ( "database_name2", $link2);
$sql = "select * from table1";
mysql_query ( $sql, $link1);
$sql = "select * from table2";
mysql_query ( $sql, $link2);

でも、ほんとに動くか検証してないので。
借り物サーバーでないなら、phpは最新versionにするのが吉かと思います。
    • good
    • 0
この回答へのお礼

すごくありがとうです
こういう知識を本当に生かしたいです
っていうかこれってphpのバージョンもそうだったということなんでしょうけどMySQLのバージョンにも関係していそうですね、あっ、ちがいますかphpでMySQLを扱うための関数なのでやっぱりphpのバージョンに関係するんですね

でもこの構文、なんか理解しにくいです
よーく読んでみるとこれは事実上同じconnectを区別して
複数のconnectがあるように表現してそれぞれのconnectに
DBを対応させることで、同じ接続の複数のDBを使えるようにしているのだろうと思いますが、このような考え方だとなんだか回りくどいです
私は、当面は同じconnectで複数のDBが使えればそれで足りるのですが、その場合だとconnectは一つだけ指定して
DBを複数指定するだけの方が分りやすいです
つまり、以下のような構文だと正直言ってスッキリ理解できたのにという思いです

$connect=mysql_connect("localhost","username","password");
$db1=mysql_select_db("database_name1",$connect);
$db2=mysql_select_db("database_name2",$connect);
$sql="select * from table1";
mysql_query($sql,$db1);
$sql="select * from table2";
mysql_query($sql,$db2);
こんな風に使えたらよかったなーと思いました
ですが、こういうこと言っても仕方ないので使える構文を理解して使いたいと思います
検証もしてみたいと思います

ついでに言うと次のような使い方ができて複数の接続にも対応していると嬉しいと思いました
$link1=mysql_connect("host1","username1","secret1");
$link2=mysql_connect("host2", "username2", "secret2");
mysql_select_db("database_name1",$link1);
mysql_select_db("database_name2",$link2);
$sql="select * from table1";
mysql_query($sql,$link1);
$sql="select * from table2";
mysql_query($sql,$link2);

お礼日時:2005/06/16 21:02

>mysql_query関数,mysql_result関数などではDB名を指定する引数がないのでとくに悩んでいます.



phpはdbへの接続を複数持つ事を考慮してないみたいですね。直前の接続を利用する、といった感じになってます。だから僕が複数dbを同時に使うアプリを制作した時、mysql_queryの前にその都度connectしていました。前回のクエリと同じDBであればその接続を再利用しますので、実際に接続しなおすのは前回と違うdbに接続する場合だけです。webサーバーとdbの間のネットワークが遅い場合にはネックになるかも知れませんが、実用上問題ないかな、と思いました。他にもっといい方法があればいいのですが、僕には見つけられませんでした。

いちいちコネクトするのでスクリプトが煩雑になってしまう可能性がありますが、このあたりはサブルーチンやクラス(理解できれば)を使ってdbアクセス絡みのルーチンをまとめる事で解決できると思います。

これと、都道府県DBを同じDB内に持つのとどちらが効率が良いかは、質問者の方が決めていいと思います。
    • good
    • 0
この回答へのお礼

本当にありがとうございます
私の方では
http://download.softagency.net/MySQL/doc/mysql/j …
mysql_select_db関数というものを見つけました

引数:db で指定されたデータベースを mysql で指定された接続のデフォルト(カレント)データベースにします。このデータベースは、その後実行されるクエリで明示的なデータベース指定子のないテーブル参照が行われる際のデフォルトになります。

と書いてあったので同じconnectで扱えるDBなら
指定子を付けることで2つ以上のDBを扱えるかもしれないと思いました
あるいはご回答にもあったようにmysql_select_dbを後から使えば後で指定したDBが有効になるかもしれないとも思いました

もう少し調べてみます.

お礼日時:2005/06/14 21:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!