【问题标题】:Check in PHP if MySQL Column in Table exists如果表中的 MySQL 列存在,则检查 PHP
【发布时间】:2013-07-02 15:18:09
【问题描述】:

我想使用 migrate-module 将 Drupal7 网站的内容迁移到另一个 Drupal7 系统。

我必须添加和映射字段。 drupal 中每种内容类型的字段都存储在一个名为field_revision_field_name 的表中。大多数字段的值在field_name_value 列中。但是有些字段有另一种结构,所以我想检查field_name_value列是否存在。

我正在循环连接表并在 mysql 查询中添加字段。问题是,并不是每个表"field_revision_".$typeFields[$i](别名是$typeFields[$i]."_table")都有一个列$typeFields[$i]."_value"

for ($i=0; $i < sizeof($typeFields); $i++) {
    $query->join(
        "field_revision_".$typeFields[$i], 
        $typeFields[$i]."_table", 
        "n.nid = ".$typeFields[$i]."_table.entity_id"
    );
    $query->addField($typeFields[$i]."_table", $typeFields[$i]."_value");       
}

我想在进行查询之前检查一下,如下所示:

for ($i=0; $i < sizeof($typeFields); $i++) {
  if($typeFields[$i]."_table" has Column $typeFields[$i]."_value"){
    $query->join(
        "field_revision_".$typeFields[$i], 
        $typeFields[$i]."_table", 
        "n.nid = ".$typeFields[$i]."_table.entity_id"
    );
    $query->addField($typeFields[$i]."_table", $typeFields[$i]."_value");
  }       
}

【问题讨论】:

  • 一般来说,数据库模式以这种方式是动态的设计是不好的。您尝试解决的哪些业务问题导致您使用动态模式?我担心这个问题可能是XY Problem的事件。
  • 动态模式意味着不断重建索引,不是吗?
  • 我有很多 $typeFields[$i]."_table 我认为这种方式比编写“数千”行代码更容易。只有 $typeFields[ $i] 更改(它是 drupal 内容类型的字段的名称)
  • 我想使用迁移模块将 Drupal7 网站的内容迁移到另一个 Drupal7 系统。我必须添加和映射字段。 drupal 中每种内容类型的字段都存储在一个名为“field_revision_field_name”的表中。大多数字段的值在“field_name_value”列中。但是有些字段有另一种结构,那是因为我想检查“field_name_value”列是否存在。
  • 你试过migrate_d2d吗?

标签: php mysql drupal drupal-7 migration


【解决方案1】:
  1. @eggyal 在 cmets 中说动态架构不好。
  2. information_schema 数据库上使用以下查询:

    SELECT *
    FROM `COLUMNS`
    WHERE TABLE_SCHEMA = 'database_name'
      AND TABLE_NAME = 'table_name'
      AND COLUMN_NAME = 'field_name'
    

【讨论】:

  • @dba 如果结果集中有一行,则该字段存在于表中。
【解决方案2】:

使用DESCRIBE 查询,其中列出了表中的列。 这是一个描述:http://dev.mysql.com/doc/refman/4.1/en/describe.html

【讨论】:

  • 我遇到了麻烦。如何检查一个特定表中是否存在一个特定列?
【解决方案3】:

确实是这样的 XY 问题。

D7 函数 field_info_field() 有关于存储数据的列的信息,所以我不必询问这些列是否存在。

谢谢你

【讨论】:

    【解决方案4】:

    也许这会有所帮助

    $fields = mysql_list_fields('database_name', 'table_name');
    $columns = mysql_num_fields($fields);
    for ($i = 0; $i < $columns; $i++) {$field_array[] = mysql_field_name($fields, $i);}
    if (!in_array('price', $field_array)){
      $result = mysql_query('ALTER TABLE table_name ADD price VARCHAR(10)');
    }
    

    【讨论】:

      【解决方案5】:

      这样怎么样:

      SELECT *
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_SCHEMA = 'database_name'
        AND TABLE_NAME = 'table_name'
        AND COLUMN_NAME = 'field_name'
      与上面类似

      【讨论】:

        猜你喜欢
        • 2012-08-19
        • 2010-12-05
        • 2023-03-26
        • 2014-06-24
        • 2017-07-13
        • 2011-05-16
        • 1970-01-01
        • 2014-08-25
        • 2013-05-12
        相关资源
        最近更新 更多