OSDN Git Service

CHANGE:一部メソッドの動作がPDOStatementでの定義と異なっていたのを修正。
[nucleus-jp/nucleus-next.git] / nucleus / libs / sql / MYSQLPDO.php
index 8c21819..2142ff5 100644 (file)
@@ -374,6 +374,7 @@ class MysqlPDOStatement implements Iterator
        private $dbcon;\r
        private $_queryString = '';\r
 \r
+       private $def_fetch_mode = PDO::FETCH_BOTH;\r
        private $def_col_num = 0;\r
        private $def_class_name = 'stdClass';\r
        private $def_ctorargs = null;\r
@@ -462,12 +463,17 @@ class MysqlPDOStatement implements Iterator
                return FALSE;\r
        }\r
 \r
-       public function fetch($fetch_style, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = 0)\r
+       public function fetch($fetch_style = PDO::ATTR_DEFAULT_FETCH_MODE, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = 0)\r
        {\r
                if ( !is_resource($this->result) || $cursor_orientation != PDO::FETCH_ORI_NEXT )\r
                {\r
                        return FALSE;\r
                }\r
+               \r
+               if ( $fetch_style == PDO::ATTR_DEFAULT_FETCH_MODE )\r
+               {\r
+                       $fetch_style = $this->def_fetch_mode;\r
+               }\r
 \r
                switch ( $fetch_style )\r
                {\r
@@ -478,9 +484,11 @@ class MysqlPDOStatement implements Iterator
                        case PDO::FETCH_NUM:\r
                                return @call_user_func(MysqlPDO::$handler . 'fetch_array', $this->result, MYSQL_NUM);\r
                        case PDO::FETCH_OBJ:\r
-                               return $this->fetchObject('stdClass');\r
-                       case PDO::FETCH_CLASS:\r
                                return $this->fetchObject();\r
+                       case PDO::FETCH_CLASS:\r
+                               return $this->fetchObject($this->def_class_name, $this->def_ctorargs);\r
+                       case PDO::FETCH_COLUMN:\r
+                               return $this->fetchColumn($this->def_col_num);\r
                        case PDO::FETCH_BOUND:\r
                                return FALSE; // Not supported\r
                        case PDO::FETCH_INTO:\r
@@ -492,42 +500,75 @@ class MysqlPDOStatement implements Iterator
                }\r
        }\r
 \r
-       public function fetchAll($fetch_style, $fetch_argument, $ctor_args = array())\r
+       public function fetchAll($fetch_style = PDO::ATTR_DEFAULT_FETCH_MODE, $fetch_argument = null, $ctor_args = array())\r
        {\r
-               if ( ($fetch_style & PDO::FETCH_COLUMN) != 0 )\r
+               if ( $fetch_style == PDO::ATTR_DEFAULT_FETCH_MODE )\r
                {\r
-                       return FALSE;\r
+                       $fetch_style = PDO::FETCH_BOTH;\r
                }\r
-\r
+               \r
                $ret = array();\r
-               while ( $row = $this->fetch(PDO::FETCH_BOTH) )\r
+               if ( ($fetch_style & PDO::FETCH_COLUMN) != 0 )\r
+               {\r
+                       if ( $fetch_style == PDO::FETCH_COLUMN )\r
+                       {\r
+                               $column = $fetch_argument == null ? 0 : intval($fetch_argument);\r
+                               while ( $row = $this->fetchColumn($column) )\r
+                               {\r
+                                       $ret[] = $row;\r
+                               }\r
+                       }\r
+                       elseif ( ($fetch_style & PDO::FETCH_UNIQUE) != 0 )\r
+                       {\r
+                               return FALSE;\r
+                       }\r
+                       elseif ( ($fetch_style & PDO::FETCH_GROUP) != 0 )\r
+                       {\r
+                               return FALSE;\r
+                       }\r
+               }\r
+               elseif ( $fetch_style == PDO::FETCH_CLASS )\r
+               {\r
+                       while ( $row = $this->fetchObject($fetch_argument, $ctor_args) )\r
+                       {\r
+                               $ret[] = $row;\r
+                       }\r
+               }\r
+               elseif ( $fetch_style == PDO::FETCH_FUNC )\r
+               {\r
+                       while ( $row = $this->fetch(PDO::FETCH_ASSOC) )\r
+                       {\r
+                               $ret[] = call_user_func_array($fetch_argument, array_values($row));\r
+                       }\r
+               }\r
+               else\r
                {\r
-                       $ret[] = $row;\r
+                       while ( $row = $this->fetch($fetch_style) )\r
+                       {\r
+                               $ret[] = $row;\r
+                       }\r
                }\r
                return $ret;\r
        }\r
 \r
-       public function fetchColumn($column_number = null)\r
+       public function fetchColumn($column_number = 0)\r
        {\r
-               if ( !isset($column_number) )\r
+               if ( $ret = $this->fetch(PDO::FETCH_NUM) )\r
                {\r
-                       $column_number = $this->def_col_num;\r
+                       return $ret[$column_number];\r
                }\r
-               $ret = $this->fetch(PDO::FETCH_NUM);\r
-               return $ret[$column_number];\r
+               return FALSE;\r
        }\r
 \r
-       public function fetchObject($class_name = null, $ctor_args = null)\r
+       public function fetchObject($class_name = 'stdClass', $ctor_args = null)\r
        {\r
-               $c_name = isset($class_name) ? $class_name : $this->def_class_name;\r
-               $c_args = isset($ctor_args) ? $ctor_args : $this->def_ctorargs;\r
-               if ( $c_args == null )\r
+               if ( is_array($ctor_args) && !empty($ctor_args) )\r
                {\r
-                       return @call_user_func(MysqlPDO::$handler . 'fetch_object', $this->result, $c_name);\r
+                       return @call_user_func(MysqlPDO::$handler . 'fetch_object', $this->result, $class_name, $ctor_args);\r
                }\r
                else\r
                {\r
-                       return @call_user_func(MysqlPDO::$handler . 'fetch_object', $this->result, $c_name, $c_args);\r
+                       return @call_user_func(MysqlPDO::$handler . 'fetch_object', $this->result, $class_name);\r
                }\r
        }\r
 \r
@@ -563,14 +604,7 @@ class MysqlPDOStatement implements Iterator
 \r
        public function rowCount()\r
        {\r
-               if ( @call_user_func(MysqlPDO::$handler . 'affected_rows', $this->result) == FALSE )\r
-               {\r
-                       return @call_user_func(MysqlPDO::$handler . 'num_rows', $this->result);\r
-               }\r
-               else\r
-               {\r
-                       return @call_user_func(MysqlPDO::$handler . 'affected_rows', $this->result);\r
-               }\r
+               return @call_user_func(MysqlPDO::$handler . 'affected_rows', $this->dbcon);\r
        }\r
 \r
        /**\r
@@ -595,6 +629,9 @@ class MysqlPDOStatement implements Iterator
                        case PDO::FETCH_INTO:\r
                                $this->bind_object = &$mode_argument;\r
                                return FALSE; // Not supported\r
+                       default:\r
+                               $this->def_fetch_mode = $mode;\r
+                               break;\r
                }\r
                return 1;\r
        }\r
@@ -610,7 +647,7 @@ class MysqlPDOStatement implements Iterator
 \r
        function valid()\r
        {\r
-               return ($this->iterator_value = $this->fetch(PDO::FETCH_BOTH));\r
+               return ($this->iterator_value = $this->fetch());\r
        }\r
 \r
        function current()\r