【问题标题】:Array push rows from SQL query来自 SQL 查询的数组推送行
【发布时间】:2015-12-22 15:56:46
【问题描述】:

我正在尝试将 SQL 查询中的行(结果)保存到 csv 文件中。 我正在使用数组推送来将结果放入列表中。后来我把这个列表中的数据放到了我的 csv 文件中。

我的代码:

    while ($row = $query->fetch_assoc()) 
{
    echo sprintf( $row['campaign']);
    array_push($list, $row['campaign']);

}

结果在那里,因为 sprintf 有效。问题在于array_push 的语法。我什至尝试过:

array_push($list, array(''.$row['campaign']);

我收到一个错误:

fputcsv() 期望参数 2 是数组

完整代码在这里:

    $list = array 
    (
        array('old_campaign_name', 'new_campaign_name') 
    );

// table 1
$sql = ('select distinct(campaign) as campaign from '.$table1.'');

// Run the query
$query = $Db->query($sql);

// Check for SQL errors
if ($Db->error) 
{
    return ($Db->error);
}

// Put data in the list

while ($row = $query->fetch_assoc()) 
{
    echo sprintf( $row['campaign']);
    array_push($list,$row['campaign'],'');

}

$fp = fopen($location, 'w');

foreach ($list as $fields) 
{
    fputcsv($fp, $fields);
}

fclose($fp);

【问题讨论】:

  • 您是要保存整行,还是只保存行中的campaign 值?不管怎样,看起来你可能不需要array_push。只需 $list[] = $row;$list[] = $row['campaign']; 即可。
  • 我需要使用array_push。因为在我的 csv 文件中,我不想丢失以前的属性。我只想添加新的。可能问题出在 fputcsv 上。
  • 为什么您的标题行有两列(旧的和新的广告系列名称),但您只在数据行中放置一列?
  • @Barmar 因为第二列必须为空白才能手动添加内容。

标签: php sql fputcsv array-push


【解决方案1】:

正如错误所说,fputcsv 期望您放入的每一行都是一个数组,因此它可以用逗号分隔元素来写出来。 $list 应该是一个二维数组,所以你需要在构建它时将一个数组推到它上面。

while ($row = $query->fetch_assoc() {
    $list[] = array($row['campaign']);
}

顺便说一句,$list[] = x 等同于 array_push($list, x)

【讨论】:

    【解决方案2】:

    当您最初创建$list 数组时,它是一个包含一个数组的数组。但是,当您从查询结果中向其添加更多值时,您会将字符串推送到它的末尾,而不是数组。实际上,您将制作类似的东西

    $list = array (
        array('old_campaign_name', 'new_campaign_name'),
        'first campaign',
        'second campaign',
        'etc.',
        ...
    );
    

    因此,当您循环 $list 时,第一个值应该与 fputcsv 一起使用,因为它是一个数组,但任何后续值都将是字符串而不是数组,并且会导致您看到的错误。

    您应该可以像这样填写$list

    while ($row = $query->fetch_assoc()) {
        $list[] = $row;
    }
    

    $list[] = $row 不会覆盖之前在$list 中的值。来自the PHP documentation for array_push

    注意:如果您使用 array_push() 向数组添加一个元素,最好使用 $array[] = 因为这样就没有调用函数的开销。

    【讨论】:

    • 那么,如何将结果保存在我的 CSV 文件中而不被覆盖?
    【解决方案3】:

    它是这样工作的:

    while ($row = $query->fetch_assoc()) 
    {
        // array_push($list,$row['campaign'],'');
        array_push($list,array($row['campaign'], ''));
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2019-05-12
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2015-07-24
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多