diff --git a/e107_handlers/e_db_pdo_class.php b/e107_handlers/e_db_pdo_class.php index c4a379b7a..5a4437a10 100644 --- a/e107_handlers/e_db_pdo_class.php +++ b/e107_handlers/e_db_pdo_class.php @@ -490,7 +490,7 @@ class e_db_pdo implements e_db * $array = e107::getDb()->retrieve(null, null, null, true, 'user_id'); * } * - * // Using whole query example, in this case default mode is 'single' + * // Using whole query example, in this case default mode is 'one' * $array = e107::getDb()->retrieve('SELECT * p.*, u.user_email, u.user_name FROM `#user` AS u * LEFT JOIN `#myplug_table` AS p ON p.myplug_table=u.user_id @@ -572,7 +572,10 @@ class e_db_pdo implements e_db { // gen() $select = false; - if($mode == 'one') $mode = 'single'; + if($mode == 'one' && !preg_match('/[,*]+[\s\S]*FROM/im',$table)) // if a comma or astericks is found before "FROM" then leave it in 'one' row mode. + { + $mode = 'single'; + } } // auto detect noWhere - if where string starts with upper case LATIN word elseif(!$where || preg_match('/^[A-Z]+\S.*$/', trim($where))) @@ -581,10 +584,11 @@ class e_db_pdo implements e_db $noWhere = true; } + // execute & fetch switch ($mode) { - case 'single': + case 'single': // single field value returned. if($select && !$this->select($table, $fields, $where, $noWhere, $debug)) { return null; @@ -597,7 +601,7 @@ class e_db_pdo implements e_db return array_shift($rows); break; - case 'one': + case 'one': // one row returned. if($select && !$this->select($table, $fields, $where, $noWhere, $debug)) { return array(); diff --git a/e107_handlers/mysql_class.php b/e107_handlers/mysql_class.php index 340779a21..ee1b8be0c 100644 --- a/e107_handlers/mysql_class.php +++ b/e107_handlers/mysql_class.php @@ -465,7 +465,7 @@ class e_db_mysql implements e_db * $array = e107::getDb()->retrieve(null, null, null, true, 'user_id'); * } * - * // Using whole query example, in this case default mode is 'single' + * // Using whole query example, in this case default mode is 'one' * $array = e107::getDb()->retrieve('SELECT * p.*, u.user_email, u.user_name FROM `#user` AS u * LEFT JOIN `#myplug_table` AS p ON p.myplug_table=u.user_id @@ -528,7 +528,10 @@ class e_db_mysql implements e_db { // gen() $select = false; - if($mode == 'one') $mode = 'single'; + if($mode == 'one' && !preg_match('/[,*]+[\s\S]*FROM/im',$table)) // if a comma or astericks is found before "FROM" then leave it in 'one' row mode. + { + $mode = 'single'; + } } // auto detect noWhere - if where string starts with upper case LATIN word elseif(!$where || preg_match('/^[A-Z]+\S.*$/', trim($where))) diff --git a/e107_tests/tests/unit/e_db_abstractTest.php b/e107_tests/tests/unit/e_db_abstractTest.php index a4ec94b45..8728c1bd2 100644 --- a/e107_tests/tests/unit/e_db_abstractTest.php +++ b/e107_tests/tests/unit/e_db_abstractTest.php @@ -218,10 +218,26 @@ abstract class e_db_abstractTest extends \Codeception\Test\Unit public function testRetrieve() { + // 'single' field value mode. + $expected = 'e107'; + $result = $this->db->retrieve('user', 'user_name', 'user_id = 1'); + $this->assertEquals($expected,$result); + + $result = $this->db->retrieve("SELECT user_name FROM #user WHERE user_id = 1"); + $this->assertEquals($expected,$result); + + // 'one' row mode. $expected = array ('user_id' => '1', 'user_name' => 'e107', ); $result = $this->db->retrieve('user', 'user_id, user_name', 'user_id = 1'); $this->assertEquals($expected,$result); + $result = $this->db->retrieve("SELECT user_id, user_name FROM #user WHERE user_id = 1"); + $this->assertEquals($expected,$result); + + $result = $this->db->retrieve("SELECT user_id, user_name FROM #user WHERE user_id = 1"); + $this->assertEquals($expected,$result); + + $result = $this->db->retrieve('user', 'missing_field, user_name', 'user_id = 1'); $this->assertEquals(array(),$result); @@ -233,7 +249,7 @@ abstract class e_db_abstractTest extends \Codeception\Test\Unit $result = $this->db->retrieve(null); $this->assertEquals($expected,$result); - + // 'multi' row mode. $expected = array ( 0 => array ( 'user_id' => '1', 'user_name' => 'e107', ),); $result = $this->db->retrieve('user', 'user_id, user_name', 'user_id = 1', true); $this->assertEquals($expected,$result);