• 讲政德如何落到实处(专家观点) 2019-10-18
  • 解读习近平八一讲话:铭记辉煌历史 推进强军事业 2019-10-14
  • 吉祥法师:什么才是“相由心生”?了解一下 2019-10-14
  • 乌兰察布--内蒙古频道--人民网 2019-10-12
  • 游客被指捡石子砸老虎 北京野生动物园:正在核实 2019-10-12
  • 回复@老老保老张工:三大件为什么会让人自豪?因为你有钱都买不到,必须找关系批条子!所以结婚能有三大件,不仅表示有钱,还表示有关系。 2019-10-05
  • 致父亲——习近平与父亲的家国情 2019-10-04
  • 高清:葡萄牙明晨对阵西班牙 C罗领衔球队认真备战 2019-10-04
  • 明年起全国将全面供应“国六”汽柴油 2019-10-02
  • 流溪河森林公园美不胜收 2019-09-30
  • “工会是下岗职工真正的‘娘家’” 2019-09-30
  • 弘扬红船精神 当好勇立潮头城建排头兵 2019-09-27
  • ofo宣布全面取消免押金 还被曝出存在霸王条款 2019-09-27
  • 国务院关税税则委员会办公室有关负责人对自美部分进口商品加征关税的解读 2019-09-26
  • 3898元起vivo NEX发布:升降式前置镜头,正面全是屏幕 2019-09-26
  • 15选5走势图
    电话:13843226952
     
    工作时间:周一至周六:8:30-5:00  周日可联系客服QQ
       
      建站咨询㈠ 建站咨询㈡ 售后服务 售前咨询  
    关于阳光,吉林市网站建设,吉林市网站制作,网络公司
     当前位置:15选5走势图 >>> 网站优化

    2018年新疆招聘教师:PHPMyAdmin中sql-parser组件的使用

    日期:2016/12/27    来自:15选5走势图   作者:Admin   去百度查找  去Google查找

    15选5走势图 www.kdth.net phpMyAdmin是一款基于Web端运行的开源数据库管理工具,支持管理MySQL和MariaDB两种数据库。 phpMyAdmin的程序主要使用php和javascript开发,它的安装使用都比较简单而且已有很多相关介绍不再重复,今天要介绍的是源码中的一个核心组件sql-parser。

    sql-parser简介

    sql-parser组件的主要用途是对SQL语句进行词法分析、语法分析,继而可以实现对SQL语句的解构、加工、替换、再组装等需求,另外也可以对SQL进行highlight等处理。sql-parser由纯PHP语言实现,同时也是整个phpMyAdmin源码中为数不多的代码架构比较清晰且符合当前PHP界PSR标准规范的???。

    sql-parser组件安装

    需事先安装好php,git客户端,以及composer php包管理工具

    1
    [email protected]:~/tmp$ sudo git clone https://github.com/phpmyadmin/sql-parser.git
    2
     
    3
    [email protected]:~/tmp$ cd sql-parser && sudo composer install
    组件安装完毕,下面介绍具体的调用

    解析普通语句

    1
    require_once '../sql-parser/vendor/autoload.php';
    2
    use SqlParser\Parser;
    3
     
    4
    $query = 'SELECT * FROM t1 LEFT JOIN (t2, t3, t4) '
    5
        . 'ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)';
    6
     
    7
    $parser = new Parser($query);
    8
    $stmt = $parser->statements[0];
    9
    echo json_encode($stmt);
    运行结果中$parser变量是一个大对象,里面存储有对$query语句的词法分析结果$query->list,语法分析结果$query-statements,以及错误信息等。
    其中$query-statements的结构如下:

    01
    {"expr":
    02
    [{"database":null,"table":null,"column":null,"expr":"*","alias":null,"function":n
    03
    ull,"subquery":null}],"from":
    04
    [{"database":null,"table":"t1","column":null,"expr":"t1","alias":null,"function":
    05
    null,"subquery":null}],"partition":null,"where":null,"group":null,"having":null,"
    06
    order":null,"limit":null,"procedure":null,"into":null,"join":
    07
    [{"type":"LEFT","expr":{"database":null,"table":null,"column":null,"expr":"(t2,
    08
    t3, t4)","alias":null,"function":null,"subquery":null},"on":[{"identifiers":
    09
    ["t2","a","t1"],"isOperator":false,"expr":"(t2.a=t1.a"},{"identifiers":
    10
    [],"isOperator":true,"expr":"AND"},{"identifiers":
    11
    ["t3","b","t1"],"isOperator":false,"expr":"t3.b=t1.b"},{"identifiers":
    12
    [],"isOperator":true,"expr":"AND"},{"identifiers":
    13
    ["t4","c","t1"],"isOperator":false,"expr":"t4.c=t1.c)"}],"using":null}],"union":
    14
    [],"options":{"options":[]},"first":0,"last":50}
    解析事务

    01
    require_once '../sql-parser/vendor/autoload.php';
    02
    use SqlParser\Parser;
    03
     
    04
    $query = 'START TRANSACTION;' .
    05
        'SELECT @A:=SUM(salary) FROM table1 WHERE type=1;' .
    06
        'UPDATE table2 SET [email protected] WHERE type=1;' .
    07
        'COMMIT;';
    08
     
    09
    $parser = new Parser($query);
    10
    $stmt = $parser->statements[0];
    11
    echo json_encode($stmt);
    输出结果:

    01
    {"type":1,"statements":[{"expr":
    02
    [{"database":null,"table":null,"column":null,"expr":"@A:=SUM(salary)","alias":nul
    03
    l,"function":"SUM","subquery":null}],"from":
    04
    [{"database":null,"table":"table1","column":null,"expr":"table1","alias":null,"fu
    05
    nction":null,"subquery":null}],"partition":null,"where":[{"identifiers":
    06
    ["type"],"isOperator":false,"expr":"type=1"}],"group":null,"having":null,"order":
    07
    null,"limit":null,"procedure":null,"into":null,"join":null,"union":[],"options":
    08
    {"options":[]},"first":1,"last":19},{"tables":
    09
    [{"database":null,"table":"table2","column":null,"expr":"table2","alias":null,"fu
    10
    nction":null,"subquery":null}],"set":[{"column":"summary","value":"@A"}],"where":
    11
    [{"identifiers":
    12
    ["type"],"isOperator":false,"expr":"type=1"}],"order":null,"limit":null,"options"
    13
    :{"options":[]},"first":20,"last":35}],"end":
    14
    {"type":2,"statements":null,"end":null,"options":{"options":
    15
    {"1":"COMMIT"}},"first":36,"last":37},"options":{"options":{"1":"START
    16
    TRANSACTION"}},"first":0,"last":0}
    除以上两种语句之外,sql-parser还支持解析存储过程等几乎所有MySQL语法,不再一一举例。下面是其SQL构造器的用法举例。

    组装SQL语句

    组装select语句:

    01
    require_once '../sql-parser/vendor/autoload.php';
    02
     
    03
    use SqlParser\Components\OptionsArray;
    04
    use SqlParser\Components\Expression;
    05
    use SqlParser\Components\Condition;
    06
    use SqlParser\Components\Limit;
    07
    use SqlParser\Statements\SelectStatement;
    08
     
    09
    $stmt = new SelectStatement();
    10
     
    11
    $stmt->options = new OptionsArray(array('DISTINCT'));
    12
     
    13
    $stmt->expr[] = new Expression('sakila', 'film', 'film_id', 'fid');
    14
    $stmt->expr[] = new Expression('COUNT(film_id)');
    15
    $stmt->from[] = new Expression('', 'film', '');
    16
    $stmt->from[] = new Expression('', 'actor', '');
    17
    $stmt->where[] = new Condition('film_id > 10');
    18
    $stmt->where[] = new Condition('OR');
    19
    $stmt->where[] = new Condition('actor.age > 25');
    20
    $stmt->limit = new Limit(1, 10);
    21
     
    22
    var_dump($stmt->build());
    输出结果:

    1
    [email protected]:~/code/parserTest$ php build.php
    2
    string(137) "SELECT DISTINCT `sakila`.`film`.`film_id` AS `fid`, COUNT(film_id)
    3
    FROM `film`, `actor` WHERE film_id > 10 OR actor.age > 25 LIMIT 10, 1 "
    组装触发器语句:

    01
    require_once '../sql-parser/vendor/autoload.php';
    02
     
    03
    use SqlParser\Components\Expression;
    04
    use SqlParser\Components\OptionsArray;
    05
    use SqlParser\Statements\CreateStatement;
    06
     
    07
    $stmt = new CreateStatement();
    08
     
    09
    $stmt->options = new OptionsArray(array('TRIGGER'));
    10
    $stmt->name = new Expression('ins_sum');
    11
    $stmt->entityOptions = new OptionsArray(array('BEFORE', 'INSERT'));
    12
    $stmt->table = new Expression('account');
    13
    $stmt->body = 'SET @sum = @sum + NEW.amount';
    14
     
    15
    var_dump($stmt->build());
    输出结果:

    1
    [email protected]:~/code/parserTest$ php build.php
    2
    string(89) "CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum
    3
    = @sum + NEW.amount"
    SQL再加工

    多条语句一起加工处理:

    01
    require_once '../sql-parser/vendor/autoload.php';
    02
     
    03
    use SqlParser\Parser;
    04
    use SqlParser\Components\Expression;
    05
     
    06
    $query  = <<<str id="3" from="" change="" $statement_0="$parser-" 处理第一条语句="" parser($query);="" $parser="new" str;="" where="" tbl3="" *="" select="" null;="" not="" unsigned="" )="" 10="" int(="" `field_2`="" `field_1`="" `tbl`="" table="" alter="" auto_increment;="" null="" `uid`="">statements[0];
    07
    $statement_0->table  = new Expression(
    08
        'db2', 'tb2', ''
    09
    );
    10
    var_dump($statement_0->build());
    11
     
    12
    //处理第二条语句
    13
    $statement_1 = $parser->statements[1];
    14
    $statement_1->table  = new Expression(
    15
        'db3', 'tb3', ''
    16
    );
    17
    var_dump($statement_1->build());</str>
    输出结果:

    1
    [email protected]:~/code/parserTest$ php build.php
    2
    string(85) "ALTER TABLE `db2`.`tb2` CHANGE `uid` `uid` INT( 10 ) UNSIGNED NOT
    3
    NULL AUTO_INCREMENT"
    4
    string(78) "ALTER TABLE `db3`.`tb3` CHANGE `field_1` `field_2` INT( 10 ) UNSIGNED
    5
    NOT NULL"
    以上是sql-parser组件一些基本的用法示例,phpMyAdmin的sql-parser组件功能比较丰富和完备,本文限了篇幅不能详尽,有兴趣的读者可以通过阅读源码来了解更多高级的用法。

     
    上一篇:PHP学习知识流程
    下一篇:网站优化的关键?
      阳光新闻 更多>>>
    吉林网站建设_吉林网页制作-阳光新闻
    移动建站的优势在哪?
    如何规划网站的主题
    网站优化注意事项
    网站建设的趋势
    网站建设对企业发展有哪些助力
    小程序未来的市场前景
      招贤纳士 更多>>>
    诚聘销售精英合作伙伴
    诚招吉林市网站建设商务经理
    招聘吉林市网站建设技术员
    公司招收吉林市网站开发学员
    因业务发展需要特诚聘商务代表
      网站建设专题 更多>>>
    阳光科技为您提供网站改版服务
    为什么网页设计要简练?
    如何在百度提交收录,怎样让自己的网站排名
    什么样的网站最受访客喜欢?
    吉林市网站建设形式与内容应统一
    网站管理与团队经营的秘诀
    优质的单页网站如何创建
     
    Copyright © 2008-2019 15选5走势图, All Rights Reserved    
    电话:13843226952  联系人:王经理
    ICP备案号:吉ICP备10003760号   技术支持:15选5走势图
    打造好的15选5走势图!我们为您提供有品质的15选5走势图、15选5走势图、15选5走势图、15选5走势图、15选5走势图、15选5走势图服务!
  • 讲政德如何落到实处(专家观点) 2019-10-18
  • 解读习近平八一讲话:铭记辉煌历史 推进强军事业 2019-10-14
  • 吉祥法师:什么才是“相由心生”?了解一下 2019-10-14
  • 乌兰察布--内蒙古频道--人民网 2019-10-12
  • 游客被指捡石子砸老虎 北京野生动物园:正在核实 2019-10-12
  • 回复@老老保老张工:三大件为什么会让人自豪?因为你有钱都买不到,必须找关系批条子!所以结婚能有三大件,不仅表示有钱,还表示有关系。 2019-10-05
  • 致父亲——习近平与父亲的家国情 2019-10-04
  • 高清:葡萄牙明晨对阵西班牙 C罗领衔球队认真备战 2019-10-04
  • 明年起全国将全面供应“国六”汽柴油 2019-10-02
  • 流溪河森林公园美不胜收 2019-09-30
  • “工会是下岗职工真正的‘娘家’” 2019-09-30
  • 弘扬红船精神 当好勇立潮头城建排头兵 2019-09-27
  • ofo宣布全面取消免押金 还被曝出存在霸王条款 2019-09-27
  • 国务院关税税则委员会办公室有关负责人对自美部分进口商品加征关税的解读 2019-09-26
  • 3898元起vivo NEX发布:升降式前置镜头,正面全是屏幕 2019-09-26
  • 河南十一选五走势图带连线 幸运蛋蛋28pc开奖结果 幸运飞艇不定位345678打法 欢乐捕鱼大战破解版 如何靠网络挣钱 九赢娱乐开户网站 10075期双色球开奖号码 mlb正品棒球帽 浙江体彩20选5今天奖金 黑龙江36选7今日开奖 江苏快三开奖 威尼斯飞艇怎么玩 如何玩福彩快三稳赚 90期一肖中特 中彩票了怎么办