diff --git a/DataStorage/Database/Query/Grammar/Grammar.php b/DataStorage/Database/Query/Grammar/Grammar.php index 9054ab0ad..b338f4260 100644 --- a/DataStorage/Database/Query/Grammar/Grammar.php +++ b/DataStorage/Database/Query/Grammar/Grammar.php @@ -17,6 +17,7 @@ namespace phpOMS\DataStorage\Database\Query\Grammar; use phpOMS\DataStorage\Database\GrammarAbstract; use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\DataStorage\Database\Query\Column; +use phpOMS\DataStorage\Database\Query\Parameter; use phpOMS\DataStorage\Database\Query\QueryType; use phpOMS\DataStorage\Database\Query\Where; @@ -325,10 +326,6 @@ class Grammar extends GrammarAbstract protected function compileValue(Builder $query, $value, string $prefix = '') : string { if (\is_string($value)) { - if (\strpos($value, ':') === 0) { - return $value; - } - return $query->quote($value); } elseif (\is_int($value)) { return (string) $value; @@ -358,6 +355,8 @@ class Grammar extends GrammarAbstract return $encoded ? $encoded : 'NULL'; } elseif ($value instanceof \Serializable) { return $value->serialize(); + } elseif ($value instanceof Parameter) { + return $value->_toString(); } else { throw new \InvalidArgumentException(\gettype($value)); } diff --git a/DataStorage/Database/Query/Parameter.php b/DataStorage/Database/Query/Parameter.php new file mode 100644 index 000000000..c44181f0a --- /dev/null +++ b/DataStorage/Database/Query/Parameter.php @@ -0,0 +1,58 @@ +name = $name; + } + + /** + * Render the parameter as string + * + * @return string + * + * @since 1.0.0 + */ + public function __toString() + { + return ':' . $this->name; + } +} diff --git a/tests/DataStorage/Database/Query/BuilderTest.php b/tests/DataStorage/Database/Query/BuilderTest.php index 7a0afe640..521edf587 100644 --- a/tests/DataStorage/Database/Query/BuilderTest.php +++ b/tests/DataStorage/Database/Query/BuilderTest.php @@ -16,6 +16,7 @@ namespace phpOMS\tests\DataStorage\Database\Query; use phpOMS\DataStorage\Database\Connection\MysqlConnection; use phpOMS\DataStorage\Database\Query\Builder; +use phpOMS\DataStorage\Database\Query\Parameter; /** * @testdox phpOMS\tests\DataStorage\Database\Query\BuilderTest: Query builder for sql queries @@ -82,7 +83,7 @@ class BuilderTest extends \PHPUnit\Framework\TestCase self::assertEquals($sql, $query->select('a.test', 'b.test') ->from('a', 'b') - ->where('a.test', '=', ':abcValue') + ->where('a.test', '=', new Parameter('abcValue')) ->orderBy(['a.test', 'b.test', ], ['ASC', 'DESC', ]) ->toSql() ); @@ -159,7 +160,7 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'SELECT `a`.`test` FROM `a` WHERE `a`.`test` = :test GROUP BY `a`, `b`;'; - self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', ':test')->groupBy('a', 'b')->toSql()); + self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', new Parameter('test'))->groupBy('a', 'b')->toSql()); } /** @@ -222,7 +223,7 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'SELECT `a`.`test` FROM `a` WHERE `a`.`test` = :testWhere OR `a`.`test2` IN (\'a\', :bValue, \'c\');'; - self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', ':testWhere')->whereIn('a.test2', ['a', ':bValue', 'c'], 'or')->toSql()); + self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', new Parameter('testWhere'))->whereIn('a.test2', ['a', new Parameter('bValue'), 'c'], 'or')->toSql()); } /** @@ -313,7 +314,7 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'INSERT INTO `a` (`test`, `test2`) VALUES (:test, :test2);'; - self::assertEquals($sql, $query->insert('test', 'test2')->into('a')->values(':test', ':test2')->toSql()); + self::assertEquals($sql, $query->insert('test', 'test2')->into('a')->values(new Parameter('test'), new Parameter('test2'))->toSql()); } /** @@ -328,7 +329,7 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'DELETE FROM `a` WHERE `a`.`test` = :testVal;'; - self::assertEquals($sql, $query->delete()->from('a')->where('a.test', '=', ':testVal')->toSql()); + self::assertEquals($sql, $query->delete()->from('a')->where('a.test', '=', new Parameter('testVal'))->toSql()); } /** @@ -347,7 +348,7 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'UPDATE `a` SET `a`.`test` = 1, `a`.`test2` = :test2 WHERE `a`.`test` = :test3;'; - self::assertEquals($sql, $query->update('a')->set(['a.test' => 1])->set(['a.test2' => ':test2'])->where('a.test', '=', ':test3')->toSql()); + self::assertEquals($sql, $query->update('a')->set(['a.test' => 1])->set(['a.test2' => new Parameter('test2')])->where('a.test', '=', new Parameter('test3'))->toSql()); } /**