예제 #1
0
function get_close_char($str, $pos, $ochar)
{
    $aCLOSE = array('\'' => '(?<!\\\\)\'|(\\\\+)\'', '"' => '(?<!\\\\)"', '/*' => '\\*\\/', '#' => '[\\r\\n]+', '--' => '[\\r\\n]+');
    if ($aCLOSE[$ochar] && preg_match("/(" . $aCLOSE[$ochar] . ")/", $str, $m, PREG_OFFSET_CAPTURE, $pos)) {
        $clchar = $m[1][0];
        $clpos = $m[1][1];
        $sl = strlen($m[2][0]);
        if ($ochar == "'" && $sl) {
            if ($sl % 2) {
                #don't count as CLOSE char if number of slashes before ' ODD
                list($clchar, $clpos) = get_close_char($str, $clpos + strlen($clchar), $ochar);
            } else {
                $clpos += strlen($clchar) - 1;
                $clchar = "'";
                #correction
            }
        }
    }
    return array($clchar, $clpos);
}
예제 #2
0
파일: index.php 프로젝트: noprom/cryptdb
function do_multi_sql($insql, $fname = '')
{
    set_time_limit(600);
    $sql = '';
    $ochar = '';
    $is_cmt = '';
    $GLOBALS['insql_done'] = 0;
    while ($str = get_next_chunk($insql, $fname)) {
        $opos = -strlen($ochar);
        $cur_pos = 0;
        $i = strlen($str);
        while ($i--) {
            if ($ochar) {
                list($clchar, $clpos) = get_close_char($str, $opos + strlen($ochar), $ochar);
                if ($clchar) {
                    if ($ochar == '--' || $ochar == '#' || $is_cmt) {
                        $sql .= substr($str, $cur_pos, $opos - $cur_pos);
                    } else {
                        $sql .= substr($str, $cur_pos, $clpos + strlen($clchar) - $cur_pos);
                    }
                    $cur_pos = $clpos + strlen($clchar);
                    $ochar = '';
                    $opos = 0;
                } else {
                    $sql .= substr($str, $cur_pos);
                    break;
                }
            } else {
                list($ochar, $opos) = get_open_char($str, $cur_pos);
                if ($ochar == ';') {
                    $sql .= substr($str, $cur_pos, $opos - $cur_pos + 1);
                    if (!do_one_sql($sql)) {
                        return 0;
                    }
                    $sql = '';
                    $cur_pos = $opos + strlen($ochar);
                    $ochar = '';
                    $opos = 0;
                } elseif (!$ochar) {
                    $sql .= substr($str, $cur_pos);
                    break;
                } else {
                    $is_cmt = 0;
                    if ($ochar == '/*' && substr($str, $opos, 3) != '/*!') {
                        $is_cmt = 1;
                    }
                }
            }
        }
    }
    if ($sql) {
        if (!do_one_sql($sql)) {
            return 0;
        }
        $sql = '';
    }
    return 1;
}