将占位符解析为SQL争论PHP

时间:2011-11-19 16:48:36

标签: php sql parsing

我正在努力寻找一种削减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

1 个答案:

答案 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 .= '\'';
            }
    }