leimota Posted August 27, 2013 at 03:06 PM Report #522755 Posted August 27, 2013 at 03:06 PM 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. 🙂
pikax Posted August 27, 2013 at 03:42 PM Report #522760 Posted August 27, 2013 at 03:42 PM 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."
leimota Posted August 27, 2013 at 04:38 PM Author Report #522763 Posted August 27, 2013 at 04:38 PM 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...
Solution Devexz Posted August 27, 2013 at 08:46 PM Solution Report #522772 Posted August 27, 2013 at 08:46 PM (edited) 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; } } Edited August 27, 2013 at 08:50 PM by Devexz 1 Report Contador de calorias: caloriaspordia.com
HappyHippyHippo Posted August 28, 2013 at 12:42 AM Report #522790 Posted August 28, 2013 at 12:42 AM $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 Portugol Plus
leimota Posted August 28, 2013 at 10:31 AM Author Report #522799 Posted August 28, 2013 at 10:31 AM 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 😉
leimota Posted August 28, 2013 at 06:29 PM Author Report #522825 Posted August 28, 2013 at 06:29 PM 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"); ?>
scorch Posted August 28, 2013 at 06:50 PM Report #522827 Posted August 28, 2013 at 06:50 PM 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.) 🙂 PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
leimota Posted August 28, 2013 at 07:17 PM Author Report #522828 Posted August 28, 2013 at 07:17 PM 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 😛
scorch Posted August 28, 2013 at 07:53 PM Report #522831 Posted August 28, 2013 at 07:53 PM (edited) 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. 🙂 Edited August 28, 2013 at 07:54 PM by scorch 1 Report PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
leimota Posted August 28, 2013 at 11:20 PM Author Report #522844 Posted August 28, 2013 at 11:20 PM Desde já quero te agradecer pela ajuda, mas infelizmente não estou a conseguir 😛 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...
scorch Posted August 29, 2013 at 08:25 AM Report #522849 Posted August 29, 2013 at 08:25 AM 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. 🙂 PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
leimota Posted August 29, 2013 at 09:29 AM Author Report #522853 Posted August 29, 2013 at 09:29 AM (edited) 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); ?> Edited August 29, 2013 at 09:34 AM by leimota
scorch Posted August 29, 2013 at 10:59 AM Report #522861 Posted August 29, 2013 at 10:59 AM 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; } ?> PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
leimota Posted August 29, 2013 at 03:00 PM Author Report #522893 Posted August 29, 2013 at 03:00 PM 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. 😉
scorch Posted August 29, 2013 at 03:05 PM Report #522897 Posted August 29, 2013 at 03:05 PM 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?). PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
leimota Posted August 29, 2013 at 03:40 PM Author Report #522901 Posted August 29, 2013 at 03:40 PM É 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...
scorch Posted August 29, 2013 at 03:55 PM Report #522903 Posted August 29, 2013 at 03:55 PM 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; } ?> PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
leimota Posted August 29, 2013 at 05:45 PM Author Report #522913 Posted August 29, 2013 at 05:45 PM FINALMENTE FEITO !!! 😄 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 😛 ... 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 😄 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 😄
scorch Posted August 29, 2013 at 05:57 PM Report #522914 Posted August 29, 2013 at 05:57 PM Basta meter o separador da pasta e do ficheiro \ . 🙂 unlink($dir.'\'.$ficheiro); PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now