MySQL: подготовка запросов (в который уже раз).
Собственно, выдрано из моего MySQL-класса и чуток переделано.
Юзаж:
new MkQuery(&$сюда-обработанный-запрос, $шаблон-запроса, $массив-значений)
Шаблон запроса
SELECT ... WHERE value=?<имя>[:|![<тип>]] ...
имя - соответствует $массив-значений['имя']
далее через сепаратор : или ! указывается тип, если тип не указан, подразумеваем строку, иначе:
i = integer
f = float
b = boolean (в MySQL обычно представляется как tinyint(1))
l = like (дополнительное экранирование _%)
N = null/not null
сепаратор ! означает, что значение получено не из GPC, то есть экранировать его надо в любом случае, независимо от magic_quotes.
Пример:
можно обойтись без класса, используя рег с евалом - переделки минимальные.
your comments.
PHP:
class MkQuery {
var $data;
function MkValue($matches)
{
@ list ($dummy, $value, $type) = $matches;
$value = isset($this->data[$value]) ? $this->data[$value] : NULL;
switch (substr($type,1,1)) {
case 'N':
return ($value === NULL) ? 'IS NULL' : 'IS NOT NULL';
case 'i':
return intval($value);
case 'f':
return floatval($value);
case 'b':
return $value?1:0;
default:
$magic = get_magic_quotes_gpc() && '!' != substr($type,0,1);
if ($magic && ini_get('magic_quotes_sybase')) {
$value = str_replace("''","'",$value);
$magic = false;
}
$value = "'" . ( $magic ? $value : mysql_escape_string($value)) . "'";
if (substr($type,1,1)=='l') $value = addcslashes($value, '%_');
}
return $value;
}
function MkQuery(&$mquery, $query, $data)
{
if (!is_array($data)) {
$mquery = false;
return;
}
$this->data = $data;
$mquery = preg_replace_callback(
'~\?([\w\d_]+)([:!][ifblN]?)?~',
array($this,'MkValue'),
$query
);
}
}
Юзаж:
new MkQuery(&$сюда-обработанный-запрос, $шаблон-запроса, $массив-значений)
Шаблон запроса
SELECT ... WHERE value=?<имя>[:|![<тип>]] ...
имя - соответствует $массив-значений['имя']
далее через сепаратор : или ! указывается тип, если тип не указан, подразумеваем строку, иначе:
i = integer
f = float
b = boolean (в MySQL обычно представляется как tinyint(1))
l = like (дополнительное экранирование _%)
N = null/not null
сепаратор ! означает, что значение получено не из GPC, то есть экранировать его надо в любом случае, независимо от magic_quotes.
Пример:
PHP:
new MkQuery(&$query, "select * from foo where b<>?x:b and N ?N:N and y=?y:f or text=?txt and l like ?lk:l limit ?lim:i",
array('x'=>true,'N'=>1,'y'=>'12.2a','lk'=>'a%_b','lim'=>'10.2 zzz\'', 'txt'=>$_POST['txt']));
echo $query;
your comments.