Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme Luiz

Fputcsv insere apenas uma linha

Recommended Posts

Olá pessoal,

 

Estou com um problema para escrever um arquivo csv utilizando a função FPUTCSV.

<?php 
$queryList  = "SELECT
wzap.id        as id,
wzap.mobile    as mobile,
wzap.ddi       as ddi,
wzap.pushname  as pushname,
wzap.photo     as photo,
wzap.dlr_date  as dataDlr,
case
  when wzap.status = '0' then 'Pendente'
  when wzap.status = '1' then 'Enviado'
  when wzap.status = '2' then 'Entregue'
  when wzap.status = '3' then 'Não entregue'
  when wzap.status = '4' then 'Rejeitado'
  when wzap.status = '5' then 'Expirou'
  when wzap.status = '6' then 'Agendado'
  when wzap.status = '7' then 'Falha'
end as status,
case
  when wzap.status = '1' and wzap.substatus = '1' then 'Processado'
  when wzap.status = '2' and wzap.substatus = '1' then 'Ok'
  when wzap.status = '6' and wzap.substatus = '1' then 'Processado'
  when wzap.status = '7' and wzap.substatus = '1' then 'Sem saldo'
  when wzap.status = '7' and wzap.substatus = '2' then 'Erro no processamento'
end as descricao,
wzap.cost      as tarifa,
wzap.currency  as moeda,
wzap.text      as texto,
w.country      as pais,
channel.name   as canalNome
FROM wzap_mt   as wzap
INNER JOIN worldwide   as w ON w.ddi = wzap.ddi
LEFT JOIN wzap_channel as channel ON channel.id = wzap.channel_id
WHERE wzap.user_id='{$userID}' and wzap.channel_id {$canalID} and wzap.dlr_date BETWEEN '".$inicio." 00:00:00' and '".$final." 23:59:59'
UNION ALL
SELECT
wzap.id        as id,
wzap.mobile    as mobile,
wzap.ddi       as ddi,
null           as pushname,
null           as photo,
wzap.dlr_date  as dataDlr,
case
  when wzap.status = '0' then 'Pendente'
  when wzap.status = '1' then 'Enviado'
  when wzap.status = '2' then 'Entregue'
  when wzap.status = '3' then 'Não entregue'
  when wzap.status = '4' then 'Rejeitado'
  when wzap.status = '5' then 'Expirou'
  when wzap.status = '6' then 'Agendado'
  when wzap.status = '7' then 'Falha'
end as status,
case
  when wzap.status = '1' and wzap.substatus = '1' then 'Processado'
  when wzap.status = '2' and wzap.substatus = '1' then 'Ok'
  when wzap.status = '6' and wzap.substatus = '1' then 'Processado'
  when wzap.status = '7' and wzap.substatus = '1' then 'Sem saldo'
  when wzap.status = '7' and wzap.substatus = '2' then 'Erro no processamento'
end as descricao,
wzap.cost      as tarifa,
wzap.currency  as moeda,
wzap.text      as texto,
w.country      as pais,
channel.name   as canalNome
FROM wzap_mt_temp as wzap
INNER JOIN worldwide   as w ON w.ddi = wzap.ddi
LEFT JOIN wzap_channel as channel ON channel.id = wzap.channel_id
WHERE wzap.user_id='{$userID}' and wzap.channel_id {$canalID} and wzap.dlr_date BETWEEN '".$inicio." 00:00:00' and '".$final." 23:59:59'
UNION ALL
SELECT
wzap.id        as id,
wzap.mobile    as mobile,
wzap.ddi       as ddi,
wzap.pushname  as pushname,
wzap.photo     as photo,
wzap.dlr_date  as dataDlr,
case
  when wzap.status = '8' then 'Recebido'
end as status,
case
  when wzap.status = '8' and wzap.substatus = '1' then 'Resposta recebida'
end as descricao,
wzap.cost      as tarifa,
wzap.currency  as moeda,
wzap.text      as texto,
w.country      as pais,
channel.name   as canalNome
FROM wzap_mo   as wzap
INNER JOIN worldwide   as w ON w.ddi = wzap.ddi
LEFT JOIN wzap_channel as channel ON channel.id = wzap.channel_id
WHERE wzap.user_id='{$userID}' and wzap.channel_id {$canalID} and wzap.dlr_date BETWEEN '".$inicio." 00:00:00' and '".$final." 23:59:59'
ORDER BY dataDlr DESC";
$sqlList = mysqli_query($connect_sql,$queryList);
while($data = mysqli_fetch_assoc($sqlList)){
  $stats[] = [
    "id"        => $data['id'],
    "mobile"    => $data['mobile'],
    "pais"      => $data['pais'],
    "nome"      => $data['pushname'],
    "canal"     => $data['canalNome'],
    "dataDlr"   => date("d/m/y H:i:sa", strtotime($data['dataDlr'])),
    "status"    => $data['status'],
    "desc"      => $data['descricao'],
    "tarifa"    => $data['tarifa'],
    "moeda"     => $data['moeda'],
    "texto"     => $data['texto']
  ];
}
$filename = sha1($userID.date("Y-m-d").rand(1,100000));
$header = ["ID","Número","País","Nome","Canal","DataStatus","Status","Descrição","Tarifa","Moeda","Texto"];
$file   = fopen(BASEPATH."/export/{$filename}.csv", 'w');

