Я пытаюсь сохранить строки (результаты) из запроса 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);
Как говорит ошибка, fputcsv
ожидает, что каждая строка, которую вы поместите, будет массивом, поэтому она может записать ее запятыми, разделяющими элементы. $list
должен быть двухмерным массивом, поэтому вам нужно вставить в него массив при его создании.
while ($row = $query->fetch_assoc() {
$list[] = array($row['campaign']);
}
КСТАТИ, $list[] = x
эквивалентно array_push($list, x)
,
Когда вы изначально создаете $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
, От документация PHP для array_push:
Примечание. Если вы используете array_push () для добавления одного элемента в массив, лучше использовать $ array [] =, потому что в этом случае нет необходимости вызывать функцию.
Это работает так:
while ($row = $query->fetch_assoc())
{
// array_push($list,$row['campaign'],'');
array_push($list,array($row['campaign'], ''));
}