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); }
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; }