⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlparser.lib.php

📁 phpMyAdmin图形界面化操作,我已经配置好了,只要把解要压缩后的文件放到站点下就可以用了
💻 PHP
📖 第 1 页 / 共 5 页
字号:
        $words_ending_table_ref_cnt = 9; //count($words_ending_table_ref);        $words_ending_clauses = array(            'FOR',            'LIMIT',            'LOCK',            'PROCEDURE',            'UNION'        );        $words_ending_clauses_cnt = 5; //count($words_ending_clauses);        // must be sorted        $supported_query_types = array(            'SELECT'            /*            // Support for these additional query types will come later on.            'DELETE',            'INSERT',            'REPLACE',            'TRUNCATE',            'UPDATE'            'EXPLAIN',            'DESCRIBE',            'SHOW',            'CREATE',            'SET',            'ALTER'            */        );        $supported_query_types_cnt = count($supported_query_types);        // loop #1 for each token: select_expr, table_ref for SELECT        for ($i = 0; $i < $size; $i++) {//DEBUG echo "Loop1 <strong>"  . $arr[$i]['data'] . "</strong> (" . $arr[$i]['type'] . ")<br />";            // High speed seek for locating the end of the current query            if ($seek_queryend == TRUE) {                if ($arr[$i]['type'] == 'punct_queryend') {                    $seek_queryend = FALSE;                } else {                    continue;                } // end if (type == punct_queryend)            } // end if ($seek_queryend)            /**             * Note: do not split if this is a punct_queryend for the first and only query             * @todo when we find a UNION, should we split in another subresult?             */            if ($arr[$i]['type'] == 'punct_queryend' && ($i + 1 != $size)) {                $result[]  = $subresult;                $subresult = $subresult_empty;                continue;            } // end if (type == punct_queryend)// ==============================================================            if ($arr[$i]['type'] == 'punct_bracket_open_round') {                $number_of_brackets++;                if ($in_extract) {                    $number_of_brackets_in_extract++;                }                if ($in_group_concat) {                    $number_of_brackets_in_group_concat++;                }            }// ==============================================================            if ($arr[$i]['type'] == 'punct_bracket_close_round') {                $number_of_brackets--;                if ($number_of_brackets == 0) {                    $in_subquery = false;                }                if ($in_extract) {                    $number_of_brackets_in_extract--;                    if ($number_of_brackets_in_extract == 0) {                       $in_extract = FALSE;                    }                }                if ($in_group_concat) {                    $number_of_brackets_in_group_concat--;                    if ($number_of_brackets_in_group_concat == 0) {                       $in_group_concat = FALSE;                    }                }            }            if ($in_subquery) {                /**                 * skip the subquery to avoid setting                 * select_expr or table_ref with the contents                 * of this subquery; this is to avoid a bug when                 * trying to edit the results of                 * select * from child where not exists (select id from                 * parent where child.parent_id = parent.id);                 */                continue;            }// ==============================================================            if ($arr[$i]['type'] == 'alpha_functionName') {                $upper_data = strtoupper($arr[$i]['data']);                if ($upper_data =='EXTRACT') {                    $in_extract = TRUE;                    $number_of_brackets_in_extract = 0;                }                if ($upper_data =='GROUP_CONCAT') {                    $in_group_concat = TRUE;                    $number_of_brackets_in_group_concat = 0;                }            }// ==============================================================            if ($arr[$i]['type'] == 'alpha_reservedWord'//             && $arr[$i]['forbidden'] == FALSE) {            ) {                // We don't know what type of query yet, so run this                if ($subresult['querytype'] == '') {                    $subresult['querytype'] = strtoupper($arr[$i]['data']);                } // end if (querytype was empty)                // Check if we support this type of query                if (!PMA_STR_binarySearchInArr($subresult['querytype'], $supported_query_types, $supported_query_types_cnt)) {                    // Skip ahead to the next one if we don't                    $seek_queryend = TRUE;                    continue;                } // end if (query not supported)                // upper once                $upper_data = strtoupper($arr[$i]['data']);                /**                 * @todo reset for each query?                 */                if ($upper_data == 'SELECT') {                    if ($number_of_brackets > 0) {                        $in_subquery = true;                        $seen_subquery = true;                        // this is a subquery so do not analyze inside it                        continue;                    }                    $seen_from = FALSE;                    $previous_was_identifier = FALSE;                    $current_select_expr = -1;                    $seen_end_of_table_ref = FALSE;                } // end if (data == SELECT)                if ($upper_data =='FROM' && !$in_extract) {                    $current_table_ref = -1;                    $seen_from = TRUE;                    $previous_was_identifier = FALSE;                    $save_table_ref = TRUE;                } // end if (data == FROM)                // here, do not 'continue' the loop, as we have more work for                // reserved words below            } // end if (type == alpha_reservedWord)// ==============================            if ($arr[$i]['type'] == 'quote_backtick'             || $arr[$i]['type'] == 'quote_double'             || $arr[$i]['type'] == 'quote_single'             || $arr[$i]['type'] == 'alpha_identifier'             || ($arr[$i]['type'] == 'alpha_reservedWord'                && $arr[$i]['forbidden'] == FALSE)) {                switch ($arr[$i]['type']) {                    case 'alpha_identifier':                    case 'alpha_reservedWord':                        /**                         * this is not a real reservedWord, because it's not                         * present in the list of forbidden words, for example                         * "storage" which can be used as an identifier                         *                         * @todo avoid the pretty printing in color in this case                         */                        $identifier = $arr[$i]['data'];                        break;                    case 'quote_backtick':                    case 'quote_double':                    case 'quote_single':                        $identifier = PMA_unQuote($arr[$i]['data']);                        break;                } // end switch                if ($subresult['querytype'] == 'SELECT'                  && ! $in_group_concat                 && ! ($seen_subquery && $arr[$i - 1]['type'] == 'punct_bracket_close_round')) {                    if (!$seen_from) {                        if ($previous_was_identifier && isset($chain)) {                            // found alias for this select_expr, save it                            // but only if we got something in $chain                            // (for example, SELECT COUNT(*) AS cnt                            // puts nothing in $chain, so we avoid                            // setting the alias)                            $alias_for_select_expr = $identifier;                        } else {                            $chain[] = $identifier;                            $previous_was_identifier = TRUE;                        } // end if !$previous_was_identifier                    } else {                        // ($seen_from)                        if ($save_table_ref && !$seen_end_of_table_ref) {                            if ($previous_was_identifier) {                                // found alias for table ref                                // save it for later                                $alias_for_table_ref = $identifier;                            } else {                                $chain[] = $identifier;                                $previous_was_identifier = TRUE;                            } // end if ($previous_was_identifier)                        } // end if ($save_table_ref &&!$seen_end_of_table_ref)                    } // end if (!$seen_from)                } // end if (querytype SELECT)            } // end if (quote_backtick or double quote or alpha_identifier)// ===================================            if ($arr[$i]['type'] == 'punct_qualifier') {                // to be able to detect an identifier following another                $previous_was_identifier = FALSE;                continue;            } // end if (punct_qualifier)            /**             * @todo check if 3 identifiers following one another -> error             */            //    s a v e    a    s e l e c t    e x p r            // finding a list separator or FROM            // means that we must save the current chain of identifiers            // into a select expression            // for now, we only save a select expression if it contains            // at least one identifier, as we are interested in checking            // the columns and table names, so in "select * from persons",            // the "*" is not saved            if (isset($chain) && !$seen_end_of_table_ref             && ((!$seen_from && $arr[$i]['type'] == 'punct_listsep')              || ($arr[$i]['type'] == 'alpha_reservedWord' && $upper_data == 'FROM'))) {                $size_chain = count($chain);                $current_select_expr++;                $subresult['select_expr'][$current_select_expr] = array(                  'expr' => '',                  'alias' => '',                  'db'   => '',                  'table_name' => '',                  'table_true_name' => '',                  'column' => ''                 );                if (isset($alias_for_select_expr) && strlen($alias_for_select_expr)) {                    // we had found an alias for this select expression                    $subresult['select_expr'][$current_select_expr]['alias'] = $alias_for_select_expr;                    unset($alias_for_select_expr);                }                // there is at least a column                $subresult['select_expr'][$current_select_expr]['column'] = $chain[$size_chain - 1];                $subresult['select_expr'][$current_select_expr]['expr'] = $chain[$size_chain - 1];                // maybe a table                if ($size_chain > 1) {                    $subresult['select_expr'][$current_select_expr]['table_name'] = $chain[$size_chain - 2];                    // we assume for now that this is also the true name                    $subresult['select_expr'][$current_select_expr]['table_true_name'] = $chain[$size_chain - 2];                    $subresult['select_expr'][$current_select_expr]['expr']                     = $subresult['select_expr'][$current_select_expr]['table_name']                      . '.' . $subresult['select_expr'][$current_select_expr]['expr'];                } // end if ($size_chain > 1)                // maybe a db                if ($size_chain > 2) {                    $subresult['select_expr'][$current_select_expr]['db'] = $chain[$size_chain - 3];                    $subresult['select_expr'][$current_select_expr]['expr']                     = $subresult['select_expr'][$current_select_expr]['db']                      . '.' . $subresult['select_expr'][$current_select_expr]['expr'];                } // end if ($size_chain > 2)                unset($chain);                /**                 * @todo explain this:                 */                if (($arr[$i]['type'] == 'alpha_reservedWord')                 && ($upper_data != 'FROM')) {                    $previous_was_identifier = TRUE;                }            } // end if (save a select expr)            //======================================            //    s a v e    a    t a b l e    r e f            //======================================            // maybe we just saw the end of table refs            // but the last table ref has to be saved            // or we are at the last token            // or we just got a reserved word            /**             * @todo there could be another query after this one             */            if (isset($chain) && $seen_from && $save_table_ref             && ($arr[$i]['type'] == 'punct_listsep'               || ($arr[$i]['type'] == 'alpha_reservedWord' && $upper_data!="AS")               || $seen_end_of_table_ref               || $i==$size-1)) {                $size_chain = count($chain);                $current_table_ref++;                $subresult['table_ref'][$current_table_ref] = array(                  'expr'            => '',                  'db'              => '',                  'table_name'      => '',                  'table_alias'     => '',                  'table_true_name' => ''                 );                if (isset($alias_for_table_ref) && strlen($alias_for_table_ref)) {                    $subresult['table_ref'][$current_table_ref]['table_alias'] = $alias_for_table_ref;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -