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

📄 sqlparser.lib.php

📁 phpMyAdmin图形界面化操作,我已经配置好了,只要把解要压缩后的文件放到站点下就可以用了
💻 PHP
📖 第 1 页 / 共 5 页
字号:
            $d_cur_upper      = '';        }        for ($i = 0; $i < $arraysize; $i++) {            $t_bef_prev       = $t_prev;            $t_prev           = $t_cur;            $t_cur            = $t_next;            $d_bef_prev       = $d_prev;            $d_prev           = $d_cur;            $d_cur            = $d_next;            $d_bef_prev_upper = $d_prev_upper;            $d_prev_upper     = $d_cur_upper;            $d_cur_upper      = $d_next_upper;            if (($i + 1) < $arraysize) {                $t_next = $sql_array[$i + 1]['type'];                $d_next = $sql_array[$i + 1]['data'];                $d_next_upper = $t_next == 'alpha' ? strtoupper($d_next) : $d_next;            } else {                $t_next       = '';                $d_next       = '';                $d_next_upper = '';            }            //DEBUG echo "[prev: <strong>".$d_prev."</strong> ".$t_prev."][cur: <strong>".$d_cur."</strong> ".$t_cur."][next: <strong>".$d_next."</strong> ".$t_next."]<br />";            if ($t_cur == 'alpha') {                $t_suffix     = '_identifier';                if (($t_next == 'punct_qualifier') || ($t_prev == 'punct_qualifier')) {                    $t_suffix = '_identifier';                } elseif (($t_next == 'punct_bracket_open_round')                  && PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_function_name, $PMA_SQPdata_function_name_cnt)) {                    /**                     * @todo 2005-10-16: in the case of a CREATE TABLE containing                     * a TIMESTAMP, since TIMESTAMP() is also a function, it's                     * found here and the token is wrongly marked as alpha_functionName.                     * But we compensate for this when analysing for timestamp_not_null                     * later in this script.                     *                     * Same applies to CHAR vs. CHAR() function.                     */                    $t_suffix = '_functionName';                    /* There are functions which might be as well column types */                } elseif (PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_column_type, $PMA_SQPdata_column_type_cnt)) {                    $t_suffix = '_columnType';                    /**                     * Temporary fix for BUG #621357                     *                     * @todo FIX PROPERLY NEEDS OVERHAUL OF SQL TOKENIZER                     */                    if ($d_cur_upper == 'SET' && $t_next != 'punct_bracket_open_round') {                        $t_suffix = '_reservedWord';                    }                    //END OF TEMPORARY FIX                    // CHARACTER is a synonym for CHAR, but can also be meant as                    // CHARACTER SET. In this case, we have a reserved word.                    if ($d_cur_upper == 'CHARACTER' && $d_next_upper == 'SET') {                        $t_suffix = '_reservedWord';                    }                    // experimental                    // current is a column type, so previous must not be                    // a reserved word but an identifier                    // CREATE TABLE SG_Persons (first varchar(64))                    //if ($sql_array[$i-1]['type'] =='alpha_reservedWord') {                    //    $sql_array[$i-1]['type'] = 'alpha_identifier';                    //}                } elseif (PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_reserved_word, $PMA_SQPdata_reserved_word_cnt)) {                    $t_suffix = '_reservedWord';                } elseif (PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_column_attrib, $PMA_SQPdata_column_attrib_cnt)) {                    $t_suffix = '_columnAttrib';                    // INNODB is a MySQL table type, but in "SHOW INNODB STATUS",                    // it should be regarded as a reserved word.                    if ($d_cur_upper == 'INNODB' && $d_prev_upper == 'SHOW' && $d_next_upper == 'STATUS') {                        $t_suffix = '_reservedWord';                    }                    if ($d_cur_upper == 'DEFAULT' && $d_next_upper == 'CHARACTER') {                        $t_suffix = '_reservedWord';                    }                    // Binary as character set                    if ($d_cur_upper == 'BINARY' && (                      ($d_bef_prev_upper == 'CHARACTER' && $d_prev_upper == 'SET')                      || ($d_bef_prev_upper == 'SET' && $d_prev_upper == '=')                      || ($d_bef_prev_upper == 'CHARSET' && $d_prev_upper == '=')                      || $d_prev_upper == 'CHARSET'                      ) && PMA_STR_binarySearchInArr($d_cur, $mysql_charsets, count($mysql_charsets))) {                        $t_suffix = '_charset';                    }                } elseif (PMA_STR_binarySearchInArr($d_cur, $mysql_charsets, $mysql_charsets_count)                  || PMA_STR_binarySearchInArr($d_cur, $mysql_collations_flat, $mysql_collations_count)                  || ($d_cur{0} == '_' && PMA_STR_binarySearchInArr(substr($d_cur, 1), $mysql_charsets, $mysql_charsets_count))) {                    $t_suffix = '_charset';                } else {                    // Do nothing                }                // check if present in the list of forbidden words                if ($t_suffix == '_reservedWord' && PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_forbidden_word, $PMA_SQPdata_forbidden_word_cnt)) {                    $sql_array[$i]['forbidden'] = TRUE;                } else {                    $sql_array[$i]['forbidden'] = FALSE;                }                $sql_array[$i]['type'] .= $t_suffix;            }        } // end for        // Stores the size of the array inside the array, as count() is a slow        // operation.        $sql_array['len'] = $arraysize;        // DEBUG echo 'After parsing<pre>'; print_r($sql_array); echo '</pre>';        // Sends the data back        return $sql_array;    } // end of the "PMA_SQP_parse()" function   /**    * Checks for token types being what we want...    *    * @param  string String of type that we have    * @param  string String of type that we want    *    * @return boolean result of check    *    * @access private    */    function PMA_SQP_typeCheck($toCheck, $whatWeWant)    {        $typeSeperator = '_';        if (strcmp($whatWeWant, $toCheck) == 0) {            return TRUE;        } else {            if (strpos($whatWeWant, $typeSeperator) === FALSE) {                return strncmp($whatWeWant, $toCheck, strpos($toCheck, $typeSeperator)) == 0;            } else {                return FALSE;            }        }    }    /**     * Analyzes SQL queries     *     * @param  array   The SQL queries     *     * @return array   The analyzed SQL queries     *     * @access public     */    function PMA_SQP_analyze($arr)    {        if ($arr == array()) {            return array();        }        $result          = array();        $size            = $arr['len'];        $subresult       = array(            'querytype'      => '',            'select_expr_clause'=> '', // the whole stuff between SELECT and FROM , except DISTINCT            'position_of_first_select' => '', // the array index            'from_clause'=> '',            'group_by_clause'=> '',            'order_by_clause'=> '',            'having_clause'  => '',            'limit_clause'  => '',            'where_clause'   => '',            'where_clause_identifiers'   => array(),            'unsorted_query' => '',            'queryflags'     => array(),            'select_expr'    => array(),            'table_ref'      => array(),            'foreign_keys'   => array(),            'create_table_fields' => array()        );        $subresult_empty = $subresult;        $seek_queryend         = FALSE;        $seen_end_of_table_ref = FALSE;        $number_of_brackets_in_extract = 0;        $number_of_brackets_in_group_concat = 0;        $number_of_brackets = 0;        $in_subquery = false;        $seen_subquery = false;        $seen_from = false;        // for SELECT EXTRACT(YEAR_MONTH FROM CURDATE())        // we must not use CURDATE as a table_ref        // so we track whether we are in the EXTRACT()        $in_extract          = FALSE;        // for GROUP_CONCAT(...)        $in_group_concat     = FALSE;/* Description of analyzer results by lem9 * * db, table, column, alias * ------------------------ * * Inside the $subresult array, we create ['select_expr'] and ['table_ref'] arrays. * * The SELECT syntax (simplified) is * * SELECT *    select_expression,... *    [FROM [table_references] * * * ['select_expr'] is filled with each expression, the key represents the * expression position in the list (0-based) (so we don't lose track of * multiple occurences of the same column). * * ['table_ref'] is filled with each table ref, same thing for the key. * * I create all sub-values empty, even if they are * not present (for example no select_expression alias). * * There is a debug section at the end of loop #1, if you want to * see the exact contents of select_expr and table_ref * * queryflags * ---------- * * In $subresult, array 'queryflags' is filled, according to what we * find in the query. * * Currently, those are generated: * * ['queryflags']['need_confirm'] = 1; if the query needs confirmation * ['queryflags']['select_from'] = 1;  if this is a real SELECT...FROM * ['queryflags']['distinct'] = 1;     for a DISTINCT * ['queryflags']['union'] = 1;        for a UNION * ['queryflags']['join'] = 1;         for a JOIN * ['queryflags']['offset'] = 1;       for the presence of OFFSET * ['queryflags']['procedure'] = 1;    for the presence of PROCEDURE * * query clauses * ------------- * * The select is splitted in those clauses: * ['select_expr_clause'] * ['from_clause'] * ['group_by_clause'] * ['order_by_clause'] * ['having_clause'] * ['limit_clause'] * ['where_clause'] * * The identifiers of the WHERE clause are put into the array * ['where_clause_identifier'] * * For a SELECT, the whole query without the ORDER BY clause is put into * ['unsorted_query'] * * foreign keys * ------------ * The CREATE TABLE may contain FOREIGN KEY clauses, so they get * analyzed and ['foreign_keys'] is an array filled with * the constraint name, the index list, * the REFERENCES table name and REFERENCES index list, * and ON UPDATE | ON DELETE clauses * * position_of_first_select * ------------------------ * * The array index of the first SELECT we find. Will be used to * insert a SQL_CALC_FOUND_ROWS. * * create_table_fields * ------------------- * * For now, mostly used to detect the DEFAULT CURRENT_TIMESTAMP and * ON UPDATE CURRENT_TIMESTAMP clauses of the CREATE TABLE query. * An array, each element is the identifier name. * Note that for now, the timestamp_not_null element is created * even for non-TIMESTAMP fields. * * Sub-elements: ['type'] which contains the column type *               optional (currently they are never false but can be absent): *               ['default_current_timestamp'] boolean *               ['on_update_current_timestamp'] boolean *               ['timestamp_not_null'] boolean * * section_before_limit, section_after_limit * ----------------------------------------- * * Marks the point of the query where we can insert a LIMIT clause; * so the section_before_limit will contain the left part before * a possible LIMIT clause * * * End of description of analyzer results */        // must be sorted        // TODO: current logic checks for only one word, so I put only the        // first word of the reserved expressions that end a table ref;        // maybe this is not ok (the first word might mean something else)//        $words_ending_table_ref = array(//            'FOR UPDATE',//            'GROUP BY',//            'HAVING',//            'LIMIT',//            'LOCK IN SHARE MODE',//            'ORDER BY',//            'PROCEDURE',//            'UNION',//            'WHERE'//        );        $words_ending_table_ref = array(            'FOR',            'GROUP',            'HAVING',            'LIMIT',            'LOCK',            'ORDER',            'PROCEDURE',            'UNION',            'WHERE'        );

⌨️ 快捷键说明

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