【问题标题】:mysql create table with mix column static and dynamicmysql创建混合列静态和动态的表
【发布时间】:2018-07-02 16:31:19
【问题描述】:

我在使用 foreach 结果中的动态列创建表时遇到问题。

准备专栏的代码:

$fields = $wpdb->get_results("SELECT goal_id FROM wpgetyp_goalsettings WHERE goaltype IN('daily','weekly') AND user_id='$current_user->ID'");
foreach ($fields as $field) {
    $cfield = "field_$field->goal_id int(5) NOT NULL,";
}

结果:

field_1 int(5) NOT NULL,field_2 int(5) NOT NULL,field_3 int(5) NOT NULL,field_4 int(5) NOT NULL,field_5 int(5) NOT NULL,

创建表的代码:

$table_name = $wpdb->prefix.'user_'.$current_user->ID;
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
     //table not in database. Create new table
     $charset_collate = $wpdb->get_charset_collate();

     $sql = "CREATE TABLE $table_name (
          id int(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
          user_id varchar(15) NOT NULL,
          goals_type varchar(10) NOT NULL,
          goals_date date NOT NULL,
          start_time time NOT NULL,
          end_time time NOT NULL,
          $cfield
          lead_type varchar(50) NOT NULL,
          entry_date timestamp
     ) $charset_collate;";
     require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     dbDelta( $sql );
}
else{
}

注意$cfield。它只会在创建表时写入最后一个结果。只有field_5 将在表创建期间包含。

【问题讨论】:

    标签: php mysql database wordpress


    【解决方案1】:

    您正在用新值覆盖每个结果。相反,您需要连接所有这些值:

    $fields = $wpdb->get_results("SELECT goal_id FROM wpgetyp_goalsettings WHERE goaltype IN('daily','weekly') AND user_id='$current_user->ID'");
    $cfield = "";
    
    foreach ($fields as $field) {
        // Long way of string concatenation
        $cfield = $cfield . "field_$field->goal_id int(5) NOT NULL, ";
        // Short way, mentioned by @FrankerZ in the comments (chose one)
        // $cfield .= "field_$field->goal_id int(5) NOT NULL, ";
    }
    

    【讨论】:

    • 你可以简单地使用$cfield .= "..."
    【解决方案2】:

    您可以简单地使用array_map() 和implode() 来完成此操作:

    $cfield = implode(
        ', ',
        array_map(function($field) {
            return "field_$field->goal_id int(5) NOT NULL";
        }, $fields)
    );
    
    echo $cfield;
    

    上面的代码块也处理了最后悬空的,。示例见this output。

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      相关资源
      最近更新 更多