Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

leimota

Registo de estados

Mensagens Recomendadas

leimota

Boa Tarde,

Estou neste momento a entrar um pouco em desespero para finalizar o meu projeto fim de curso, este projeto consiste na monitorizaçao de consumos e estados de uma casa automatizada, e a parte que falta acabar neste projeto é a monitorização de estados dos equipamentos, pois o meu curso é de electrónica e nunca tive base de dados nem programação em php, mas ultimamente tenho "partido pedra" nesta área e já consegui fazer toda a parte de monitorização de consumos assim como carregar todos os dados que preciso para uma base de dados, agora o meu problema prende-se aqui:

Eu tenho registo numa base de dados de 1 em 1segundo do estado de equipamento em que regista a data e hora do mesmo, por exemplo:

2013-08-22 11:47:39
2013-08-22 11:47:40
2013-08-22 11:47:41
2013-08-22 11:47:42
2013-08-22 11:47:43
2013-08-22 11:47:44
2013-08-22 11:47:48
2013-08-22 11:47:49
2013-08-22 11:47:50
2013-08-22 11:47:51
2013-08-22 11:47:52
2013-08-22 11:47:53
2013-08-22 11:47:54
2013-08-22 11:47:55

Esta tabela mostra quando o estado do equipamento é 1 se repararem do segundo 44 até o 48 ele não mostra porque está desliga, agora o que eu gostava de fazer e não sei bem se dá para fazer isso pois tenho falta de conhecimento, era mostrar por exemplo:

o equipamento ligou ás:11:47:39 e desligou ás: 11:47:45

o equipamento ligou ás:11:47:48 e desligou ás: 11:47:55

O código que fiz em php é o seguinte:

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');
require_once("ligar_bd.php");																										  
$skl="SELECT * FROM `t_registos2013` where `estado4`=1" ;
$result = mysqli_query($con,$skl);
echo "<table border='1'>
<tr>
<th> Data </th>
<th>Hora </th>
</tr>";
while($dados = mysqli_fetch_array($result)){


echo "<tr>";
echo "<td>" . $dados['data'] . "</td>";
echo "<td>" . $dados['hora'] ."</td>";
echo "</tr>";

}
echo "</table>";

require_once("desligar_bd.php");
?>

Agora por falta de conhecimento de php, não consigo desbloquear muito mais do que isto, já tentei, algumas ideias em php, por exemplo eu já tentei fazer um ciclo em que corria os dados que retirava da base dados e tentei fazer o seguinte, ele detectava 1 no estado então pegava na hora e ia varrendo os segundos se o próximo 1 fosse igual ao tempo actual mais 1 segundo quer dizer que estava ligava se houvesse uma interrupção neste tempo é porque ele tinha desligado e mostrava o tempo desligado. Mas depois alem de nem conseguir fazer este passo que nao deve ser muito complicado ainda tem a questão dos segundos e minutos e se tiver muito tempo ligado horas e dias e não sei mesmo como fazer.

Desculpem o tópico longo, e deixo aqui, desde já, o agradecimento por este grupo fantástico, que já me ajudou várias vezes mesmo sem ter pedido ajuda. :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

qual e' a tua dificuldade?

um Algoritmo simples e facil de implementar:

Preencher um array(aka "lista") com os valores da base de dados //nao e' mesmo necessario
declarar a variavel de inicio e fica com o primeiro valor do array
declarar uma variavel de fim
declarar um array de tuples
Percorrer o array e ver a diferenca dos segundos entre eles
se a diferenca maior que um segundo
  :fim = anterior
  :inserir no array de tuples os valores inicio e fim   


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Repara nesta imagem da minha base de dados;

Capturar.png

O que eu quero é que ele mostre a hora a que o equipamento ligou logo que detecta o primeiro 1 da sequência do estado1 e assim que encontra o proximo 0 ele imprime a hora que desligou e assim sucessivamente, de forma a ter uma tabela com a hora que ligou e á frente a hora que desligou.

Tipo eu não sei se aqui existe algo do genero de Rising edge e falling edge, se houvesse algo genero consoante fosse rising e falling ele gravava a hora de ligar e desligar, respectivamente.

Se calhar estou a dizer uma barbaridade, mas como já referi o meu conhecimento é muito limitado nesta área...

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Devexz

