mirror of
https://github.com/dg/dibi.git
synced 2025-08-06 06:07:39 +02:00
implemented escapeLike() and modifiers %~like, %like~, %~like~
This commit is contained in:
@@ -278,6 +278,19 @@ class DibiFirebirdDriver extends DibiObject implements IDibiDriver, IDibiResultD
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -230,6 +230,20 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
$value = strtr($value, array("'" => "''", '%' => '[%]', '_' => '[_]', '[' => '[[]'));
|
||||||
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -232,6 +232,20 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
$value = strtr($value, array("'" => "''", '%' => '[%]', '_' => '[_]', '[' => '[[]'));
|
||||||
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -311,6 +311,20 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
$value = addcslashes(str_replace('\\', '\\\\', $value), "\x00\n\r\\'%_");
|
||||||
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -307,6 +307,20 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
$value = addcslashes(str_replace('\\', '\\\\', $value), "\x00\n\r\\'%_");
|
||||||
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -248,6 +248,20 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver, IDibiResultDrive
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
$value = strtr($value, array("'" => "''", '%' => '[%]', '_' => '[_]', '[' => '[[]'));
|
||||||
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -246,6 +246,19 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -281,6 +281,19 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -289,6 +289,19 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -255,6 +255,19 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDri
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -247,6 +247,20 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver, IDibiResultDr
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escapeLike($value, $pos)
|
||||||
|
{
|
||||||
|
$value = addcslashes($this->connection->escapeString($value), '%_\\');
|
||||||
|
return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'") . " ESCAPE '\\'";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes data from result set.
|
* Decodes data from result set.
|
||||||
* @param string value
|
* @param string value
|
||||||
|
@@ -114,11 +114,11 @@ final class DibiTranslator extends DibiObject
|
|||||||
(")((?:""|[^"])*)"| ## 5,6) "string"
|
(")((?:""|[^"])*)"| ## 5,6) "string"
|
||||||
(\'|")| ## 7) lone quote
|
(\'|")| ## 7) lone quote
|
||||||
:(\S*?:)([a-zA-Z0-9._]?)| ## 8,9) :substitution:
|
:(\S*?:)([a-zA-Z0-9._]?)| ## 8,9) :substitution:
|
||||||
%([a-zA-Z]{1,4})(?![a-zA-Z])|## 10) modifier
|
%([a-zA-Z~][a-zA-Z0-9~]{0,5})|## 10) modifier
|
||||||
(\?) ## 11) placeholder
|
(\?) ## 11) placeholder
|
||||||
)/xs',
|
)/xs',
|
||||||
*/ // note: this can change $this->args & $this->cursor & ...
|
*/ // note: this can change $this->args & $this->cursor & ...
|
||||||
. preg_replace_callback('/(?=[`[\'":%?])(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"|(\'|")|:(\S*?:)([a-zA-Z0-9._]?)|%([a-zA-Z]{1,4})(?![a-zA-Z])|(\?))/s',
|
. preg_replace_callback('/(?=[`[\'":%?])(?:`(.+?)`|\[(.+?)\]|(\')((?:\'\'|[^\'])*)\'|(")((?:""|[^"])*)"|(\'|")|:(\S*?:)([a-zA-Z0-9._]?)|%([a-zA-Z~][a-zA-Z0-9~]{0,5})|(\?))/s',
|
||||||
array($this, 'cb'),
|
array($this, 'cb'),
|
||||||
substr($arg, $toSkip)
|
substr($arg, $toSkip)
|
||||||
);
|
);
|
||||||
@@ -387,6 +387,15 @@ final class DibiTranslator extends DibiObject
|
|||||||
case 'SQL': // preserve as real SQL (TODO: rename to %sql)
|
case 'SQL': // preserve as real SQL (TODO: rename to %sql)
|
||||||
return (string) $value;
|
return (string) $value;
|
||||||
|
|
||||||
|
case 'like~': // LIKE string%
|
||||||
|
return $this->driver->escapeLike($value, 1);
|
||||||
|
|
||||||
|
case '~like': // LIKE %string
|
||||||
|
return $this->driver->escapeLike($value, -1);
|
||||||
|
|
||||||
|
case '~like~': // LIKE %string%
|
||||||
|
return $this->driver->escapeLike($value, 0);
|
||||||
|
|
||||||
case 'and':
|
case 'and':
|
||||||
case 'or':
|
case 'or':
|
||||||
case 'a':
|
case 'a':
|
||||||
|
@@ -166,6 +166,14 @@ interface IDibiDriver
|
|||||||
*/
|
*/
|
||||||
function escape($value, $type);
|
function escape($value, $type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes string for use in a LIKE statement.
|
||||||
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function escapeLike($value, $pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injects LIMIT/OFFSET to the SQL query.
|
* Injects LIMIT/OFFSET to the SQL query.
|
||||||
* @param string &$sql The SQL query that will be modified.
|
* @param string &$sql The SQL query that will be modified.
|
||||||
|
Reference in New Issue
Block a user