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:
@@ -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();
|
||||
|
@@ -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)))
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user