Podes fazer alguma coisa deste género, percorres o ciclo várias vezes, mas o utilizador não saberá disso. (penso que este código pode ser melhorado), mas se seguires a lógica chegas lá facilmente.

//variavel para verificarmos se estamos entrar no ciclo while pela primeira vez
$primeravez = true;

while( percorrer a table) {

  $estado = estadodaBasedeDados;

 //se estiver ligada a maquina
if($estado == 1 ) {
		   //se for a primeira vez da execução do script
		  if($primeiravez) {
				   echo "A maquina Estava LIGADA às".dataDaBasedeDados;
		   }//ou antes a maquina estava desligada
		  else if($ultimoEstado == "off") {
		  echo "A maquina ligou-se às".dataDaBasedeDados;
			}

		 $ultimoEstado = "on";
		 $primeiravez = false;

 } else if ($estado == 0) {
			// se o script está ser executador pela 1ª vez
			if($primeiravez) {
					  echo "A maquina Estava DESLIGADA às".dataDaBasedeDados;
		   }else if($ultimoEstado == "on"){ // se o estado anterior era 1
					  echo "e desligou-se às".dataDaBasedeDados;
			}
		   $ultimoEstado = "off";
		   $primeiravez = false;
}
}

Editado por Devexz
  • Voto 1

Ás vezes, mais vale deixar a assinatura em branco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
$text = "";
$esc_char = "\n";
$state = 0;

$sql="SELECT * FROM `t_registos2013"; // <------- add your where here
$result = mysqli_query($con,$sql);
while($dados = mysqli_fetch_assoc($result)){
 if (!$state && $dados['estado1']) {
   $text .= "o equipamento ligou ás: {$dados['hora']}";
 } else if ($state && !$dados['estado1']) {
   $text .= " e desligou ás: {$dados['hora']}" . $esc_char;
 }
 $state = $dados['estado1'];
}
if ($state) {
 $text .= " e continua ligado ...";
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Bom Dia,

Amigo Devexz, só tenho uma coisa a dizer, muito obrigado era mesmo isto que precisava, já fiz umas pequenas alterações, já meti os dados a aparecerem numa tabela, mais organizados, e também já consegui fazer a diferença de tempo...

E ainda por cima a função parece muito simples e fácil de perceber, mas obviamente que sem a sua ajuda jamais teria consigo, por isso mais uma vez obrigado ;)

Além do Devexz também agradeço ao pikax e ao HappyHippyHippo, por também tentarem me ajudar.

Obrigado a todos ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Só mais uma duvida, não sei se devo perguntar aqui ou criar um novo tópico? Mas vou colocar aqui e se algum administrador achar melhor que devo mover para um novo tópico, eu farei isso.

Então a minha nova dúvida, é a seguinte...

Eu estou a receber de minuto em minuto um ficheiro .xls numa pasta e já criei um script em php que lê o ficheiro e coloca-o na base dados, mas problema é que só coloca um a um e tenho de ser eu a mudar o nome, o que eu gostava de fazer mas não estou a conseguir era que ele ao abrir o directório pegasse em todos os ficheiros .xls que tem lá e os envie para a base de dados e depois no fim com a função unlink ou outra função apagasse os ficheiros que já tinha corrido para a base de dados. mas esta parte do unlink em principio devo saber fazer, o pior é mesmo carregar os ficheiros todos... já ouvi falar da função glob, mas ainda não consegui arranjar um bom exemplo para perceber bem aquilo.

