function expressionToSqlLists($name, $exp)
{
    $list = expressionToArray($exp);
    $bl = array();
    $wl = array();
    $cur_wl = true;
    //Заполняем списки.
    foreach ($list as $item) {
        if ($item[1] == 0) {
            //Игнорируем условие OR или AND.
            if (strcmp($item[0], 'OR') === 0 || strcmp($item[0], 'AND') === 0) {
                continue;
            }
            if (strcmp($item[0], 'NOT') === 0) {
                $cur_wl = false;
                //Или $cur_wl = !$cur_wl.
                continue;
            }
        }
        $item = str_replace("", "", $item[0]);
        //Заменяем спец. символ.
        if ($cur_wl) {
            $wl[] = $item;
        } else {
            $bl[] = $item;
        }
    }
    return "`{$name}_wl`='" . addslashes(count($wl) > 0 ? "" . implode("", $wl) . "" : '') . "'," . "`{$name}_bl`='" . addslashes(count($bl) > 0 ? "" . implode("", $bl) . "" : '') . "'";
}
Пример #2
0
function expressionToSql($exp, $column, $cs, $strong)
{
    $exp = trim($exp);
    if ($exp == '' || $exp == '*') {
        return '';
    }
    $list = expressionToArray($exp);
    //Обрабатыаем результат.
    $query = '';
    $qPrev = $q_cur = ' OR ';
    $qAddv = ' ';
    foreach ($list as $item) {
        if ($item[1] == 0) {
            $skip = 0;
            if (strcmp($item[0], 'OR') === 0) {
                $q_cur = ' OR ';
                $qAddv = ' ';
            } else {
                if (strcmp($item[0], 'AND') === 0) {
                    $q_cur = ' AND ';
                    $qAddv = ' ';
                } else {
                    if (strcmp($item[0], 'NOT') === 0) {
                        $q_cur = ' AND ';
                        $qAddv = ' NOT ';
                    } else {
                        $skip = 1;
                    }
                }
            }
            if ($skip == 0) {
                if ($q_cur != $qPrev && !empty($query)) {
                    $query = '(' . $query . ')';
                }
                $qPrev = $q_cur;
                continue;
            }
        }
        $s = str_replace(array('%', '_'), array('\\\\%', '\\\\_'), $item[0]);
        //Подменяем симолы *, ?.
        $len = strlen($s);
        for ($i = 0; $i < $len; $i++) {
            if (($c = ord($s[$i])) == 0x2a || $c == 0x3f) {
                //Подсчитываем количество слешей.
                $cc = 0;
                for ($k = $i - 1; $k >= 0 && ord($s[$k]) == 0x5c; $k--) {
                    $cc++;
                }
                //Подменяем.
                if ($cc % 2 == 0) {
                    $s[$i] = $c == 0x2a ? '%' : '_';
                }
            }
        }
        $s = stripslashes($s);
        if (!$strong) {
            $s = '%' . $s . '%';
        }
        $query .= (empty($query) ? '' : $q_cur) . $column . $qAddv . 'LIKE' . ($cs ? ' BINARY' : '') . ' \'' . addslashes($s) . '\'';
    }
    return '(' . $query . ')';
}
function expressionToSqlLists($name, $exp)
{
    $list = expressionToArray($exp);
    $bl = array();
    $wl = array();
    $cur_wl = true;
    //P-P ° RїRѕR "RЅSЏRμRј SЃRїReSЃRєRe.
    foreach ($list as $item) {
        if ($item[1] == 0) {
            //P-P ° RїRѕR "RЅSЏRμRј SЃRїReSЃRєRe.
            if (strcmp($item[0], 'OR') === 0 || strcmp($item[0], 'AND') === 0) {
                continue;
            }
            if (strcmp($item[0], 'NOT') === 0) {
                $cur_wl = false;
                //P-P ° RїRѕR "RЅSЏRμRј SЃRїReSЃRєRe.
                continue;
            }
        }
        $item = str_replace("", "", $item[0]);
        //P-P ° RјRμRЅSЏRμRј SЃRїRμS †. SЃReRјRІRѕR.
        if ($cur_wl) {
            $wl[] = $item;
        } else {
            $bl[] = $item;
        }
    }
    return "`{$name}_wl`='" . addslashes(count($wl) > 0 ? "" . implode("", $wl) . "" : '') . "'," . "`{$name}_bl`='" . addslashes(count($bl) > 0 ? "" . implode("", $bl) . "" : '') . "'";
}