PMA\libraries\Linter::lint PHP Method

lint() public static method

Runs the linting process.
public static lint ( string $query ) : array
$query string The query to be checked.
return array
    public static function lint($query)
    {
        // Disabling lint for huge queries to save some resources.
        if (mb_strlen($query) > 10000) {
            return array(array('message' => __('Linting is disabled for this query because it exceeds the ' . 'maximum length.'), 'fromLine' => 0, 'fromColumn' => 0, 'toLine' => 0, 'toColumn' => 0, 'severity' => 'warning'));
        }
        /**
         * Lexer used for tokenizing the query.
         *
         * @var Lexer
         */
        $lexer = new Lexer($query);
        /**
         * Parsed used for analysing the query.
         *
         * @var Parser
         */
        $parser = new Parser($lexer->list);
        /**
         * Array containing all errors.
         *
         * @var array
         */
        $errors = ParserError::get(array($lexer, $parser));
        /**
         * The response containing of all errors.
         *
         * @var array
         */
        $response = array();
        /**
         * The starting position for each line.
         *
         * CodeMirror requires relative position to line, but the parser stores
         * only the absolute position of the character in string.
         *
         * @var array
         */
        $lines = static::getLines($query);
        // Building the response.
        foreach ($errors as $idx => $error) {
            // Starting position of the string that caused the error.
            list($fromLine, $fromColumn) = static::findLineNumberAndColumn($lines, $error[3]);
            // Ending position of the string that caused the error.
            list($toLine, $toColumn) = static::findLineNumberAndColumn($lines, $error[3] + mb_strlen($error[2]));
            // Building the response.
            $response[] = array('message' => sprintf(__('%1$s (near <code>%2$s</code>)'), $error[0], $error[2]), 'fromLine' => $fromLine, 'fromColumn' => $fromColumn, 'toLine' => $toLine, 'toColumn' => $toColumn, 'severity' => 'error');
        }
        // Sending back the answer.
        return $response;
    }

Usage Example

Esempio n. 1
0
<?php

/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
 * Represents the interface between the linter and  the query editor.
 *
 * @package PhpMyAdmin
 */
use PMA\libraries\Linter;
/**
 * Loading common files. Used to check for authorization, localization and to
 * load the parsing library.
 */
require_once 'libraries/common.inc.php';
/**
 * The SQL query to be analyzed.
 *
 * This does not need to be checked again XSS or MySQL injections because it is
 * never executed, just parsed.
 *
 * The client, which will recieve the JSON response will decode the message and
 * and any HTML fragments that are displayed to the user will be encoded anyway.
 *
 * @var string
 */
$sql_query = !empty($_POST['sql_query']) ? $_POST['sql_query'] : '';
// Disabling standard response.
PMA\libraries\Response::getInstance()->disable();
PMA_headerJSON();
echo json_encode(Linter::lint($sql_query));
All Usage Examples Of PMA\libraries\Linter::lint