MySQL3.x.xだってEthna_AppObjectを使いたい場合

EthnaのEthna_AppObjectクラスはなかなか癖はありますが、ちょろっとした小規模のシステムの場合重宝する。
やっぱ楽なので。
古い環境(MySQL3.23.xとか)の場合、ちょっとばかり面倒な箇所があるので、こんなケースレアかもしれないけど、僕にはまだまだ必要なので晒しておく。

MySQLの3と4ではLIMIT/OFFSET句の書き方が違い、そこでこける。

ということで、Ethna_AppObject又はオーバーライドしたクラスの_getSQL_SearchProp()って関数を修正。
 // LIMIT, OFFSET
 $limit = "";

-if (is_null($count) == false) {
-    $limit = sprintf("LIMIT %d", $count);
-    if (is_null($offset) == false) {
-        $limit .= sprintf(" OFFSET %d", $offset);
-    }
-}

+if (is_null($count) == false) {
+    // mysqlの4.0.0未満かどうかのチェック
+    if (
+        ($this->db->type == "mysql") &&
+        (version_compare(
+               preg_replace('|[^0-9\.]|', '', @mysql_get_server_info()),
+               '4.0.0',
+               '<')
+        )
+    // mysqlの4.0.0未満の場合
+    ) {
+        if (is_null($offset) == false) {
+                $limit = sprintf("LIMIT %d", $offset).sprintf(", %d", $count);
+        } else {
+                $limit = "LIMIT 0".sprintf(", %d", $count);
+        }
+    // それ以外の場合(デフォルトのソースのまま)
+    } else {
+        $limit = sprintf("LIMIT %d", $count);
+        if (is_null($offset) == false) {
+            $limit .= sprintf(" OFFSET %d", $offset);
+        }
+    }
+}

MySQL以外のDBの時のは検証してないけど、多分いけるはず。
まー、新規で開発する場合はいらないけどね。

version_compare()とmysql_get_server_info()なんて関数があることにびっくり。
勉強になった。

コメント

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com