O codigo que já fiz é o seguinte:

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');
function xls_para_mysql ($ficheiro)
{

require_once '../Classes/PHPExcel/IOFactory.php';
echo date('H:i:s') , ' Uso de Memoria RAM: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
$callStartTime = microtime(true);
$tabela="t_registos2013";
$skl="INSERT INTO `dashboard`.`".$tabela."` (
`id` ,
`data` ,
`dia` ,
`mes` ,
`ano` ,
`hora` ,
`estado1` ,
`consumo1` ,
`estado2` ,
`consumo2` ,
`estado3` ,
`consumo3` ,
`estado4` ,
`consumo4` ,
`estado5` ,
`consumo5`
) VALUES (NULL , ";
$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
$objPHPExcel = $objReader->load($ficheiro);
$objReader->setReadDataOnly(true);
$objWorksheet = $objPHPExcel->getActiveSheet();
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
 $worksheetTitle = $worksheet->getTitle();
 $highestRow = $worksheet->getHighestRow(); // ultima linha
 $highestColumn = $worksheet->getHighestColumn(); // ultima coluna
 $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
}
require_once("ligar_bd.php");
$teste="";
$contador=0;
for ($row = 2; $row <= $highestRow; $row++)
{
for ($col = 0; $col <=$highestColumnIndex-1; $col++)
{
	 if ($col==0)
	 {			
		 $celula=$worksheet->getCellByColumnAndRow($col,$row);
		 $data_hora = explode("-", $worksheet->getCellByColumnAndRow($col,$row));
		 $data = "'".trim($data_hora[0])."',";
		 $data_separada = explode("/", $data_hora[0]);
		 $dia=$data_separada[0];
		 $mes=$data_separada[1];
		 $ano=$data_separada[2];			
		 $datanova="'".trim($ano)."-".trim($mes)."-".trim($dia)."',";
		 $hora = "'".trim($data_hora[1])."'";				
		 $teste=$teste.$datanova."'".trim($dia)."','".trim($mes)."','".trim($ano)."',".$hora;

	 }
	 else {
		 $teste=$teste.",'".$worksheet->getCellByColumnAndRow($col,$row)."'";			
	 }
}
	 $sql_a_inserir=$skl.$teste.");";			
	 mysqli_query($con,$sql_a_inserir);						
	 $teste="";		
	 $contador++;
}
require_once("desligar_bd.php");
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Demorou ' , sprintf('%.4f',$callTime) , " segundos a analisar e inserir".$contador." registos." , EOL;
return true;
}


echo xls_para_mysql("4.xls");

?>

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Podes usar a função scandir, que te retorna um array com todas as subpastas e ficheiros dentro do caminho que lhe passares.Podes sempre usar a função is_file para cada um desses elementos do array, se na pasta puderes ter alguma coisa mais que ficheiros (subpastas, por exemplo.) :)


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Certo, mas eu só preciso é que ele me vá a uma pasta onde só vai ter ficheiros de excel neste caso .xls, e apenas quero ler esses ficheiros, com a função scandir já consigo ter esses ficheiros, agora não estou a conseguir percorrer esses array de forma a ele introduzir cada ficheiro que esta no array para a base de dados...

E só mais uma coisa estes ficheiros tem sempre o mesmo tamanho e o mesmo formato, não sei se pode haver outra função que seja mais facil de implementar...ou se calhar esta já é a mais facil só que eu sou um pouco leigo em php :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

A função é fácil:

$files = scandir('camionho/da/pasta');
foreach($files as $ficheiro){
    if ($ficheiro === '.' || $ficheiro === '..') continue;
//A variavel $ficheiro tem o nome de cada ficheiro dentro da pasta
//NOTA: A variável $ficheiro apenas tem o nome do mesmo, por isso ao abrires o ficheiro tens de colocar:
$objPHPExcel = $objReader->load('caminho\da\pasta\'.$ficheiro);

//Aqui será o código para abrir, ler e inserir cada ficheiro na base de dados que já tens criado
}

Basicamente, apenas tens de colocar o código de leitura do ficheiro e tratamento dos dados que já tens dentro do ciclo. :)

Editado por scorch
  • Voto 1

scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Desde já quero te agradecer pela ajuda, mas infelizmente não estou a conseguir :P

Tipo já fiz o que disseste mas só me carrega o ultimo ficheiro excel com que o $ficheiro fica, os outros ficheiros ele não carrega... já tive aqui bastante tempo a batalhar com isto mas não consigo ganhar...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Isso é estranho. De certeza que mesteste o código certo dentro do ciclo?

Posta aqui como está o teu código, para poder-mos ver melhor onde está o problema. :)


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Aqui no codigo eu tenho o $dir = 'excel' sem barra, porque o programa que eu estou a usar para fazer o codigo em php é NuSphere PhpED e este programa tem o modo debug e eu reparei que ele só reconhece o directório assim sem por a barra...

Neste codigo que foi um professor que me ajudou, também tem umas classes para lerem excel e não se se isso estará a interferir...

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');
$dir = 'excel';
$files = scandir($dir);
foreach($files as $ficheiro){
 if ($ficheiro === '.' || $ficheiro === '..') continue;
 //A variavel $ficheiro tem o nome de cada ficheiro dentro da pasta
 //NOTA: A variável $ficheiro apenas tem o nome do mesmo, por isso ao abrires o ficheiro tens de colocar:
 //$objPHPExcel = $objReader->load( $dir .$ficheiro);
 //Aqui será o código para abrir, ler e inserir cada ficheiro na base de dados que já tens criado
}


