From 8de9131aadc70df3b1c6b44c00cc5c1336ab0ac2 Mon Sep 17 00:00:00 2001 From: hrach Date: Tue, 16 Sep 2014 13:18:14 +0200 Subject: [PATCH 1/3] SqlPreprocessor: fixed non-associative array detection --- src/Database/SqlPreprocessor.php | 2 +- tests/Database/SqlPreprocessor.phpt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Database/SqlPreprocessor.php b/src/Database/SqlPreprocessor.php index ddeb2af15..cef230048 100644 --- a/src/Database/SqlPreprocessor.php +++ b/src/Database/SqlPreprocessor.php @@ -138,7 +138,7 @@ private function formatValue($value) $value = iterator_to_array($value); } - if (isset($value[0])) { // non-associative; value, value, value + if (array_key_exists(0, $value)) { // non-associative; value, value, value foreach ($value as $v) { if (is_array($v) && isset($v[0])) { // no-associative; (value), (value), (value) $vx[] = '(' . $this->formatValue($v) . ')'; diff --git a/tests/Database/SqlPreprocessor.phpt b/tests/Database/SqlPreprocessor.phpt index a0f9bd767..1e6acca14 100644 --- a/tests/Database/SqlPreprocessor.phpt +++ b/tests/Database/SqlPreprocessor.phpt @@ -81,11 +81,11 @@ test(function() use ($preprocessor) { // where list($sql, $params) = $preprocessor->process(array('SELECT id FROM author WHERE', array( 'id' => NULL, 'name' => 'a', - 'born' => array(1, 2, 3), + 'born' => array(NULL, 1, 2, 3), 'web' => array(), ))); - Assert::same( reformat("SELECT id FROM author WHERE ([id] IS NULL) AND ([name] = 'a') AND ([born] IN (1, 2, 3)) AND (1=0)"), $sql ); + Assert::same( reformat("SELECT id FROM author WHERE ([id] IS NULL) AND ([name] = 'a') AND ([born] IN (NULL, 1, 2, 3)) AND (1=0)"), $sql ); Assert::same( array(), $params ); }); From 4025175159f1427079a578a71c90aeb7cf001d32 Mon Sep 17 00:00:00 2001 From: Patrik Kolbl Date: Wed, 17 Sep 2014 14:38:15 +0200 Subject: [PATCH 2/3] tests: updated ResultSet.fetchAssoc().phpt --- tests/Database/ResultSet.fetchAssoc().phpt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Database/ResultSet.fetchAssoc().phpt b/tests/Database/ResultSet.fetchAssoc().phpt index c793307ef..66768f58c 100644 --- a/tests/Database/ResultSet.fetchAssoc().phpt +++ b/tests/Database/ResultSet.fetchAssoc().phpt @@ -33,6 +33,16 @@ test(function() use ($context) { ), $pairs); }); +test(function() use ($context) { + $pairs = $context->query('SELECT id FROM book ORDER BY id')->fetchAssoc('id[]=id'); + Assert::equal(array( + 1 => array(1), + 2 => array(2), + 3 => array(3), + 4 => array(4), + ), $pairs); +}); + test(function() use ($context) { $pairs = $context->query('UPDATE author SET born = ? WHERE id = 11', new DateTime('2002-02-20')); From f0daef50a64dcc401652127f972e6aa94d138760 Mon Sep 17 00:00:00 2001 From: insekticid Date: Mon, 27 Oct 2014 13:14:34 +0100 Subject: [PATCH 3/3] Helpers::dumpSql() quotes strings using connection + test --- src/Bridges/DatabaseTracy/ConnectionPanel.php | 2 +- src/Database/Helpers.php | 9 ++-- tests/Database/Helpers.dumpSql.phpt | 45 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 tests/Database/Helpers.dumpSql.phpt diff --git a/src/Bridges/DatabaseTracy/ConnectionPanel.php b/src/Bridges/DatabaseTracy/ConnectionPanel.php index 099478835..63e7095a0 100644 --- a/src/Bridges/DatabaseTracy/ConnectionPanel.php +++ b/src/Bridges/DatabaseTracy/ConnectionPanel.php @@ -134,7 +134,7 @@ public function getPanel() $s .= "
explain"; } - $s .= '' . Helpers::dumpSql($sql, $params); + $s .= '' . Helpers::dumpSql($sql, $params, $connection); if ($explain) { $s .= ""; foreach ($explain[0] as $col => $foo) { diff --git a/src/Database/Helpers.php b/src/Database/Helpers.php index 2e0a6f599..5b5baf917 100644 --- a/src/Database/Helpers.php +++ b/src/Database/Helpers.php @@ -76,7 +76,7 @@ public static function dumpResult(ResultSet $result) * @param string * @return string */ - public static function dumpSql($sql, array $params = NULL) + public static function dumpSql($sql, array $params = NULL, Connection $connection = NULL) { static $keywords1 = 'SELECT|(?:ON\s+DUPLICATE\s+KEY)?UPDATE|INSERT(?:\s+INTO)?|REPLACE(?:\s+INTO)?|DELETE|CALL|UNION|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|OFFSET|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN|TRUNCATE'; static $keywords2 = 'ALL|DISTINCT|DISTINCTROW|IGNORE|AS|USING|ON|AND|OR|IN|IS|NOT|NULL|[RI]?LIKE|REGEXP|TRUE|FALSE'; @@ -109,7 +109,7 @@ public static function dumpSql($sql, array $params = NULL) }, $sql); // parameters - $sql = preg_replace_callback('#\?#', function() use ($params) { + $sql = preg_replace_callback('#\?#', function() use ($params, $connection) { static $i = 0; if (!isset($params[$i])) { return '?'; @@ -119,7 +119,10 @@ public static function dumpSql($sql, array $params = NULL) return '<binary>'; } elseif (is_string($param)) { - return '\'' . htmlspecialchars(Nette\Utils\Strings::truncate($param, Helpers::$maxLength)) . "'"; + $length = Nette\Utils\Strings::length($param); + $truncated = Nette\Utils\Strings::truncate($param, Helpers::$maxLength); + $text = htmlspecialchars($connection ? $connection->quote($truncated) : '\'' . $truncated . '\''); + return '' . $text . ''; } elseif (is_resource($param)) { $type = get_resource_type($param); diff --git a/tests/Database/Helpers.dumpSql.phpt b/tests/Database/Helpers.dumpSql.phpt new file mode 100644 index 000000000..3e91da981 --- /dev/null +++ b/tests/Database/Helpers.dumpSql.phpt @@ -0,0 +1,45 @@ +SELECT id \nFROM author \nWHERE id = 10 OR id = 11\n", Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE id = ? OR id = ?', array(10, 11), $connection)); +}); + +test(function() use ($connection) { // string check + Assert::same( +"
SELECT id \nFROM author \nWHERE name = 'Alexej Chruščev'
\n", Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE name = ?', array('Alexej Chruščev'), $connection)); +}); + +test(function() use ($connection) { // string check with \' + Assert::same( +"
SELECT id \nFROM author \nWHERE name = 'Alexej Ch\'ruščev'
\n", Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE name = ?', array("Alexej Ch'ruščev"), $connection)); +}); + +test(function() { // string check without connection + Assert::same( +"
SELECT id \nFROM author \nWHERE name = 'Alexej Ch'ruščev'
\n", Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE name = ?', array("Alexej Ch'ruščev"))); +}); + + +test(function() use ($connection) { // string compare with $connection vs without + Assert::notSame(Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE name = ?', array("Alexej Ch'ruščev"), $connection), Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE name = ?', array("Alexej Ch'ruščev"))); +}); + +test(function() use ($connection) { // string check with \' + Nette\Database\Helpers::$maxLength = 10; + Assert::same( +"
SELECT id \nFROM author \nWHERE name = 'Alexej Ch…'
\n", Nette\Database\Helpers::dumpSql('SELECT id FROM author WHERE name = ?', array("Alexej Ch'ruščev"), $connection)); +}); +