Jump to content
diego.baiao

[Resolvido] Relatorio com PHPExcel

Recommended Posts

Olá bom dia a todos! 

 

Pessoal preciso fazer um relatório que venha a gerar um arquivo xlsx automaticamente, de uma consulta do banco de dados, estou usando o "PHPEXcel" para isso. 

Tenho  essa necessidade abaixo:

>>  Esse arquivo tem que gerar abas automaticamente quando o limite chegar a 1 milhão de linhas sabemos que o excel a partir de 2003 o limite de linhas por "planilha" ou "aba" é de "um milhão" 1k,  estou arredondado para baixo, o certo é 1.048.576 linhas por 16.384 colunas por aba/planilha.  

Exemplo: Então resumindo vou tirar um relatório deu 3 milhões e meio de registros, serão 4 abas/planilhas, sendo 3 abas com um milhão cada e mais 1 aba com meio milhão. Sendo que ele deve fazer tudo sozinho se tiver 10 milhões e assim vai, eu consigo já gerar o arquivo com a consulta vindo do banco, mais não consigo gravar todas as linhas na tabela e muito menos fazer criar as abas automaticamente. 

*** estou seguindo essa referencia abaixo com uso no phpexcel,  neste ensina o uso para criar novas "abas/planilhas" no arquivo a ser gerado mais não consigo colocar em pratica. 