function xls_para_mysql ($ficheiro)
{

require_once '../Classes/PHPExcel/IOFactory.php';
echo date('H:i:s') , ' Uso de Memoria RAM: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
$callStartTime = microtime(true);
$tabela="t_registos2013";
$skl="INSERT INTO `dashboard`.`".$tabela."` (
`id` ,
`data` ,
`dia` ,
`mes` ,
`ano` ,
`hora` ,
`estado1` ,
`consumo1` ,
`estado2` ,
`consumo2` ,
`estado3` ,
`consumo3` ,
`estado4` ,
`consumo4` ,
`estado5` ,
`consumo5`
) VALUES (NULL , ";
//$dir2 = '/excel';
$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
$objPHPExcel = $objReader->load($dir . $ficheiro);
$objReader->setReadDataOnly(true);
$objWorksheet = $objPHPExcel->getActiveSheet();
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
 $worksheetTitle = $worksheet->getTitle();
 $highestRow = $worksheet->getHighestRow(); // ultima linha
 $highestColumn = $worksheet->getHighestColumn(); // ultima coluna
 $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
}
require_once("ligar_bd.php");
$teste="";
$contador=0;
for ($row = 2; $row <= $highestRow; $row++)
{
for ($col = 0; $col <=$highestColumnIndex-1; $col++)
{
	 if ($col==0)
	 {			
		 $celula=$worksheet->getCellByColumnAndRow($col,$row);
		 $data_hora = explode("-", $worksheet->getCellByColumnAndRow($col,$row));
		 $data = "'".trim($data_hora[0])."',";
		 $data_separada = explode("/", $data_hora[0]);
		 $dia=$data_separada[0];
		 $mes=$data_separada[1];
		 $ano=$data_separada[2];			
		 $datanova="'".trim($ano)."-".trim($mes)."-".trim($dia)."',";
		 $hora = "'".trim($data_hora[1])."'";				
		 $teste=$teste.$datanova."'".trim($dia)."','".trim($mes)."','".trim($ano)."',".$hora;

	 }
	 else {
		 $teste=$teste.",'".$worksheet->getCellByColumnAndRow($col,$row)."'";			
	 }
}
	 $sql_a_inserir=$skl.$teste.");";			
	 mysqli_query($con,$sql_a_inserir);						
	 $teste="";		
	 $contador++;
}
require_once("desligar_bd.php");
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Demorou ' , sprintf('%.4f',$callTime) , " segundos a analisar e inserir".$contador." registos." , EOL;
return true;
}	

echo xls_para_mysql($ficheiro);

?>

Editado por leimota

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Só tens de meter a chamada da função dentro do ciclo. Experimenta assim: :)

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');
$dir = 'excel';
$files = scandir($dir);
foreach($files as $ficheiro){
        if ($ficheiro === '.' || $ficheiro === '..') continue;
        //A variavel $ficheiro tem o nome de cada ficheiro dentro da pasta
        //NOTA: A variável $ficheiro apenas tem o nome do mesmo, por isso ao abrires o ficheiro tens de colocar:
        //$objPHPExcel = $objReader->load( $dir .$ficheiro);
        //Aqui será o código para abrir, ler e inserir cada ficheiro na base de dados que já tens criado
	 echo xls_para_mysql($ficheiro);
}


