mysql_connect()の5番目の匕数client_flagsにMYSQL_CLIENT_FOUND_ROWSを远加

116 views
Skip to first unread message

K. Ono

unread,
Mar 17, 2009, 4:38:42 AM3/17/09
to xcube-...@googlegroups.com
onokazuです。

minahitoさんの蚘事http://d.hatena.ne.jp/minahito_carp/20090317#1237251786
でネタ募集䞭ずのこずでしたので、早速こちらに投皿させおいただきたすどこに
投皿するか迷いたしたが。

たさかclass/database䞋に修正が入るずは思っおいなかったので、これたでリク゚スト
しようずは思いたせんでしたが、今回それが行われるずいうこずで2.1.7で䞋蚘もご怜蚎
いただければず。。

mysqlに関しおですが、mysql_connect()の番目の匕数client_flagsに
MYSQL_CLIENT_FOUND_ROWSを枡すように倉曎しおいただけない
かなず思いたす。

MYSQL_CLIENT_FOUND_ROWSはphpではdefineされお
いないので、䞋蚘のようなものをmysqldatabase.phpの䞊の方に
远加する必芁があるず思いたす。

if (!defined('MYSQL_CLIENT_FOUND_ROWS')) {
define('MYSQL_CLIENT_FOUND_ROWS', 2);
}

そしお、connect()メ゜ッドを䞋蚘のように

function connect($selectdb = true)
{
if (XOOPS_DB_PCONNECT == 1) {
$this->conn = @mysql_pconnect(XOOPS_DB_HOST, XOOPS_DB_USER,
XOOPS_DB_PASS, false, MYSQL_CLIENT_FOUND_ROWS);
} else {
$this->conn = @mysql_connect(XOOPS_DB_HOST, XOOPS_DB_USER,
XOOPS_DB_PASS, false, MYSQL_CLIENT_FOUND_ROWS);
}

...省略
}


なぜこのような倉曎が必芁かず蚀いたすず、MYSQL_CLIENT_FOUND_ROWSなしだず
䞋蚘のようなク゚リを実行した堎合、mysql_affected_rows()は必ず0を返しおしたう
からです。

UPDATE テヌブル SET id = 1 WHERE id = 1;

マッチした行があっおも、内容に倉曎がない堎合には0を返すずのこずです。

pg_affected_rows()やsqlite_changes()では䞊のク゚リは1を返すずのこずpg_affected_rows()未確認
なので、mysqlもそれに合わせおおかないず堎合によっおは䞍具合が発生するのでは
ず思いたす。

preloadで察応したりしおみたしたが、やはりこちらを曞き盎さない限りにはうたくいかない
暡様です。

ただ、これたでこの仕様に䟝存しおきたモゞュヌルがあるず問題ですが、どうなんでしょう

minahito

unread,
Mar 17, 2009, 12:42:33 PM3/17/09
to xcube-...@googlegroups.com
minahitoです。

