diff --git a/common/framework/db.php b/common/framework/db.php index 55dba31cd..b873761ff 100644 --- a/common/framework/db.php +++ b/common/framework/db.php @@ -933,10 +933,18 @@ class DB } else { - return preg_replace_callback('/(FROM|JOIN)\s+((?:`?\w+\`?)(?:\s+AS\s+`?\w+`?)?(?:\s*,\s*(?:`?\w+\`?)(?:\s+AS\s+`?\w+`?)?)*)/i', function($m) { - $tables = array_map(function($str) { - return preg_replace_callback('/`?(\w+)`?(?:\s+AS\s+`?(\w+)`?)?/i', function($m) { - return isset($m[2]) ? sprintf('`%s%s` AS `%s`', $this->_prefix, $m[1], $m[2]) : sprintf('`%s%s` AS `%s`', $this->_prefix, $m[1], $m[1]); + return preg_replace_callback('/((?:DELETE\s+)?FROM|JOIN|INTO|UPDATE)(?i)\s+((?:`?\w+\`?)(?:\s+AS\s+`?\w+`?)?(?:\s*,\s*(?:`?\w+\`?)(?:\s+AS\s+`?\w+`?)?)*)/', function($m) { + $type = strtoupper($m[1]); + $tables = array_map(function($str) use($type) { + return preg_replace_callback('/`?(\w+)`?(?:\s+AS\s+`?(\w+)`?)?/i', function($m) use($type) { + if ($type === 'FROM' || $type === 'JOIN') + { + return isset($m[2]) ? sprintf('`%s%s` AS `%s`', $this->_prefix, $m[1], $m[2]) : sprintf('`%s%s` AS `%s`', $this->_prefix, $m[1], $m[1]); + } + else + { + return sprintf('`%s%s`', $this->_prefix, $m[1]); + } }, trim($str)); }, explode(',', $m[2])); return $m[1] . ' ' . implode(', ', $tables); diff --git a/tests/unit/framework/DBTest.php b/tests/unit/framework/DBTest.php index b19f61df0..e9bfbdb86 100644 --- a/tests/unit/framework/DBTest.php +++ b/tests/unit/framework/DBTest.php @@ -81,6 +81,43 @@ class DBTest extends \Codeception\TestCase\Test $this->assertTrue($stmt->closeCursor()); } + public function testAddPrefixes() + { + $oDB = Rhymix\Framework\DB::getInstance(); + $prefix = Rhymix\Framework\Config::get('db.master.prefix'); + + $source = 'SELECT a, b, c FROM documents JOIN comments ON documents.document_srl = comment.document_srl WHERE documents.member_srl = ?'; + $target = 'SELECT a, b, c FROM `' . $prefix . 'documents` AS `documents` JOIN `' . $prefix . 'comments` AS `comments` ' . + 'ON documents.document_srl = comment.document_srl WHERE documents.member_srl = ?'; + $this->assertEquals($target, $oDB->addPrefixes($source)); + + $source = 'SELECT a AS aa FROM documents as foo JOIN bar ON documents.a = bar.a'; + $target = 'SELECT a AS aa FROM `' . $prefix . 'documents` AS `foo` JOIN `' . $prefix . 'bar` AS `bar` ON documents.a = bar.a'; + $this->assertEquals($target, $oDB->addPrefixes($source)); + + $source = 'INSERT INTO documents (a, b, c) VALUES (?, ?, ?)'; + $target = 'INSERT INTO `' . $prefix . 'documents` (a, b, c) VALUES (?, ?, ?)'; + $this->assertEquals($target, $oDB->addPrefixes($source)); + + $source = 'INSERT INTO documents (a, b, c) SELECT d, e, f FROM old_documents WHERE g = ?'; + $target = 'INSERT INTO `' . $prefix . 'documents` (a, b, c) SELECT d, e, f FROM `' . $prefix . 'old_documents` AS `old_documents` WHERE g = ?'; + $this->assertEquals($target, $oDB->addPrefixes($source)); + + $source = 'UPDATE documents SET a = ?, b = ? WHERE c = ?'; + $target = 'UPDATE `' . $prefix . 'documents` SET a = ?, b = ? WHERE c = ?'; + $this->assertEquals($target, $oDB->addPrefixes($source)); + + $source = 'DELETE FROM documents WHERE d = ?'; + $target = 'DELETE FROM `' . $prefix . 'documents` WHERE d = ?'; + $this->assertEquals($target, $oDB->addPrefixes($source)); + + $source = 'update documents set a = ?, b = ? where c = ?'; + $this->assertEquals($source, $oDB->addPrefixes($source)); + + $source = 'delete from documents where d = ?'; + $this->assertEquals($source, $oDB->addPrefixes($source)); + } + public function testIsTableColumnIndexExists() { $oDB = Rhymix\Framework\DB::getInstance();