//TRECHO PROBLEMATICO ABAIXO
fputs($file, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
fputcsv($file,$header,",");
  foreach ($stats as $line) {
    fputcsv($file, $line,",");
  }
//TRECHO PROBLEMATICO ACIMA

$fileSize = filesize(BASEPATH."/export/{$filename}.csv");
?>

Meu código traz uma lista de uma consulta do meu banco de dados que fica salva no array $stats.

Ao fazer o debug do array $stats vejo que os dados são recebidos perfeitamente neste modelo
 

Array
(
    [id] => 25
    [mobile] => 5511945658451
    [pais] => Brasil
    [nome] => Guilherme
    [canal] => guilherme business
    [dataDlr] => 19/11/18 11:51:36am
    [status] => Entregue
    [desc] => Ok
    [tarifa] => 0.1
    [moeda] => BRL
    [texto] => envio via portal - teste de agenda - 11h50m

)
Array
(
    [id] => 28
    [mobile] => 5511950917200
    [pais] => Brasil
    [nome] => Comercial
    [canal] => guilherme business
    [dataDlr] => 19/11/18 11:51:27am
    [status] => Entregue
    [desc] => Ok
    [tarifa] => 0.1
    [moeda] => BRL
    [texto] => envio via portal - teste de agenda - 11h50m

)

Ao fazer o debug também do foreach da variavel $line eu também tenho todos os dados ou seja, minha busca no bd está ok e meu foreach também.
Assim deveria ser escrito meu CSV onde cada indice do array $stats é uma linha separados por virgula.


Porem meu csv quando visualizo, traz apenas uma linha no seguinte formato

ID,Número,País,Nome,Canal,DataStatus,Status,Descrição,Tarifa,Moeda,Texto
27,5511945658451,Brasil,Guilherme,"guilherme business","21/11/18 13:16:41pm",Entregue,Ok,0.1,BRL,"teste foto perfil
 

Já tentei de tudo e não consigo identificar o porque meu fputcsv está escrevendo apenas uma linha do meu array.
Vendo este código alguem conseguiria me dar uma luz/orientação?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Willian Simione
      Boa Noite, alguem poderia me ajudar em uma situação, estou tetnando gravar os dados da tela abaixo, porem nao estou conseguindo montar o jeito certo pra ele gravar todos os dados de uma vez

    • Por Giovanird
      Tenho uma tabela com a coluna média (valor decimal) .
       
      cod | media | cod_sala 1 1,98 5 2 2,34 2 3 1,32 5 4 2,51 3 5 1,65 1 6 2,78 5 7 4,95 4 8 0,75 4 9 1,23 1 10 1,63 2 11 1,55 3 Preciso no select MYSQL ou dentro do foreach multiplicar os valores do campo média, de acordo com o fitro por cod_sala
      Exemplo pelo cod_sala: 5
      Sendo o resultdo final: 1,98 * 1,32 * 2,78 = 7,26

      Desde já agradeço!
    • Por Giovanird
      Listo um array pelo foreach e preciso pegar os valores fora do foreach.
      Abaixo tenho o exemplo do foreach com os valores
       
      <?php foreach($turma $rsturma): if(($rsturma['id'] == 1){ echo $rsturma['nome']."<br>"; echo $rsturma['idade']."<br><br>"; } endforeach; //Dentro do foreach me retorna: Luis 13 Maria 12 Carlos 12 Matheus 14 Andréa 12 //Preciso pegar a posição e o valor desta lista $posicao1 = 1; $nome1 = Luis; $posicao2 = 2; $nome2 = Maria; $posicao3 = 3; $nome3 = Carlos; $posicao4 = 4; $nome4 = Matheus; $posicao5 = 5; $nome5 = Andréa;  
    • Por Ruyter
      Estou com problema para resolver uma solução que estou necessitando. Toda ajuda será bem-vinda!
       
      Tenho uma tabela onde há vários registros com um mesmo IDENTIFICADOR e vários INDENTIFICADORES diferentes em uma mesma coluna.
      Como percorrer os registros de uma tabela, com base nos IDENTIFICADORES?
      Preciso também analisar um período por data (>= e <=) e ABSTRAIR deste período o valor MIN e MAX de uma outra coluna
      Esta consulta precisa ser realizada em cada IDENTIFICADOR DISTINTO?
       
      Já utilizei o BETWEEN, mas ao usar o código com o foreach() no PHP ele lê apenas um registro.
      O código que estou trabalhando é este:
       
      SELECT conf_hidro_inatividade, cons_reg_ident_iot, cons_data, MIN(cons_leitura_atual), MAX(cons_leitura_atual), hidro_valvula, hidro_cliente FROM tab_conf_hidro, tab_consumo INNER JOIN tab_hidrometros ON cons_reg_ident_iot = hidro_ident_iot WHERE cons_reg_ident_iot = '20220701001' and conf_hidro_inatividade = 'sim' and hidro_valvula = 'aberta' and cons_data BETWEEN '2022-10-10' and '2022-10-13';  
      Com:

       
      SELECT conf_hidro_inatividade, cons_reg_ident_iot, cons_data, cons_leitura_atual, hidro_valvula, hidro_cliente /*(sem o MIN e MAX na mesma coluna)*/ WHERE cons_reg_ident_iot != ' ' and conf_hidro_inatividade = 'sim' and hidro_valvula = 'aberta';  
      usando dentro do foreach(), percorre todos os registros.
    • Por k9studio
      Meus amigos,
      preciso de um help
      seguinte tenho um credito quero lançar em varias faturas eum foreach até o valor do credito
      tipo exemplo a baixo:
      $credito = 100;
      foreach($shows as $rows){
      fatura 1 Valor 20,00  -100 marca como pago
      fatura 2 Valor 20,00  -80  marca como pago
      fatura 3 Valor 20,00  -60  marca como pago
      fatura 4 Valor 20,00  -40  marca como pago
      fatura 5 Valor 30,00  -20  aqui deixa como não pago
      }
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.