Jump to content
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?

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Kefatif
      Prezados, bom dia.
       
      "Warning: Invalid argument supplied for foreach() in.... line 98"
       
      Sou novo na área e estou aprendendo, hoje me deparei com o erro supracitado, onde tenho uma query que atualiza os dados no meu banco mysql..
      $sql = "update TESTE_DISPENSACAO set DIAS_COBERTURA = '".$diascobertura."', DATA_DISPENSACAO = '".$datadispensacao."', PESO = '".$peso."', ID_TESTE = '".$idTESTE."', OBS = '".$obs."' where ID_TRATAMENTO = '".$idtratamento."'"; Porém ao atualizar o peso, ele apaga o id_teste ou se atualizar o id_teste ele apaga o peso.
       
      Segue abaixo a linha de onde a mensagem diz está o erro...
      $sqlTESTE = "select A.ID_TESTE, A.TESTE, B.ID_TRATAMENTO from TUBERCULOSE_TESTES A LEFT JOIN TESTE_DISPENSACAO B ON B.ID_TESTE = A.ID_TESTE WHERE B.ID_TRATAMENTO =".$idtratamento; $resultTESTE = mysqli_query($con, $sqlTESTE); $rowTESTE = mysqli_fetch_array($resultTESTE); foreach($rowTESTE as $key => $values){ $row[$key]= utf8_encode($values); }  
      Alguém poderia me explicar o porque do erro e como conserta-lo?
       
      Desconfio que ambos estão utilizando a mesma busca só sendo possível um resultado por vez, mas como estou aprendendo gostaria de confirmar e saber como consertar nesses casos.
       
      Agradeço desde já.
       
      Abs.
    • By marcossantana10
      Faço uma consulta no banco para buscar uma lista de horários, depois preciso comparar esse resultado com um array só de horários que eu possuo. Utilizei o código abaixo pra isso:
       
      //dados do array $h_indisponiveis separados por _ (ilustrativo) 13:20:00_13:40:00_14:00:00_14:20:00_18:40:00_19:00:00_21:20:00 $sql = "MINHA CONSULTA"; $sql=$pdo->query($sql); if ($sql->rowCount() > 0) { $result = array('error'=>false, 'data' => array()); foreach ($sql as $row) { $horario['id'] = $row['id']; $horario['hora'] = $row['hora']; $horario['tempo'] = $row['tempo']; for($i=0; $i<$sizeArray; $i++){ if ($h_indisponiveis[$i] == $row['hora']){ $horario['disponivel'] = 'n'; } else { $horario['disponivel'] = 's'; } } array_push($result['data'], $horario); } echo json_encode($result); }  
      O problema é que ele não está retornando todas as correspondências entre o objeto da consulta e o array, apenas a última. Ao invés de marcar 6 resultados como "disponivel = n", ele só marca um. Como posso corrigir
       

    • By Carlos Antoliv
      Então, eh algo até simples, problema de lógica e tudo.  Eu tinha feito, mas o codigo sumiu do nada e nao lembro mais da lógica que eu empregara.
       
      O enredo éh assim
       
      tabela_grupo_produtos
      e
      tabela tabela_produtos
       
      Na tabela_grupo_produtos tem:
      - informatica;
      - eletrodomestico;
      - brinquedos;
       
      na  tabela_produtos tem os podutos que são ligados a tabela de grupo de grupo de produtos:
       
      - informatica->notebook
      - informatica->computador
      - informatica->roteador
       
      - eletrodomestico->geladeira
      - eletrodomestico->microondas
      - eletrodomestico->fogao
       
      - brinquedos->lego
      - brinquedos->boneca
      - brinquedos->carrinhos
       
      O que estou tentando fazer é o seguinte:
       
      - informatica->notebook
                              ->computador
                              ->roteador
       
      - eletrodomestico->geladeira
                                     ->microondas
                                     ->fogao
       
      - brinquedos- >lego
                             -> boneca
                             ->carrinhos
       
       
      Ou seja, mostra na tela pelo "GRUPO" de produtos.
       
      fiz um select no banco....
      e tambem um foreach, mas tem algo que ta errado.
       
      Cheguei até executar dois selects distintos:
      EXEMPLO:

      <!--#################### CÓDIGO SESSÃO ################################ --> 
      <?php     session_start();     echo "Usuario: ". $_SESSION['usuarioNome'];         echo "<br>";     echo "Codigo:  ". $idSessao = $_SESSION['usuarioId']; ?>
      <br>
       
      <a href="sair.php">Sair</a> <!-- #####################FIM CODIGO SESSÃO ############################### --> <?php      $servername = "localhost"; $username = "root"; $password = ""; $database = ""; try {     $conexao2 = new PDO('mysql:host=localhost;dbname=banco', $username, $password);       $conexao2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   } catch(PDOException $e) {       echo 'ERROR: ' . $e->getMessage();   }          $sql2 = "SELECT pdos.fk_usuarios, pdos.nome_prod, pdo.nome_produto, nome_grupo_prod, pdos.foto, pdos.desc_prod, pdos.peso_liq_prod, pdos.qtd_prod, pdos.id_prod, pdos.un_medida     FROM tb_produtos AS pdos     JOIN tb_produto AS pdo ON pdos.nome_prod = pdo.id_produto     JOIN tb_grupo_prod AS gpdo      ON gpdo.id_grupo_prod = pdos.fk_tb_grupo_prod      INNER JOIN usuarios As usu     ON pdos.fk_usuarios = usu.id  ";     $stm2 = $conexao2->prepare($sql2);     $stm2->execute();     $kit3 = $stm2->fetchAll(PDO::FETCH_OBJ); ?> <?php require 'database/conexao.php'; // Recebe o termo de pesquisa se existir $termo = (isset($_GET['termo'])) ? $_GET['termo'] : ''; // Verifica se o termo de pesquisa está vazio, se estiver executa uma consulta completa if (empty($termo)):     $conexao = conexao::getInstance();     $sql = 'SELECT DISTINCT item.fk_tb_produtos, usu.nome, prod.nome_produto, prods.desc_prod, prods.peso_liq_prod, prods.un_medida, item.fk_tb_kit, kit.nome_kit, kit.preco_kit, prods.qtd_prod, kit.id_nome_kit, kit.desc_kit FROM tb_itemprodkit item /* tb_itemprodkit*/ INNER JOIN usuarios usu        /* usuarios*/ ON item.fk_usuarios = usu.id INNER JOIN tb_produtos prods  /* tb_produtos */ ON item.fk_tb_produtos = prods.id_prod INNER JOIN tb_kit kit       /*tb_kit */ ON item.fk_tb_kit = kit.id_nome_kit INNER JOIN tb_produto prod ON prods.nome_prod = prod.id_produto  WHERE fk_usuario = 5 GROUP BY kit.id_nome_kit  ';     $stm = $conexao->prepare($sql);     $stm->execute();     $kit = $stm->fetchAll(PDO::FETCH_OBJ); else:     // Executa uma consulta baseada no termo de pesquisa passado como parâmetro     $conexao = conexao::getInstance();     $sql = 'SELECT * FROM tb_kit WHERE nome_kit LIKE :nome_kit OR desc_kit LIKE :desc_kit';     $stm = $conexao->prepare($sql);     $stm->bindValue(':nome_kit', $termo.'%');     $stm->bindValue(':desc_kit', $termo.'%');     $stm->execute();     $kit = $stm->fetchAll(PDO::FETCH_OBJ); endif; ?> <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <title>Listagem KITs </title>     <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">     <link rel="stylesheet" type="text/css" href="css/custom.css"> </head> <body>     <div class='container'>         <fieldset>             <!-- Cabeçalho da Listagem -->             <legend><h1>Listagem de Kits</h1></legend>             <!-- Formulário de Pesquisa -->             <form action="" method="get" id='form-contato' class="form-horizontal col-md-10">                 <label class="col-md-2 control-label" for="termo">Pesquisar</label>                 <div class='col-md-7'>                     <input type="text" class="form-control" id="termo" name="termo" placeholder="Infome o Nome ou E-mail">                 </div>                 <button type="submit" class="btn btn-primary">Pesquisar</button>                 <a href='index.php' class="btn btn-primary">Ver Todos</a>             </form>             <!-- Link para página de cadastro -->             <a href='kit_cadastro.php' class="btn btn-success pull-right">Cadastrar Kit</a>             <div class='clearfix'></div>             <?php if(!empty($kit)):?>                 <!-- Tabela de Clientes -->                 <table class="table table-striped">                     <tr class='active'>                         <th>Foto</th>                         <th>produto</th>                         <th>Nome</th>                         <th>Descrição</th>                         <th>Preço</th>                         <th>Ação</th>                     </tr>                     <?php foreach($kit as $kit2):?>                         <tr>                             <td><img src='fotos/<?=$kit2->foto?>' height='40' width='40'></td>                                                                                      <?php foreach($kit3 as $kit4):?>                             <td>                                  <?=$kit4->nome_produto.'<br>'; ?>                                                                                     </td><?php endforeach; ?>                                                                                      <td><?=$kit2->nome_kit?></td>                                 </td>                             <td><?=$kit2->desc_kit?></td>                             <td><?='R$ '.$kit2->preco_kit.',00'?></td>                                                          <td>                                 <a href='kit_editar.php?id_nome_kit=<?=$kit2->id_nome_kit?>' class="btn btn-primary">Editar</a>                                 <a href='javascript:void(0)' class="btn btn-danger link_exclusao" rel="<?=$kit2->id_nome_kit?>">Excluir</a>                             </td>                         </tr>                                                                                                                                                    <?php endforeach;?>                 </table>             <?php else: ?>                 <!-- Mensagem caso não exista clientes ou não encontrado  -->                 <h3 class="text-center text-primary">Não existe Kit cadastrados!</h3>             <?php endif; ?>         </fieldset>     </div>     <script type="text/javascript" src="js/custom.js"></script> </body> </html>  
      ....se alguem puder ajudar...
       
    • By eiwes
      Fiz uma iteração foreach para gerar categorias e subcategorias, pois não queria fazer DOIS SELECTS, ficando assim:
       
      //----> Foreach para gerar a categoria, pois são vários items com as mesmas chaves, portanto agrupo foreach($exibeLista as $row){ $dlD[$row["nameD"]][] = [ "nameD"=>$row["nameD"], "idD"=>$row["idD"], "qtdR"=>$row["qtdR"], "qtdF"=>$row["qtdF"] ]; } //----> Foreach para gerar subcategorias foreach($exibeLista as $row){ $dLA[$row["nameP"]][] = [ "nameD"=>$row["nameD"], "idD"=>$row["idD"], "idAss"=>$row["idAss"], "idT"=>$row["idT"], "nameP"=>$row["nameP"], "qtdR"=>$row["qtdR"], "qtdF"=>$row["qtdF"] ]; } $fsHTML = []; $rateD = 0; $qtdAss = 0; if(is_array($dlD) || is_object($dlD)){ foreach ($dlD as $key => $ds) { if ($key <> '' && $key <> NULL) { $rateD += (($ds[0]["qtdR"]*100)/$ds[0]["qtdF"]); $qtdAss += count($dlD[$key]); //----> Array para inserir HTML da Categoria criada e criar accordion $fsHTML[] = ' <div class="col-md-12 col-sm-12 col-xs-12"> <div class="x_panel overflow_hidden padding-into-row-qsts bg-white-row filtro-on"> <span class="rateD">'.ceil($rateD/$qtdAss).'%</span> <span class="opcao-into-top">'.$ds[0]["idD"].' - '.$ds[0]["nameD"].' <a class="collapse-link open-filter-qsts border-radius8"><i class="fa fa-chevron-up"></i></a></span> <div class="x_content" style="display:none;padding-top:10px"> <div class="accordion" id="accordion" role="tablist" aria-multiselectable="true"> '; //----> Verificar se a subcategoria contém a categoria, se contém é incluída na array foreach ($dLA as $keys => $ass) { if($ass[0]["idD"] == $ds[0]["idD"] ){ if($ass[0]['idT'] <> 0){ $link = 't='.$ass[0]['idT']; }else{ $link = 'a='.$ass[0]['idAss'];} $fsHTML[] = ' <div class="panel"> <a class="panel-heading collapsed" href="/v/fs/st?mz=y&type=c&'.$link.'"> <span class="eficiencia-accordion">'.ceil(($ass[0]['qtdR']*100)/$ass[0]['qtdF']).'%</span> <h4 class="panel-title">'.$ass[0]['nameP'].'</h4> <span class="unicamente">'.$ass[0]['qtdR'].' respondido de '.$ass[0]['qtdF'].'</span> </a> </div> '; }//if ass }//foreach ass }//if ds //----> Aqui é aonde ocorre o ERRO! Era pra fazer o fechamento do Accordion e gerar uma nova DIV. //No índice [0] isso ocorre normalmente, porém no [1] ela agrupa todos os accordions. (abaixo farei a amostra) $fsHTML[] = '</div></div></div></div>'; }//foreach ds }//if verifica se é array e se é objeto return implode('', array_unique($fsHTML)); O correto seria assim:
       
      - Categoria
        - Subcategoria
        - Subcategoria
       
      - Categoria
       - Subcategoria
       - Subcategoria
       
       
      Como está acontecendo:
       
      - Categoria
        - Subcategoria
        - Subcategoria
       
      - Categoria
        - Subcategoria
        - Subcategoria
          - Categoria
            - Subcategoria
            - Subcategoria
              - Categoria
                - Subcategoria
                - Subcategoria
                  - Categoria
                    - Subcategoria
                    - Subcategoria
       
       
      Não consigo entender de jeito nenhum pq o primeiro fecha corretamente e a partir do segundo não.
      Alguém me ajuda?
       
       
    • By ViniciusRamoa
      Olá, eu possuo o código:
       
      @foreach ($manga['chapters'] as $chapter) <div class="manga-chapter" > <h6 class="events-subtitle" style="left: -165px; top: 30px; position: relative;"> {{ link_to_route('front.manga.reader', "≫"." ".$chapter['chapter_name'], [$manga['manga_slug'], $chapter['chapter_slug']]) }} </h6> </div> @endforeach Mas ele acaba exibindo muitos itens, eu gostaria de limitar para apenas 5 itens, e que esses 5 itens, o menor fosse "apagado" e aparecesse o mais recente, exemplo:

      Atualmente:
      Item 5
      Item 4
      Item 3
      Item 2
      Item 1

      Quando um novo item for publicado, ficaria:
       
      Item 6
      Item 5
      Item 4
      Item 3
      Item 2

      Agradeço a ajuda, se puder pelo menos indicar um caminho, já ajuda muito, estou perdido aqui
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.