(http://interessespessoais.com/programacaoweb/criar-varias-folhas-num-ficheiro-excel-com-a-classe-phpexcel/)

 

Dados importantes: 

1 - número de linhas por aba é 1 milhão de linhas; 

2 - as colunas são fixas então nunca irá ter mais ou menos ao que já tem criado( vai da coluna "A" a "O' são 15 colunas o total);

3 - possui um cabeçalho fixo, vou deixar fictício esses dados não são relevantes ( serão eles mesmos "A', "B", "C" ... "O"). 

>> no código abaixo o cabeçalho vai ser sempre a primeira linha logo abaixo da coluna como fiz ali "A1" chamei de "id" seria a primeira delas. 

 

>> nesse caso para não ficar pesado a consulta e demora no resultado eu estou trazendo  15 linhas(registros) minha tentativa é gera 3 abas com 5 registros em cada uma delas.

Dando certo ai mudo para a suposta quantidade de registros que queira alcançar. hehe

 

Segue meu código abaixo já gerando o relatório porem com uma linha editada rs.

"Mais ao menos gera no formato certo sem erros". 

<?php
/* 	Rodando esta gravando o xlsx */
	require_once "conexao.php"; 
	require_once 'Classes/PHPExcel.php';

	// DEFINE O FUSO HORARIO COMO O HORARIO DE BRASILIA
    date_default_timezone_set('America/Sao_Paulo');

	//cria a conexao com o banco
	$conexao_pdo = new PDO("pgsql:host=$host dbname=$dbname user=$user password=$senha"); 

		//laço para exibir se a conesão foi bem sucedida
	 	if ($conexao_pdo) 
		   { echo 'Conexão com o PostgreSQL realizada com sucesso!!<br>'; }
		   else
		   { echo 'Falha na conexão com o PostgreSQL!'; }

		//	grava milesegundo no arquivo gerado		
		$data_hora  = date('d/m/Y H:i:s', time());
		$microtime	= microtime(true);
        $time 		= explode(".", $microtime);
       	$mSecs   	= $time[1]; 
		
		if (strlen($mSecs) == 3){
			$mSecs = $mSecs."0";
		}elseif (strlen($mSecs) == 2){
			$mSecs = $mSecs."00";
		}

		function limpaData($data_hora){
	    	$rem = array ('-',':',' ','/','.');
	    	$sub = array ('_','_','_','_','_');
	    	return str_replace($rem, $sub, $data_hora);
		}

		$data = limpaData($data_hora)."_".$mSecs; //pega data e concatena com microsegundos

		//consulta via pdo
		// nesse caso para nao ficar pesado trago 15 linhas minha tentativa é gera 3 abas com 5 registros em cada uma delas
	 	$consulta = $conexao_pdo->query(
	 		"SELECT * FROM ENVIOS.ENVIO_CONTATO LIMIT 15"
	 	);

	 	//muda o modo padrão de busca para um objeto PDOStatement
	 	$consulta->setFetchMode(PDO::FETCH_ASSOC);

	 	$count = $consulta->rowCount(); // pega o numero de registros na consulta

		if ($count > 0) {

			while($row = $consulta->fetch()) {
			//	Criar um novo objecto PHPExcel
			$objPHPExcel = new PHPExcel();
 
		 	// Inserir dados nas células A1 e A2
			$objPHPExcel->setActiveSheetIndex(0)
			->setCellValue('A1',  'id')
			->setCellValue('A2',  $row['id']);	
				
			}

		}

		// // Indicação da criação do ficheiro
		$file = $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
		$file->save("downloads\periodo_" .$data. ".xlsx");

?>

O arquivo é gerado na pasta "downloads" dentro do projeto, porém com apenas 1 dado ( so fiz ele ir na primeira celular "A" e gravar um dado no caso um "id" da minha consulta, teria que fazer isso com o resto das informações, "B" os "nomes", "C" as "idades" e assim vai...   não sei como fazer um loop nessa situação com foreach, while, for, etc... 

 

* O meu problema esta sendo mais com logica de programação vou estudar para ver se consigo ir adiante, mais se conseguirem derem uma força eu agradeço.

 

Segue duas prints abaixo: 

1 - do arquivo gerado >> http://prntscr.com/hv37mh

2 - do arquivo aberto >> http://prntscr.com/hv385u 

 

Share this post


Link to post
Share on other sites

Troque

// Inserir dados nas células A1 e A2
			$objPHPExcel->setActiveSheetIndex(0)
			->setCellValue('A1',  'id')
			->setCellValue('A2',  $row['id']);	

por:

$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $linha, $informacao);

ele vai adicionar a informação na coluna 0 (A) na linha selecionada

ai você faz 15 desses e vai mudando as colunas 1 (B) , 2(C) e etc
você pode usar o count pra ir selecionando a linha, no começo do while você adiciona um

 if($count > 100000000)(
$objPHPExcel->createSheet();
$objPHPExcel->setActiveSheetIndex($sheet)
$sheet++;
)

n esqueçe de antes do while criar a variavel $sheet=0, ela que vai controlar a criação de abas.

  • Obrigado! 1

Share this post


Link to post
Share on other sites
3 horas atrás, ygor.anjos disse:

Troque


// Inserir dados nas células A1 e A2
			$objPHPExcel->setActiveSheetIndex(0)
			->setCellValue('A1',  'id')
			->setCellValue('A2',  $row['id']);	

por:


$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $linha, $informacao);

ele vai adicionar a informação na coluna 0 (A) na linha selecionada

ai você faz 15 desses e vai mudando as colunas 1 (B) , 2(C) e etc
você pode usar o count pra ir selecionando a linha, no começo do while você adiciona um


 if($count > 100000000)(
$objPHPExcel->createSheet();
$objPHPExcel->setActiveSheetIndex($sheet)
$sheet++;
)

n esqueçe de antes do while criar a variavel $sheet=0, ela que vai controlar a criação de abas.

Show vou ver aqui e dou um feedback amanhã, 2018 começou bombando, sabia que estava perto rs... tenho que treinar linguagem O.O. faço tudo estruturado uma ou outra que faço com O.O. e pegar um pouco na lógica de programação, agradeço a tua ajuda vou tentar fazer o esquema aqui e te falo... vlw

Share this post


Link to post
Share on other sites
Em 02/01/2018 at 10:42, diego.baiao disse:

10 milhões

Não tem muita conversa.

 

Pensou em volumes gigantes é necessário estudar em FILA / Processamento paralelo.

 

https://aws.amazon.com/pt/sqs/

 

--- 

 

Sou meio contra recomendar FW de cara, mas achei a documentação bem completa do Laravel.

https://laravel.com/docs/5.5/queues

 

 

 

 

 

 

Share this post


Link to post
Share on other sites

Também não custa dizer... PHPExcel "não existe" mais.

Veja: https://github.com/PHPOffice/PHPExcel

 

Agora é: https://github.com/PHPOffice/PhpSpreadsheet

 

Eles corrigiram muitos bugs.

Eu mesmo precisei atualizar essa biblioteca em alguns projetos há algum tempo atrás.

 

Aqui tem um guia de migração: https://phpspreadsheet.readthedocs.io/en/develop/topics/migration-from-PHPExcel/

Share this post


Link to post
Share on other sites

Olá.Percebi sua grande demanda qual você relatou:

" Pessoal preciso fazer um relatório que venha a gerar um arquivo xlsx automaticamente, de uma consulta do banco de dados, estou usando o "PHPEXcel" para isso. "

 

Eu entendi que sua DEMANDA PRINCIPAL é gerar relatórios apartir de uma consulta em banco de dados e que tais relatórios possam ser abertos em planilha (Excel especificamente).Você se propôs a usar PHP para tal demanda.Você não citou o banco usado.

Para solucionar sua DEMANDA PRINCIPAL outros meios podem ser usados.Vou citar uma solução que conheço:

Você deveria ter um banco de dados online e usar a linguagem CQL para fazer a consulta de busca e com os resultados da consulta fazer o tratamento(Testes com 5 milhoes de registros e 15 mil campos ja foram feitos)

Suponha que tem a tabela "EMPREGADOS" conforme abaixo.

ID ; EMPREGADO ; SALARIO ;FUNCAO

001 ;José Silva ; 1220,00 ; Aux.Produção

002;Maria Santos ; 1230,00 ; Diretora

...     ;   ..      .    ;      centenas de rows    ;        ......

999;Sandro Maciel ; 5900,00 ; Presidente

Então você faria uma busca :

 

{none;@coment;(Vai selecionar os valores entre 1200 e 1250 do campo Salario (índice 2 da tabela));0;0;0;0;query=0;destino=0}
{
       c:\Path_servidor\htdocs\EMPREGADOS;
       @min_max;
       (*);
       (1200,00);
       (1250,00);
       0;
       query=2;
       destino=0
}
{none;@coment;(Apos a busca,poderá fazer um relatório online mesmo em html borda 1,fonte 12 ,cor de fonte orange,folha de estilo);0;0;0;0;query=0;destino=0}
{
       c:\Path_servidor\htdocs\EMPREGADOS;
       @html;
       1;
       12;
      ('hostpath\sua_folha_de_estilos.css');
       Orange;
       query=0;
       destino=0
}
Poderá baixar o resultados e abrir diretamente no openOficce (Calc) ou Excel (importação),bastaria apenas copiar os resultados da busca para uma nova tabela temporária.(2 linhas de código para fazer isso)

Poderá até manipular a base que se encontra remota por uma aplicação personalizada como nas fotos anexadas:

imageproxy.php?img=&key=28afbb360db5c1b9(Com essa tecnologia não é necessário manipular xls,pois a base inteira é em formato CSV.So usaríamos o Excel ou Calc para abrir o arquivo).

Mais informações no blog do autor

 

desktop-atualizacao-despacho.jpg

pedido-recebido-desktop.jpg

 

Fiz o exemplo do video abaixo hoje,especialmente para você ter noção:

 

Share this post


Link to post
Share on other sites
Em 04/01/2018 at 16:54, Matheus Tavares disse:

Também não custa dizer... PHPExcel "não existe" mais.

Veja: https://github.com/PHPOffice/PHPExcel

 

Agora é: https://github.com/PHPOffice/PhpSpreadsheet

 

Eles corrigiram muitos bugs.

Eu mesmo precisei atualizar essa biblioteca em alguns projetos há algum tempo atrás.

 

Aqui tem um guia de migração: https://phpspreadsheet.readthedocs.io/en/develop/topics/migration-from-PHPExcel/

 

Em 02/01/2018 at 11:21, ygor.anjos disse:

Troque


// Inserir dados nas células A1 e A2
			$objPHPExcel->setActiveSheetIndex(0)
			->setCellValue('A1',  'id')
			->setCellValue('A2',  $row['id']);	

por:


$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $linha, $informacao);

ele vai adicionar a informação na coluna 0 (A) na linha selecionada

ai você faz 15 desses e vai mudando as colunas 1 (B) , 2(C) e etc
você pode usar o count pra ir selecionando a linha, no começo do while você adiciona um


 if($count > 100000000)(
$objPHPExcel->createSheet();
$objPHPExcel->setActiveSheetIndex($sheet)
$sheet++;
)

n esqueçe de antes do while criar a variavel $sheet=0, ela que vai controlar a criação de abas.

 

Share this post


Link to post
Share on other sites

Opa, só informando recebi varias ajudas dos amigo acima e agradeço a todos porem a necessidade é que crie um relatório em xlsx mesmo, o usuário faz o download do arquivo para usar filtros e afins... mais vi muitas reclamações que para gerar arquivos grandes o "PHP Excel não é tão bom e caiu em desuso, costuma dar erro e demora muito tendo o sucessor dele o spreadsheet " e procurando um pouco mais fundo descobri o "XLsxWriter" (https://github.com/mk-j/PHP_XLSXWriter) estou estudando ele e já consegui fazer grande parte, assim que finalizar o código inteiro eu posto para ajudar alguém que precise também.  

Já consigo gravar 1k (demora por volta de 6 a 7 minutos vai ser executado em segundo plano e ao terminar vai ser gerando um link para donwload a ideia é essa) vou fazer para gerar mais abas automaticamente e ver a parte de config de execução de script como memory_limit e max_execution_time

 

Vi também o "spreadsheet" porém não achei muito exemplos de como usar e achei um pouco confuso as classes, eu não tenho tanta experiência por isso deve ter ficado confuso e com esse outro achei bem mais fácil e parece ser bem ágil conforme informações do git, os relatórios não irão passar tão cedo dos 5 milhões hoje fica em torno de 1,5k a 3,5k .

 

Obrigado a todos

Share this post


Link to post
Share on other sites
2 horas atrás, Almir_Santos disse:

O exemplo mostrado por mim ,com office.org consegue gerar em poucos segundos.

Entendi vou ver se chego a alguma conclusão, como seu codigo

 

Tinha perguntado sobre o banco eu uso "postgresql". (muitos inner joins hehehe)

Share this post


Link to post
Share on other sites
Em 10/01/2018 at 12:00, Almir_Santos disse:

O exemplo mostrado por mim ,com office.org consegue gerar em poucos segundos.

Te agradeço mais não vou ter tempo de implementar algo com essa linguagem, mais pensei em outra maneira só estou enrolado com o código. Desisti da outra forma pois consome muita memoria, mais ao invés de quebrar em varias abas posso quebrar o processo por arquivo, já testei aqui vai ficar bom... só preciso de uma ajuda a modificar meu código nas interações quando atingir um certo limite de registros... vou posta abaixo. 

Share this post


Link to post
Share on other sites

Opa pessoal mudei o conceito da coisa de gerar em várias abas vai ser problemático acima de 1k de registros já se torna inviável para qualquer aplicação. 

Queria pegar o meu código abaixo e fazer o seguinte gerar para vários arquivos, exemplo meu $count deu 1,5k de registros, vou quebrar em cada arquivo 0,5k que daria um total de 3 arquivos com 0,5k . Até ai blz.

Eu estou usando o XlsxWriter é bém fácil de usar e achei leve, para gerar um arquivo desse uso em media 400MB mais tenho um servidor potente e não vou ter problema com esse relatório não é todo cliente que gera 1,5k na verdade é somente 1 "muito chato"... 

Então simulando meu $count = 1500000

Preciso de um laço que independente do meu $count crie esses arquivos sem perder o fio da meada... "digo sendo continuo os registros no proximo arquivo" sem repetir os mesmos... ai vi alguns laços mais não consegui implementar  while, for e if que usam o esquema de "break" e "continue" não sei se teria como usar esses karas para fazer o que quero. 

 

<?php 
ini_set("memory_limit", '2000M');
date_default_timezone_set('America/Sao_Paulo');

// ========== info de data e hora de inicio ===================== //
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
var_dump($d->format("Y-m-d H:i:s.u"));
// ================================================ //
echo "==============================================<br>";
// =============================================================== /

require_once ('xlswriter/xlsxwriter.class.php');
require_once ('conexao.php');

	//cria a conexao com o banco
	$conexao_pdo = new PDO("pgsql:host=$host dbname=$dbname user=$user password=$senha"); 

		//laço para exibir se a conesão foi bem sucedida
	 	if ($conexao_pdo) 
		   { echo 'Conexão com o PostgreSQL realizada com sucesso!!<br>'; }
		   else
		   { echo 'Falha na conexão com o PostgreSQL!'; }

		//grava data e hora com milesegundo no arquivo que vai ser gerado		
		$data_hora  = date('d/m/Y H:i:s', time());
		$microtime	= microtime(true);
        $time 		= explode(".", $microtime);
       	$mSecs   	= $time[1]; 
		
		if (strlen($mSecs) == 3){
			$mSecs = $mSecs."0";
		}elseif (strlen($mSecs) == 2){
			$mSecs = $mSecs."00";
		}

		function limpaData($data_hora){
	    	$rem = array ('-',':',' ','/','.');
	    	$sub = array ('_','_','_','_','_');
	    	return str_replace($rem, $sub, $data_hora);
		}

		$data = limpaData($data_hora)."_".$mSecs;

		//consulta via pdo
	 	$consulta = $conexao_pdo->query(
	 		"SELECT * FROM ENVIOS.ENVIO_CONTATO LIMIT 1500000"
	 	);

	 	//muda o modo padrão de busca para um objeto PDOStatement
	 	$consulta->setFetchMode(PDO::FETCH_ASSOC);

	 	$count = $consulta->rowCount(); //pega o numero de registros na consulta (1,5k) exemplo dado
		
		//inicio do tratamento para gerar o arquivo xlsx
	 	if ($count > 0 ) {

	 		$array = array();
	 		$sheet = 1; //esse kara nao influencia em nada
			
            //instancia a abertura de um documento novo xlsx
	 		$writer = new XLSXWriter();

	 			$loop = null;
		 		while($row = $consulta->fetch()) {
		 			//Pega os dados da consulta e armazenas nas variaveis especificas dentro do array
		 			$array[$loop]["id"] 					= $row['id'];
				 	$array[$loop]["data_hora_execucao"] 	= $row['data_hora_execucao'];
				 	$array[$loop]["mensagem"] 				= $row['mensagem'];
				 	$array[$loop]["ddd_movel"]				= $row['ddd_movel'];
				 	$array[$loop]["movel"] 					= $row['movel'];
				 	$array[$loop]["id_relatorio_status"]	= $row['id_relatorio_status'];

				 	//Cria a head do excel - nomemclatura de cada coluna e o tipo de dado a se importar
		 			$writer->writeSheetHeader($sheet, array('id'=>'integer','data_hora_execucao'=>'datetime','mensagem'=>'string','ddd_movel'=>'integer','movel'=>'integer','id_relatorio_status'=>'integer'));

		 			//Grava o valor das celulas
					$writer->writeSheetRow($sheet, array($array[$loop]["id"],$array[$loop]["data_hora_execucao"],$array[$loop]["mensagem"],$array[$loop]["ddd_movel"],$array[$loop]["movel"],$array[$loop]["id_relatorio_status"] ));

				 	$loop ++;

				}
            //gera o arquivo xlsx baseado da interação do $writer->writeSheetRow
			$writer->writeToFile("periodo_" .$data. ".xlsx");
			echo '#'.floor((memory_get_peak_usage())/1024/1024)."MB"."\n";  // so imprimo o consumo da memoria a fins informativos
		}

echo "<br>";
// ========= info de data e hora de termino =================== //
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
var_dump($d->format("Y-m-d H:i:s.u"));
// ================================================ //
echo "==============================================<br>";
// =============================================================== /

?>

Segue abaixo a print screen de saida. 

http://prntscr.com/hz4hk0

http://prntscr.com/hz4kwf

 

Não sei se deu pra entender bem o que queria e se seria possível, senão vou ter que gravar no banco a consulta e marcar o registro inicio e final de cada arquivo a ser gerado.(e queria que fosse direto sem ter que usar este método)

Share this post


Link to post
Share on other sites

Só pra constar foi criado um servidor temporário para gerar esse relatório que não é nada viável o negocio é montar e gravar em um banco não relacional ex: mongo db e dele gerar o relatório conforme comentário do Almir Santos é uma alternativa.  

O bom mesmo que vi seria o cliente baixar e solicitar com o "Power BI" um amigo de trabalho mostrou e é uma ferramenta top sendo que ele baixa o power bi na maquina dele e configuramos para ele faça a chamada da requisição do relatório onde é baixado um arquivo na extensão do programa que ele abrirá no mesmo e terá todos os dados que ele precisa analítico e sintético e com vários gráficos. 

 

Agradeço a ajuda de todos, topico encerrado.!

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 Robson Tenorio Henriques
      Estou desenvolvendo um sistema para uso particular onde realizo diariamente o cadastro dos seguintes valores no BD conforme abaixo:
      INSERT INTO `viagem`( `viagem_nr`, `viagem_valor`, `viagem_gastos`, `viagem_usuario`, `viagem_data`, `viagem_hora` ) VALUES( '$viagem_nr', '$viagem_valor', '$viagem_gastos', '$viagem_usuario', '$data_atual', '$hora_atual' ) No caso viagem_usuario é a pessoa que preencheu o formulário com as informações.
       
      Até o momento já consegui fazer um relatório do dia atual e do mês atual, abaixo esta o código do relatório diário:
      <?php include_once("../acesso/conexao.php"); include_once("../config.php"); include_once('../acesso/verifica_login.php'); //Seleção dos dados do BD com Filtragem para exibição na tabela $filtro_data = date('Y-m-d'); $result_viagem = "SELECT * FROM viagem WHERE viagem_data = '$filtro_data' ORDER BY viagem_nr"; $resultado_viagem = mysqli_query($conexao, $result_viagem); //Grafico $data1 = ''; $data2 = ''; //Query para pegar os dados da tabela $filtro_data = date('Y-m-d'); $sql = "SELECT * FROM viagem WHERE viagem_data = '$filtro_data' ORDER BY viagem_nr"; $result = mysqli_query($conexao, $sql); //Loop while ($row = mysqli_fetch_array($result)) { $data1 = $data1 . '"'. $row['viagem_valor'].'",'; $data2 = $data2 . '"'. $row['viagem_gastos'] .'",'; } $data1 = trim($data1,","); $data2 = trim($data2,","); ?> <!doctype html> <html lang="pt-BR"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <Meta http-equiv="refresh" content="60" /> <meta name="author" content="<?php echo $author; ?>"> <meta name="email" content="<?php echo $email_author; ?>"> <title><?php echo $title; ?></title> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script> <link href="https://getbootstrap.com.br/docs/4.1/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="canonical" href="https://getbootstrap.com/docs/4.3/examples/navbar-fixed/"> <!-- Bootstrap core CSS --> <link href="https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <style> .bd-placeholder-img { font-size: 1.125rem; text-anchor: middle; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } @media (min-width: 768px) { .bd-placeholder-img-lg { font-size: 3.5rem; } } .container{ font-family: Arial; margin: 5px 5px 30px 5px; padding: 0; color: white; text-align: center; background: #555652; color: #E8E9EB; background: #222; border: #555652 1px solid; padding: 10px; } </style> <!-- Custom styles for this template --> <link href="css/navbar-top-fixed.css" rel="stylesheet"> </head> <body> <!--Inicio da NavBar--> <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark"> <a class="navbar-brand" href="#"><?php echo $title; ?></a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarCollapse"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="../plataforma">Home<span class="sr-only">(current)</span></a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> VIAGENS </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="../sistema/viagem01.php">1ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem02.php">2ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem03.php">3ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem04.php">4ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem05.php">5ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem06.php">6ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem07.php">7ª Viagem</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="../sistema/encerramento.php">Fechamento</a> </div> </li> </ul> </div> </nav> <!--Fim da NavBar--> <main role="main" class="col-md-12 ml-sm-auto col-lg-12 px-4"> <h4>Bem Vindo, <b><?php echo $_SESSION['nome']; ?></b>.</h4> <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> <h1 class="h2">Dashboard</h1> <div class="btn-toolbar mb-2 mb-md-0"> <button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span data-feather="calendar"></span> Hoje </button> <div class="dropdown-menu"> <a class="dropdown-item" href="#">Mês Atual</a> </div> </div> </div> <div class="container"> <h1><?php echo $title; ?></h1> <canvas id="chart" style="width: 80%; height: 50vh; background: #222; border: 1px solid #555652; margin-top: 10px;"></canvas> <script> var ctx = document.getElementById("chart").getContext('2d'); var myChart = new Chart(ctx, { type: 'line', data: { labels: ["1ª","2ª","3ª","4ª","5ª","6ª","7ª"], datasets: [{ label: 'Receita', data: [<?php echo $data1; ?>], backgroundColor: 'transparent', borderColor:'rgba(46, 204, 113,1.0)', borderWidth: 3 }, { label: 'Gastos', data: [<?php echo $data2; ?>], backgroundColor: 'transparent', borderColor:'rgba(235, 47, 6,1.0)', borderWidth: 3 }] }, options: { scales: {scales:{yAxes: [{beginAtZero: false}], xAxes: [{autoskip: true, maxTicketsLimit: 20}]}}, tooltips:{mode: 'index'}, legend:{display: true, position: 'top', labels: {fontColor: 'rgb(255, 255, 255)', fontSize: 16}} } }); </script> </div> <h2>HOJE</h2> <div class="table-responsive"> <table id="valores" class="table table-striped table-sm display"> <thead> <tr align="center"> <th>ID</th> <th>Data</th> <th>Hora</th> <th>Viagem</th> <th>Valor</th> <th>Gastos</th> <th>Usuário</th> </tr> </thead> <tbody> <?php while ($rows_viagens = mysqli_fetch_assoc($resultado_viagem)) { ?> <tr align="center"> <td><?php echo $rows_viagens['viagem_ID']; ?></td> <td><?php echo date('d/m/Y', strtotime($rows_viagens['viagem_data'])); ?></td> <td><?php echo $rows_viagens['viagem_hora']; ?></td> <td><?php echo $rows_viagens['viagem_nr']; ?></td> <td><?php echo $rows_viagens['viagem_valor']; ?></td> <td><?php echo $rows_viagens['viagem_gastos']; ?></td> <td><?php echo $rows_viagens['viagem_usuario']; ?></td> </tr> <?php } ?> </tbody> </table> </div> </main> </div> </div> <!-- JavaScript do Bootstrap --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script>window.jQuery || document.write('<script src="https://getbootstrap.com/docs/4.3/assets/js/vendor/jquery-slim.min.js"><\/script>')</script> <script src="https://getbootstrap.com.br/docs/4.1/assets/js/vendor/popper.min.js"></script> <script src="https://getbootstrap.com.br/docs/4.1/dist/js/bootstrap.min.js"></script> <script src="https://getbootstrap.com/docs/4.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script> <!-- Ícones --> <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> <script> feather.replace() </script> <!-- Gráficos --> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script> </body> </html>  
      Porém os mesmo são atualizados automaticamente, eu necessito puxar do BD, todos os dados cadastrados no mês de julho como exemplo, e esse relatório pode ser no formato de uma tabela simples, mas que ele quando gerado fique salvo na plataforma para consultas futuras e não seja alterado.
       
       
       
    • By infonet
      Olá pessoal,
      Poderiam me ajudar?
      Preciso enviar o formulário via ajax, porém preciso pegar todos os valor de todos os inputs e excluir o valor de cada linha em três tabela.
      Pode ser que alguma tabela não tenha nenhum valor, mas tem tabela que pode ter 10 valores.
       
      Tentei fazer como estou enviando, mas não consegui...
      Obrigado!
       

      <form name='formResiduo'> <?php $sqlr_end = "SELECT e.idclie FROM tb_end e WHERE NOT EXISTS(SELECT i.idinc FROM tb_inc i WHERE e.idclie = i.idinc) ORDER BY e.idclie ASC"; $querye = $conn->query($sqlr_end); $linhas = $querye->num_rows; while($rowrend = $querye->fetch_assoc()) { $reidclie = $rowrend["idclie"]; if ($linhas == "0") { $linhase = ""; } else { $linhase = $linhas; } ?> <input type='text' name='valor[]' value='<?php echo $reidclie; ?>'> <?php } ?> <?php if ($linhase) { ?> <div class='emCursorD emBlkA' style='position:relative;font-size:14px;font-weight:300;'> <div style='position:absolute;width:calc(100% + 100px);height:100%;left:-10px;'></div> <div class='formImptG' style='border-radius:3px;padding:5px;margin-bottom:20px;'> <label> <div style='position:relative;border-bottom:1px solid #606060;padding-top:10px;margint-top:5px;'><?php echo $linhase; ?></div> </label> </div> </div> <?php } ?> <?php $sqlr_res = "SELECT r.idclir FROM tb_res r WHERE NOT EXISTS(SELECT i.idinc FROM tb_inc i WHERE r.idclir = i.idinc) ORDER BY r.idclir ASC"; $queryr = $conn->query($sqlr_res); $linhas = $queryr->num_rows; while($rowrres = $queryr->fetch_assoc()) { $rridclir = $rowrres["idclir"]; if ($linhas == "0") { $linhasr = ""; } else { $linhasr = $linhas; } ?> <input type='text' name='valor[]' value='<?php echo $rridclir; ?>'> <?php } ?> <?php if ($linhasr) { ?> <div class='emCursorD emBlkA' style='position:relative;font-size:14px;font-weight:300;'> <div style='position:absolute;width:calc(100% + 100px);height:100%;left:-10px;'></div> <div class='formImptG' style='border-radius:3px;padding:5px;margin-bottom:20px;'> <label> <div style='position:relative;border-bottom:1px solid #606060;padding-top:10px;margint-top:5px;'><?php echo $linhasr; ?></div> </label> </div> </div> <?php } ?> <?php $sqlr_his = "SELECT h.idclih FROM tb_his h WHERE NOT EXISTS(SELECT i.idinc FROM tb_inc i WHERE h.idclih = i.idinc) ORDER BY h.idclih ASC"; $queryh = $conn->query($sqlr_his); $linhas = $queryh->num_rows; while($rowrhis = $queryh->fetch_assoc()) { $rhidclih = $rowrres["idclih"]; if ($linhas == "0") { $linhash = ""; } else { $linhash = $linhas; } ?> <input type='text' name='valor[]' value='<?php echo $rhidclih; ?>'> <?php } ?> <?php if ($linhash) { ?> <div class='emCursorD emBlkA' style='position:relative;font-size:14px;font-weight:300;'> <div style='position:absolute;width:calc(100% + 100px);height:100%;left:-10px;'></div> <div class='formImptG' style='border-radius:3px;padding:5px;margin-bottom:20px;'> <label> <div style='position:relative;border-bottom:1px solid #606060;padding-top:10px;margint-top:5px;'><?php echo $linhash; ?></div> </label> </div> </div> <?php } ?> </form> <div class='passar emLineB emCursorP'>Passar</div> <script> $(document).ready(function() { $('.passar').click(function(passar) {     var formdata = new FormData($("form[name='formResiduo']")[0]);     var link = 'sys/incClient.php?teste=ex';      $.ajax({         dataType: 'json',         type: 'POST',         url: link,         data: formdata,         processData: false,         contentType: false,     success: function (result) {         var data = result.split('|');         var rA = data[0];         var rB = data[1];     if(rA == "sucesso") {     alert(rB);     }      return false;     }     }); }); }); </script>
       

      if($_GET['teste']=="ex") {     foreach($_POST['valor'] AS $lines) {          $sqlr = @mysqli_query($conn, "DELETE FROM tb_res WHERE idclir = '$lines'");     $sqle = @mysqli_query($conn, "DELETE FROM tb_end WHERE idclie = '$lines'");     $sqlh = @mysqli_query($conn, "DELETE FROM tb_his WHERE idclih = '$lines'");     }          $arrch = "sucesso"."|".$lines;     echo json_encode($arrch);     exit; }
    • By infonet
      Poderiam me ajudar com esta consulta SQL?   Acontece que ela roda normal, mas quando coloco na paginação ela não funciona:   mysqli_query ($conn, "SET @a := 0"); $_pagi_sql = "SELECT *, LPAD( @a := @a + 1, 5, '0' ) 'sequencial' FROM tb_his WHERE idclih = $idclientHis ORDER BY dt_his DESC, idhis DESC, sequencial DESC";   O erro acontece somente por causa do final: sequencial DESC, pois quando eu retiro, funciona normalmente.   Obrigado!
    • By Eurales antony
      Boa noite developers, eu codei um sistema em PHP mas não para ser vendido e sim alugado, o cliente aluga eu envio os arquivos do sistema e uma chave e apenas com uma chave valida o sistema funciona, o sistema está pronto terminei de coda o ofuscador e um contaminador(insere códigos deanecesaarios no código) mas agora eu preciso criptografar todos os arquivos, tipo base_64 ou melhor, com o ofuscador e contaminador o código fonte está totalmente ilegível mas quero que fique igual a um código que eu vi, um monte de caracteres nada vê com nada não sei se era base 64 na verdade não entendo muito sobre criptografia quem puder me ajudar eu agradeço e quem chegou até aqui agrade pelo atenção, boa noite 
    • By eduardaarosaa
      Olá!!! Gostaria de saber como converter um objeto em array.
      Já tentei usar get_objet_vars e não funcionou ... veio um array vazio 
      Exemplo: array(){
      }
      array(){
      }
      Meu objeto está assim: 
      object(Illuminate\Http\UploadedFile)#205 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "eliete.jpg"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "image/jpeg"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8467.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8467.tmp"
      }
      object(Illuminate\Http\UploadedFile)#211 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(40) "f114abec-1fe1-4e86-92b0-5b976b4c50c0.jpg"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "image/jpeg"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8468.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8468.tmp"
      }
      object(Illuminate\Http\UploadedFile)#212 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(27) "bitcoin-3125488_960_720.png"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(9) "image/png"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8469.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8469.tmp"
      }
      object(Illuminate\Http\UploadedFile)#213 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(14) "imagem0033.jpg"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "image/jpeg"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8479.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8479.tmp"
      }
       
      Obrigada!!!
×

Important Information

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