我正在根据用户输入创建SQL查询:
// user input
$amount = '20';
// query in zend
$select->where('amount = ?', $amount );
现在根据新要求,用户也可以输入以下格式:
$amount = '20';
$amount = '<20';
$amount = '<=20';
$amount = '>20';
$amount = '>=20';
$amount = '=20';
我认为您了解新功能。那么如何解析$amount
变量以使其适合上述查询?我必须将number
和sign
与$amount
变量分开才能在正确位置使用它们。如果标记错误(i.e $amount='$%20'; )
,则应将其视为等号(i.e $amount='=20'; )
我应该采取什么方法来解决这个问题?
由于
答案 0 :(得分:2)
您可以使用以下正则表达式将它们分开:
preg_match('/(<|>|=|<=|>=)([0-9]+)/', $amount, $matches);
$sign=$matches[1];
$number=$matches[2];
更新:我对此进行了测试,发现它没有正确处理错误的迹象。我想出了以下代码似乎工作正常:
$amount=">=20";
preg_match('/([^0-9]*)([0-9]+)/', $amount, $matches);
$sign=preg_match('/^(>|<|=|<=|>=)$/', $matches[1]) ? $matches[1] : '=';
$number=$matches[2];
如果给定的字符串为>=20
,则签名为>=
且数字为“20”,如果给定的字符串为“%$ 20”,则签名为=
且编号为{{ 1}}。
答案 1 :(得分:2)
$parts = array();
if (preg_match('/^(\D+)?(\d+)$/', $amount, $parts)) {
$operator = (!in_array($parts[1], array('=', '<', '<=', '>=', '>'))) ? '=' : $parts[1];
$value = $parts[2];
$select->where('amount ' . $operator . ' ?', $value );
}
答案 2 :(得分:1)
如果用户可以使用值指定运算符,则必须小心。试试:
$input = '<=20';
$allowedOperators = array('<', '<=', '>', '>=', '=');
if ( in_array(substr($input,0,2), $allowedOperators) ) {
$operator = substr($input,0,2);
} else if ( in_array(substr($input,0,1), $allowedOperators) ) {
$operator = substr($input,0,1);
} else {
$operator = '=';
}
$amount = (int) substr($input, strlen($operator));
$select->where('amount ' . $operator . ' ?', $amount );