1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-02 04:40:44 +02:00

Fixes #4111 Inconsistent results under some circumstances with e107::getDb()->retrieve(). Tests have been added to this commit.

This commit is contained in:
Cameron
2020-03-13 15:06:26 -07:00
parent eb96f14fe9
commit 5471a84746
3 changed files with 30 additions and 7 deletions

View File

@@ -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();

View File

@@ -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)))

View File

@@ -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);