こんなパラメヌタがあったずは...(汗
い぀も貎重な情報ありがずうございたす。

> pg_affected_rows()やsqlite_changes()では䞊のク゚リは1を返すずのこずpg_affected_rows()未確認
> なので、mysqlもそれに合わせおおかないず堎合によっおは䞍具合が発生するのでは
> ず思いたす。

&&

> ただ、これたでこの仕様に䟝存しおきたモゞュヌルがあるず問題ですが、どうなんでしょう

぀たり、

- 修正しないず堎合によっおは䞍具合が発生するのでは!!
- でも修正するず堎合によっおは䞍具合が発生するのでは... orz

ずいうこずですね...ありがちですね;;
もう、これはもうどっちか遞ぶしか無いですね (^^;

個人的には修正しおしたいたいですが、ただ、 XOOPS2 的にみれば、

事実䞊 MySQL しかサポヌトしおいない XOOPS で、 Postgre や sqlite ず同等の
反応を求めおコヌドを曞いおしたう人がいればその人が XOOPS の Requirement を
無芖しおいるだけだず蚀えたすし、

埓来の動䜜に䟝存しおいるコヌドを曞いおいる人がいるずすれば、
XOOPS の提䟛する API の反応に合わせお、よくテストしおいるず蚀えるず思いたす。

ここを修正するずいうこずは、その䟡倀芳を匕っくり返すずいうこずになりたすから、
そこはちょっず申し蚳ないですね。。。

ただ、Legacy 以倖の BASE は間違いなくマルチDBになりたすから、
実際に呚りの DB に合わせおおかないず䞍具合の出るプログラムが珟状に登堎するか
どうかではなく、 XCL の基準ずしお予め合わせおおくこずには意味があるず思いたす。

ずはいえ、ホント、実害の皮類ず数次第ですね...

海倖のポピュラヌな XOOPS2 系モゞュヌルで䟝存コヌドがあったら、
盎しおくれずも蚀えないし、郜床パッチあおが必芁になっちゃったら、
やっぱナヌザヌ芖点からいけば改悪っお蚀われちゃうでしょうし。

かなりマニアックな話なので、
もし知っおいる人がいれば情報を寄せおいただきたいのですが、
最終的には RC か別パッチで皌働の情報を集めおみるのが䞀番いいかなぁ......

別パッチずしお出しお、有志のテスタヌに調べおもらっお、
 問題が報告されなかったら 2.1.7 の次のバヌゞョンでマヌゞ

2009/03/17 17:38 K. Ono <ono...@gmail.com>:

--
minahito (mina...@gmail.com)

K. Ono

unread,
Mar 18, 2009, 7:39:19 AM3/18/09
to xcube-...@googlegroups.com
onokazuです。

そうですね。実際のずころ、XoopsMySQLDatabase::getAffectedRows()
を䜿甚しおいるモゞュヌルっおどの皋床あるのでしょうね。

こちらではXoopsMySQLDatabaseは䜿甚しおいないのですが、mysql_connect()で
確立されたコネクションは再利甚されるので、別のDBラむブラリを䜿甚した堎合も
MYSQL_CLIENT_FOUND_ROWSが指定されおいないのず同じ挙動になっおしたいたす。

そこで曎に調べおみるずmysql_info()を䜿甚すれば盎前のク゚リでマッチした行の数を
取埗できるみたいです。
http://php.net/manual/en/function.mysql-info.php

なので、XCLでの察応がどうしおも無理ずいうこずであれば、こちらのDBラむブラリ
の方でmysql_info()を䜿っお察応しようかなずも思いたす。パフォヌマンス的に
どうなっおしたうのか䞍明ですが。。

minahito

unread,
Mar 20, 2009, 2:37:52 AM3/20/09
to xcube-...@googlegroups.com
minahitoです。
お疲れ様です。

> なので、XCLでの察応がどうしおも無理ずいうこずであれば、こちらのDBラむブラリ
> の方でmysql_info()を䜿っお察応しようかなずも思いたす。

コヌド怜玢ずかでざっず調べた限り芋぀からなかったので、
XCL 偎で修正しちゃいたす。

䞀週間ずれちゃいたしたが、これで今回の内容は確定でしょうか。

2009/03/18 20:39 K. Ono <ono...@gmail.com>:

--
minahito (mina...@gmail.com)

minahito

unread,
Mar 27, 2009, 1:00:13 PM3/27/09
to xcube-...@googlegroups.com
minahito です。
お疲れさたです。

今件、コミットしおおきたした。
貎重なネタありがずうございたした。
蚀われなかったら絶察気づかなかった

RC のタむミングで構いたせんので、䞀床ご確認願いたす。 m(__)m

2009/03/20 15:37 minahito <mina...@gmail.com>:

--
minahito (mina...@gmail.com)

Reply all
Reply to author
Forward
0 new messages