【问题标题】:How to create a new array selected from a mysql database如何创建从 mysql 数据库中选择的新数组
【发布时间】:2014-02-04 17:13:13
【问题描述】:

我正在尝试使用 PHP 在 mysql 数据库中将数据从一个表移动到另一个表。原始表具有一对多关系中的数据。有一列包含 project_id (value_object_id - 这是多列),另一列 (value_field_id) 包含一个键,用于定义最后一列 (value_charvalue) 中存储的数据类型。我已经成功地能够使用以下代码提取所有数据,但无法弄清楚如何循环遍历每条记录以确定它是新的 project_id,在 value_field_id 列中包含 14、19 还是 20,以及如何将新记录的数据放入数组中。每条新记录都需要包含原始表中 3 条记录的信息。感谢您提供的任何帮助或指导。

<?php
$link = mysqli_connect("localhost", "username", "password", "test");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT value_object_id, value_field_id, value_charvalue FROM custom_fields_values ORDER BY value_object_id";

$result = mysqli_query($link, $query);

//  Add array for newly selected data????
//  $new_array = array();

/* numeric array */
while($row = mysqli_fetch_array($result, MYSQLI_NUM)) { 
    // Add test to determine if value_field_id is = 14, 19 or 20
    // $new_array[project_id] = value_object_id
    // If value_field_id = 19, $new_array[name] = value_charvalue
    // If value_field_id = 14, $new_array[email] = value_charvalue
    // If value_field_id = 20, $new_array[phone] = value_charvalue

    $project_id = $row[0];
    $next_row = $row[1];    
    $third_row = $row[2];
    printf('%s, %s, %s \n', $project_id, $next_row, $third_row);
    } 

/* free result set */
mysqli_free_result($result);

/* close connection */
mysqli_close($link);

?>

【问题讨论】:

  • 嗯,如果它来自来自一个表,并且需要进入另一个,那么写一个INSERT... SELECT...查询不是更简单吗?
  • 我可以为每条记录使用一个 INSERT 命令,但我面临着循环遍历每一行以确定它是否包含正确数据的挑战,因为许多行不需要移动。
  • 嗯,这就是WHERE 子句的用途?此外,SELECT 部分中可能还有 CASE 语句。

标签: php mysql arrays sorting


【解决方案1】:

使用WHERE value_field_id IN (14, 19, 20)

$query = "SELECT value_object_id, value_field_id, value_charvalue FROM custom_fields_values ORDER BY value_object_id";

变成

$query = "SELECT value_object_id, value_field_id, value_charvalue FROM custom_fields_values WHERE value_field_id IN (14, 19, 20) ORDER BY value_object_id";

并操作您想要的任何内容或直接插入到其他表中。

【讨论】:

    【解决方案2】:

    所以首先您需要确定 value_field_id 是 19、14 还是 20。

    // The field id's that you are interested in
    $value_field_ids = array(19, 14, 20);
    
    $project_id = array();
    
    // I'm not sure why you would prefer numeric ids instead of associative?
    while($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
    
        // Here we check if the value_field_id is 19, 14 or 20
        if(in_array($row[1], $value_field_ids)) {
            $project_id[] = array($row);
        }
    
        $project_id = $row[0];
        $next_row = $row[1];  
        $third_row = $row[2];   
        printf('%s, %s, %s \n', $project_id, $next_row, $third_row);
    }   
    
    // At this point you have the entire data stored in $result, as an array
    // Try var_dump($result);
    

    你有了它——你新创建的数组。

    【讨论】:

    • 我将 $result 更改为 $project_id = array();并保留 $result 以反映对 mysql 的原始调用。只有空返回。 $value_field_ids = 数组(19、14、20); $result = mysqli_query($link, $query); $projects = 数组(); while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { // 这里我们检查 value_field_id 是 19、14 还是 20 if(in_array($row[1], $value_field_ids)) { $projects[] = array( $行); } $project_id = $projects[0]; $next_row = $projects[1]; $third_row = $projects[2]; printf('%s, %s, %s \n', $project_id, $next_row, $third_row); }
    • 对,事情是这样的:$project_id[] = array($row);创建并填充一个多维数组。假设您的查询工作正常,取消注释我放在那里的最后一行,您将看到新创建的数组的确切结构——据我所知,这就是您想要做的。 $project_id = $projects[0] 将不正确,因为 $projects[0] 本身现在是一个数组。 $project_id 仍需为 $row[0]。其余部分也是如此。
    【解决方案3】:
    <?php
    
    $projects = [];
    
    while(...) {
      ...
    
      $fieldname = ...;
      $fieldvalue = ...;
    
      if (!isset($projects[$project_id]))
        $projects[$project_id] = [];
      $projects[$project_id][$fieldname] = $fieldvalue;
    }
    
    print_r($projects);
    

    如果您使用的是旧版本的 PHP,请将 [] 替换为 array()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2016-07-14
      • 1970-01-01
      • 2021-01-12
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多