【问题标题】:How to fetch column names from 'MySQL Create Table' Query string?如何从“MySQL 创建表”查询字符串中获取列名?
【发布时间】:2011-08-01 05:55:41
【问题描述】:

我想在 PHP 中编写一个脚本,将“MySQL 创建表”查询作为字符串并将列名及其数据类型存储在数组中。

例如:

输入字符串:

CREATE TABLE `test` (
`col1` INT( 10 ) NOT NULL ,
`col2` VARCHAR( 50 ) NOT NULL ,
`col3` DATE NOT NULL
) ENGINE = MYISAM ;

输出:

array(
    array( 'name'=>'col1', 'type'=>'INT', 'size'=>'10' ),
    array( 'name'=>'col2', 'type'=>'VARCHAR', 'size'=>'50' ),
    array( 'name'=>'col3', 'type'=>'DATE', 'size'=>'' )
);

我没有直接执行查询的数据库访问权限。有没有为此或任何想法的 PHP 库?

谢谢

【问题讨论】:

  • 使用ORM,学说可以

标签: php mysql string-parsing


【解决方案1】:

使用 preg_match_all

preg_match_all("/`(.+)` (\w+)\(? ?(\d*) ?\)?/", $sql, $_matches, PREG_SET_ORDER);

这将生成一个类似的数组

array(
  array('`col1` INT( 10 )', 'col1', 'INT', '10'),
  array('`col2` VARCHAR( 50 )', 'col2', 'VARCHAR', '50'),
  array('`col3` DATE ', 'col3', 'DATE', '')
);

【讨论】:

    【解决方案2】:

    I don't have database access to executes queries directly. 如果没有它,将很难从数据库中获取任何数据...但是您可以使用:

    SELECT column_name as name, data_type as type, column_type as typeSize 
      FROM information_schema.columns 
      WHERE table_schema='db_name' AND table_name='table_name';
    

    【讨论】:

    • 不,不。我无法运行查询,甚至没有在系统上安装 mysql 数据库。我只想编写一个脚本来获取创建表查询字符串并解析它并从该查询中获取列名。我必须编写自己的字符串解析函数,或者有任何现有的实用程序吗???
    • mysql_query();上面的查询?哦,等等你想解析它来获取数据吗?你需要正则表达式。
    【解决方案3】:
    $query = "SELECT column_name as name, data_type as type, column_type as typeSize 
                FROM information_schema.columns 
                WHERE table_schema='db_name' AND table_name='table_name'";
    $viewArr=array();
    $tempArr=array();
    $resultSet=mysql_query($query) or trigger_error(mysql_error());
    while($row=mysql_fetch_array($resultSet)) {
        $viewArr[] = $row;
    }
    

    【讨论】:

    • 虽然你的代码设计不错,但实现很差
    【解决方案4】:

    您正在寻找的是一个 SQL 解析器。这应该会有所帮助: http://www.phpkode.com/scripts/item/sql-parse-convert-to-tree-array/

    【讨论】:

    • 根据他对 Khez 的回复,我相信他会这样做:“我只想编写一个脚本,该脚本将获取 Create table 查询字符串并对其进行解析并从该查询中获取列名。”跨度>
    【解决方案5】:

    只需运行“desc $tablename”:

    $res=mysql_query("desc $tablename", $db_handle);
    while ($r=mysql_fetch_assoc) {
        print_r($r);
    }
    

    【讨论】:

      【解决方案6】:
      $query = "CREATE TABLE `MyTable` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL DEFAULT '', `parent` INT(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=MYISAM AUTO_INCREMENT=4 DEFAULT CHARSET=UTF8";
      
      if (preg_match("/^(CREATE TABLE)+ (IF NOT EXISTS )?`([\S]+)\` \((.*)\) (.*)$/", $query, $_matches) ) {
        $table_name = $_matches[3];
        $fields = $_matches[4];
        if (preg_match_all("/`([\S^`]+)` (\w+)\(? ?(\d*) ?\)?/", $fields, $__matches, PREG_SET_ORDER)) {
          $tables[$table_name] = $__matches;
        }
      }; 
      print_r($tables);
      

      结果

      Array
              (
                  [MyTable] => Array
                      (
                          [0] => Array
                              (
                                  [0] => `id` INT(10)
                                  [1] => id
                                  [2] => INT
                                  [3] => 10
                              )
      
                          [1] => Array
                              (
                                  [0] => `name` VARCHAR(64)
                                  [1] => name
                                  [2] => VARCHAR
                                  [3] => 64
                              )
      
                          [2] => Array
                              (
                                  [0] => `parent` INT(10)
                                  [1] => parent
                                  [2] => INT
                                  [3] => 10
                              )
      
                      )
              )
      

      【讨论】:

        猜你喜欢
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        相关资源
        最近更新 更多