function xls_para_mysql ($ficheiro)
{

require_once '../Classes/PHPExcel/IOFactory.php';
echo date('H:i:s') , ' Uso de Memoria RAM: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
$callStartTime = microtime(true);
$tabela="t_registos2013";
$skl="INSERT INTO `dashboard`.`".$tabela."` (
`id` ,
`data` ,
`dia` ,
`mes` ,
`ano` ,
`hora` ,
`estado1` ,
`consumo1` ,
`estado2` ,
`consumo2` ,
`estado3` ,
`consumo3` ,
`estado4` ,
`consumo4` ,
`estado5` ,
`consumo5`
) VALUES (NULL , ";
//$dir2 = '/excel';
$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
$objPHPExcel = $objReader->load($dir . $ficheiro);
$objReader->setReadDataOnly(true);
$objWorksheet = $objPHPExcel->getActiveSheet();
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
        $worksheetTitle = $worksheet->getTitle();
        $highestRow = $worksheet->getHighestRow(); // ultima linha
        $highestColumn = $worksheet->getHighestColumn(); // ultima coluna
        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
}
require_once("ligar_bd.php");
$teste="";
$contador=0;
for ($row = 2; $row <= $highestRow; $row++)
{
for ($col = 0; $col <=$highestColumnIndex-1; $col++)
{
                if ($col==0)
                {                     
                        $celula=$worksheet->getCellByColumnAndRow($col,$row);
                        $data_hora = explode("-", $worksheet->getCellByColumnAndRow($col,$row));
                        $data = "'".trim($data_hora[0])."',";
                        $data_separada = explode("/", $data_hora[0]);
                        $dia=$data_separada[0];
                        $mes=$data_separada[1];
                        $ano=$data_separada[2];                       
                        $datanova="'".trim($ano)."-".trim($mes)."-".trim($dia)."',";
                        $hora = "'".trim($data_hora[1])."'";                          
                        $teste=$teste.$datanova."'".trim($dia)."','".trim($mes)."','".trim($ano)."',".$hora;

                }
                else {
                        $teste=$teste.",'".$worksheet->getCellByColumnAndRow($col,$row)."'";                  
                }
}
                $sql_a_inserir=$skl.$teste.");";                      
                mysqli_query($con,$sql_a_inserir);                                            
                $teste="";            
                $contador++;
}
require_once("desligar_bd.php");
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Demorou ' , sprintf('%.4f',$callTime) , " segundos a analisar e inserir".$contador." registos." , EOL;
return true;
}

?>


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Penso que agora a forma está a ler bem, mas o problema agora é na base de dados, ele no fim dá-me esta informação

15:54:32 Uso de Memoria RAM: 0.5 MB
Demorou 0.5560 segundos a analisar e inserir300 registos.
115:54:33 Uso de Memoria RAM: 8.25 MB
Demorou 0.4888 segundos a analisar e inserir300 registos.
115:54:33 Uso de Memoria RAM: 8.75 MB
Demorou 0.4850 segundos a analisar e inserir300 registos.
115:54:34 Uso de Memoria RAM: 9 MB
Demorou 0.4876 segundos a analisar e inserir300 registos.
115:54:34 Uso de Memoria RAM: 9.25 MB
Demorou 0.4864 segundos a analisar e inserir300 registos.
115:54:35 Uso de Memoria RAM: 9.75 MB
Demorou 0.4902 segundos a analisar e inserir300 registos.
1

O que me faz pensar que está correto, mas quando chego à base de dados não tenho lá nada, eu tive de fazer uma pequena alteração no codigo que era quando ele se ligava à base dados ele só requeria uma vez, por isso eu pôs só require em vez de require_once...

Mas a partir daqui se calhar fica mais difícil para me ajudar não? Se vires que tou a ser muito chato eu agradeço-te e muito por me teres ajudado aqui e vou tentando sozinho ou procurar outras soluções. ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Bem, tu só deves ligar à base de dados uma vez (no inicio da página) e desligar-te uma vez também (no fim), a menos que precises de te ligar a mais do que uma base de dados na mesma página. Por isso, acho que o include devia ser feito fora da função (e por isso do foreach), e assim seria apenas feita uma conexão.

Quanto aos dados não serem inseridos, não sei o que possa ser, principalmente tendo em conta que ele não dá nenhum erro (certo?).


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

É assim ele não dá nenhum erro se eu só usar o require em vez do require_once, porque se eu usar o require_once ele dá erro ao ligar-se na base de dados...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Experimenta assim, com os includes fora do foreach: :)

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');

require_once '../Classes/PHPExcel/IOFactory.php';
require_once("ligar_bd.php");
$dir = 'excel';
$files = scandir($dir);
foreach($files as $ficheiro){
        if ($ficheiro === '.' || $ficheiro === '..') continue;
        //A variavel $ficheiro tem o nome de cada ficheiro dentro da pasta
        //NOTA: A variável $ficheiro apenas tem o nome do mesmo, por isso ao abrires o ficheiro tens de colocar:
        //$objPHPExcel = $objReader->load( $dir .$ficheiro);
        //Aqui será o código para abrir, ler e inserir cada ficheiro na base de dados que já tens criado
                echo xls_para_mysql($ficheiro);
}
require_once("desligar_bd.php");


