我正在努力寻找一种削减sql争论的好方法,我现在完成它的方式似乎可以使用很多改进。我试图转换被',&分开的争论。 < = =>'从字符串到SQL争论,如name ='ABC'OR name ='John Doe'。
所以
parseSQLOperators('dan,john&steven', 'username');
将创建
WHERE username= 'dan' OR username = 'john' AND username ='steven'
我有一个例子如何在下面完成,但我想知道是否有更好的方法。
public static function parseSQLOperators($string, $content_term, $encapsulate = TRUE) {
$string = trim($string);
$length = strlen($string);
$ADD_PREFIX = true;
$output = '';
for ($i = 0; $i < $length; $i++) {
if ($string[$i] == '!') {
$output .= ' ' . $content_term . '!=\'';
if ($i == 0) {
$ADD_PREFIX = false;
}
} else if ($string[$i] == '+') {
if (@$string[$i + 1] != '!') {
$output .= ' AND ' . $content_term . '=\'';
} else {
$output .= ' AND ';
}
} else if ($string[$i] == ',') {
if (@$string[$i + 1] != '!') {
$output .= ' OR ' . $content_term . '=\'';
} else {
$output .= ' OR ';
}
}
if ($string[$i] != '!' && $string[$i] != '+' && $string[$i] != ',') {
$output .= $string[$i];
if (@$string[$i + 1] == ',' || @$string[$i + 1] == '+' || @$string[$i + 1] == '!' || $i == $length || $i == $length - 1) {
$output .= '\'';
}
}
}//end for
if ($ADD_PREFIX == true) {
$output = $content_term . '=\'' . $output;
}
if ($encapsulate) {
$output = '(' . $output . ')';
}
return $output;
}//end parseSQLOperator
答案 0 :(得分:1)
在测试$string[$i]
的值时,您可以使用switch / case语句,如下所示:
switch ($string[$i])
{
case '!':
$output .= ' ' . $content_term . '!=\'';
if ($i == 0) {
$ADD_PREFIX = false;
break;
case '+':
if (@$string[$i + 1] != '!') {
$output .= ' AND ' . $content_term . '=\'';
} else {
$output .= ' AND ';
}
break;
case ',':
if (@$string[$i + 1] != '!') {
$output .= ' OR ' . $content_term . '=\'';
} else {
$output .= ' OR ';
}
}
default:
$output .= $string[$i];
if (@$string[$i + 1] == ',' || @$string[$i + 1] == '+' || @$string[$i + 1] == '!' || $i == $length || $i == $length - 1) {
$output .= '\'';
}
}