function xls_para_mysql ($ficheiro) {
global $con;

echo date('H:i:s') , ' Uso de Memoria RAM: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
$callStartTime = microtime(true);
$tabela="t_registos2013";
$skl="INSERT INTO `dashboard`.`".$tabela."` (
`id` ,
`data` ,
`dia` ,
`mes` ,
`ano` ,
`hora` ,
`estado1` ,
`consumo1` ,
`estado2` ,
`consumo2` ,
`estado3` ,
`consumo3` ,
`estado4` ,
`consumo4` ,
`estado5` ,
`consumo5`
) VALUES (NULL , ";
//$dir2 = '/excel';
$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format
$objPHPExcel = $objReader->load($dir . $ficheiro);
$objReader->setReadDataOnly(true);
$objWorksheet = $objPHPExcel->getActiveSheet();
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
        $worksheetTitle = $worksheet->getTitle();
        $highestRow = $worksheet->getHighestRow(); // ultima linha
        $highestColumn = $worksheet->getHighestColumn(); // ultima coluna
        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
}
$teste="";
$contador=0;
for ($row = 2; $row <= $highestRow; $row++)
{
for ($col = 0; $col <=$highestColumnIndex-1; $col++)
{
                if ($col==0)
                {                    
                        $celula=$worksheet->getCellByColumnAndRow($col,$row);
                        $data_hora = explode("-", $worksheet->getCellByColumnAndRow($col,$row));
                        $data = "'".trim($data_hora[0])."',";
                        $data_separada = explode("/", $data_hora[0]);
                        $dia=$data_separada[0];
                        $mes=$data_separada[1];
                        $ano=$data_separada[2];                      
                        $datanova="'".trim($ano)."-".trim($mes)."-".trim($dia)."',";
                        $hora = "'".trim($data_hora[1])."'";                          
                        $teste=$teste.$datanova."'".trim($dia)."','".trim($mes)."','".trim($ano)."',".$hora;

                }
                else {
                        $teste=$teste.",'".$worksheet->getCellByColumnAndRow($col,$row)."'";                  
                }
}
                $sql_a_inserir=$skl.$teste.");";                      
                mysqli_query($con,$sql_a_inserir);                                            
                $teste="";            
                $contador++;
}
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Demorou ' , sprintf('%.4f',$callTime) , " segundos a analisar e inserir".$contador." registos." , EOL;
return true;
}

?>


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

FINALMENTE FEITO !!! :D

Muito obrigado Scorch ;) O código anterior já estava a funcionar, mas este ficou melhor, mas aquilo tinha dois erros, um no tipo de ficheiro que estava a tentar enviar, não sei bem porque mas aquilo aumentou-me o numero de linhas do excel e não correspondia com a base de dados logo não carregava :P...

o segundo erro era, numa das classe já criadas de auxilio à leitora do ficheiro, e tive de por lá em todas as linhas que lia o ficheiro, tive de por directamente o directório onde ele estava e voilá deu tudo direitinho.... infelizmente ainda estou muito verde nisto e é por isso que tenho estas falhas --'

Só mesmo mais uma coisa, aposto que depois disto nunca mais me vais querer ajudar por ser tão chato, mas acredita que não é por mal, porque antes de vir para aqui tento tudo e mais alguma coisa :D

para fazer o unlik eu ja fiz este codigo, mas se eu fizer unlink apenas ao $ficheiro diz que nao o encontra no directório, se puser assim o directório como está em cima ele associa o nome excel ao nome do ficheiro, fica assim excelData_1009.xls(Data_1009.xls é o nome do ficheiro que tenho na pasta excel)

$dir2= '../excel/';
unlink( $dir . $ficheiro);

E prometo que em principio será a última duvida :D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Basta meter o separador da pasta e do ficheiro \ . :)

unlink($dir.'\'.$ficheiro);


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
leimota

Quem sabe, sabe :D era mesmo isso ;)

Só tive de voltar a fazer um foreach para que me apagasse todos os ficheiros que tinha lido, senão só me apagava o ultimo, mas ainda existe alguma coisinha que sei fazer :D

Agora muito a serio, muito obrigado mesmo, pois eu sem a tua ajuda também nunca teria conseguido, assim como a ajuda do Devexz no primeiro problema, voces tem aqui um grupo fantástico ;)

Novamente obrigado a todos :thumbsup:

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.