Nueva pregunta

Pregunta:

Fecha: 30-09-2016 09:05:23 (En Español)

Guardar datos en MySQL cada cierto tiempo[Resuelta]

Hola gente... comento mi problema y mi idea... para saber las opiniones de uds
Desde un microcontrolador recibo cada 5 minutos diferentes parametros (humedad, temperatura.....etc) a un php... yo debo guardar el promedio de cada parametro cada una hora.....
Mi idea es crear un contador que cuente hasta 12 (que serian las muestras tomadas en una hora cada 5 minutos), luego hacer el promedio de cada medida, guardar y volver el contador a 0....

Seguramente habra algo mucho mejor.... pero a mi no se me ocurre, por eso recurro a uds, cualquier sugerencia es bienvenida.... desde ya Gracias de antemano!
Etiquetas: MySQL - Opinión - PHP - Pregunta - Sugerencia - Web Votos: 1 - Respuestas: 43 - Vistas: 14 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 02-10-2016 03:34:52 Buenos días, para hacer un trabajo cada cierto tiempo existen las tareas programadas o cron job. Cada cierto tiempo o en cierto momento del día se dispare un proceso. Yo hago eso para ciertos procesos, algunos cada 5 minutos, otros 2 veces al día, etc

    0**** php path/script.php

    0****, significa, en minuto 0 a todas las horas de todo el día de todo el mes de todos los días de la semana, es decir, una vez por hora

    Saludos

    DIEGO
      Votos: 0 - Link respuesta
     
  • Fecha: 02-10-2016 05:44:38 Efectivamente la opcion que te plantea Diego es la mejor solucion , hacerlo a traves del cron y que daca X tiempo ejecute el fichero con las instruccciones.   Votos: 0 - Link respuesta
     
  • Fecha: 02-10-2016 15:55:33 Muchas gracias por las respuestas...pero el tema es que el microcontrolador envia datos cada 5 minutos y yo los voy almacenando...luego de 1 hora hago el promedio y guardo....pongo las variables a 0 y repito....
    Con esa opcion seria posible?
      Votos: 1 - Link respuesta
     
  • Fecha: 03-10-2016 03:28:55 Buen día, en donde almacenás las variables que va enviando el microcontrolador?   Votos: 0 - Link respuesta
     
  • Fecha: 03-10-2016 04:04:19 Pense en armar una tabla temporal... pero se aceptan sugerencias...   Votos: 2 - Link respuesta
     
  • Fecha: 03-10-2016 06:27:33 Hola Anabel, creo que tu opción esta muy bien, ya que al recibir el parametro cada 5 minutos ya tienes la ejecución del script ahí mismo y no tienes que recurrir a una ejecución diferida por medio de un Cron Job (por ejemplo).

    Como bien decis, lo ideal es resguardar las medidas en una tabla temporal y luego truncar la misma una vez procesados los datos / calculado los promedios (12* 5' = 60' = 1 hora <-- excelente).

    Si bien mi comentario no aporta nada nuevo a lo dicho, la idea del mismo es apoyar tu planteo original y comentarte que yo también lo haría así.

    Luego nos cuentas como te fue, saludos y buen código!

    PD: un comentario extra (aporte a la idea), lo que puedes hacer es contar la cantidad de medidas registradas en la tabla y una vez que las mismas lleguen a 12 ejecutar la consolidación/promedio. Con esto simplificas el hecho de llevar un cotador (ya que los mismos registros en la tabla temporal confeccionan uno).

    PD2: que interesante esto que estas haciendo, ¿trabajas para alguna estación meteorológica?
      Votos: 1 - Link respuesta
     
  • Fecha: 03-10-2016 07:42:10 Hola, muchas gracias por todas las respuestas
    Efectivamente es para una estacion meteorologica, proyecto para una de las escuelas donde trabajo... y la verdad es que me esta dando bastantes dolores de cabeza, sobre todo el arduino!

    En unos dias armo el codigo y lo comparto asi lo debatimos, muchisimas gracias
      Votos: 2 - Link respuesta
     
  • Fecha: 03-10-2016 08:06:43 Por eso preguntaba como era que mandaba y como grababa los datos. Si el microcontrolador ya está llamando a un script, listo, lo que dice Fernando es cierto.

    Como aporte, no sería una temporal, yo guardaría todos los datos y en otra tabla, grabaría los promedios. Si no, se pierden datos que creo son muy valiosos y te queda el promedio, nada más.

    Entonces, tendría dos tablas, una donde se guardan los datos cada 5 minutos y otra donde se graben los promedios, ya sea por cron job, por cálculo de cantidad de registros, etc.

    Como idea chiquita, sería tener un campo estado para saber cuales son los registros tomados cada 5 minutos de los cuales tengo que sacar promedio, ej, estado 0 para los que todavía no se hizo cálculo (máximo van a ser 12 u 11 más el último registro tomado), vas contando después de cada grabación o antes (12 u 11) y cuando te de esa cantidad, calculás el promedio, grabas en la tabla de promedios y a los registros con estado 0 le asignás 1.

    Ideas

    Saludos

    DIEGO
      Votos: 2 - Link respuesta
     
  • Fecha: 03-10-2016 09:37:52 Hola, gracias por las respuestas... mi idea es tener una tabla sensores donde guardo todo... incluyendo fecha y hora, y otra temporal....donde se guardan los datos cada 5 minutos... y claro que es buena la idea tuya porque aca donde vivo en verano sobre todo hay muchos cortes de luz y pensaba como hacer en esos casos...
    de momento va a trabajar en un localhost.
      Votos: 2 - Link respuesta
     
  • Fecha: 06-10-2016 09:04:24 Pues como ya comentaron esta bien.
    Recomendaciones y ya lo mencionaron arriba tambien.

    guardar todos los registro, esto es super importante para historiales especialmente meteorológicas, pues tendrás el record exacto por dia, agrégale un campo timestamp para saber la hora de guardado exacto.

    Otra tabla donde guardes los resultados, aunque si guarda todo estos cálculos se hacen al vuelo.

    Y por ultimo mi aporte, puedes comunicar arduino directo a un server mysql y mandar guardar los registros directo sin tener que pasar por php.

    Lo use hace un tiempo y de aquí saque la refrencia/ayuda

    http://panamahitek.com/conectar-arduino-base-datos-mysql/
      Votos: 1 - Link respuesta
     
  • Fecha: 06-10-2016 19:46:02 Lo voy a mirar...muchas gracias...y ya comentare....
    Muy buenos aportes!!
      Votos: 0 - Link respuesta
     
  • Fecha: 06-10-2016 23:01:05 Hola Anabel me pareció haber comentado antes acerca del libro "head first and design patterns" que menciona un ejemplo a lo largo del libro , muy parecido a lo que tu estas buscando. Te digo me pareció porque el otro día creí haberlo escrito pero no lo veo hoy quizá desde el móvil paso algo y no estuve atento por lo cual no llego mi respuesta.

    De paso te comento que es un libro excelente si tienes la oportunidad de conseguirlo. No se si este en español la versión que conozco esta en ingles. Quizá eso te de mayor concepción de su implementacion.

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 07-10-2016 09:27:30 Hola Adrian!! No veo el aporte acerca del libro que mencionas...pero lo voy a buscar para poder implementar la mejor solucion posible..
    La fecha y hora ya la estoy implementando tambien para las pruebas.
    En breve debere tener los primeros resultados que comentare para saber sus opiniones. Muchas gracias!!
      Votos: 0 - Link respuesta
     
  • Fecha: 07-10-2016 14:39:40 Adrian... he conseguido el libro Head First PHP & MySQL... de o´reilly... pero no logro encontrar el ejemplo que mencionas....   Votos: 0 - Link respuesta
     
  • Fecha: 08-10-2016 03:22:32 Hola Anabel ignoro si lo encontraras en ese libro ya que el libro titula "head first and design paterns" el de php es de la misma serie.

    En el libro que te menciono el ejercicio se desarrolla creo que desde el cap 2 y asi por varios capitulos.

    saludos y si no encuentras el libro me lo dices.
      Votos: 0 - Link respuesta
     
  • Fecha: 09-10-2016 07:27:05 gracias! lo buscare mas especifico con ese nombre   Votos: 0 - Link respuesta
     
  • Fecha: 09-10-2016 10:23:35 Bueno.. aca mi primera prueba lo mas elemental posible fallida.... estoy segura que hago mal la consulta... y sepan disculpar.. llevo años de oxido.... he puesto echos para saber que es lo que pasa y me tira los echos en todos lados....
    disculpen la desprolijidad del codigo y muchas gracias

    
    <?php
    
    //enlace a BD
        $enlace = mysqli_connect("127.0.0.1","root","", "sensores");
    
    if (!$enlace) {
        echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
        echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL;
        echo "error de depuración: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }
    
    echo "Éxito: Se realizó una conexión apropiada a MySQL! " . PHP_EOL;
    echo "Información del host: " . mysqli_get_host_info($enlace) . PHP_EOL;
        // Leemos los valores que nos llegan por GET
        $WindDirection = mysqli_real_escape_string($enlace, $_GET["WindDirection"]);
        $WindSpeedAverage = mysqli_real_escape_string($enlace, $_GET["WindSpeedAverage"]);
       // $WindSpeedMax = mysqli_real_escape_string($enlace, $_GET["WindSpeedMax"]);
        $Temperature = mysqli_real_escape_string($enlace, $_GET["Temperature"]);
        $RainfallOneHour = mysqli_real_escape_string($enlace, $_GET["RainfallOneHour"]);
       // $RainfallOneDay = mysqli_real_escape_string($enlace, $_GET["RainfallOneDay"]);
        $BarPressure = mysqli_real_escape_string($enlace, $_GET["BarPressure"]);
        $Humidity = mysqli_real_escape_string($enlace, $_GET["Humidity"]);
    	
     //insertamos los datos en la tabla temporal
      $query = "INSERT INTO temporal(WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity ) VALUES('".		  $WindDirection."','".$WindSpeedAverage."','".$Temperature."','".$RainfallOneHour."','".$BarPressure."','".$Humidity."')";
        // Ejecutamos la instrucción
        mysqli_query($enlace, $query);
    	
    //consulta el id 
    	$resultado = mysqli_query('SELECT id from temporal');
    	echo $resultado;
     
       // Si es  igual a 12 inserta los valores
     If ($resultado = 12)  {
        echo "estoy dentro del si";
    	$Direccion=0;
    	$Velocidad=0;
    	$Temperatura=0;
    	$OneHour=0;
    	$Presion=0;
    	$Humedad=0;
      
    	 	
    	//$acumula= "select * from temporal" ;
    	
    	for ($i = 1; $i = 12; $i++) {
    		
    		 $i = mysqli_fetch_array($resultado);
    	     
        	 $Direccion= $Direccion +$WindDirection;
     		 $Velocidad=  $Velocidad + $WindSpeedAverage;
    		 $Temperatura=$Temperatura + $Temperature ;
    		 $OneHour= $OneHour + $RainfallOneHour ;
    		 $Presion= $Presion + $BarPressure;
    		 $Humedad = $Humedad + $Humidity;
    }// fin for
             
    		 echo "estoy dentro del promedio";
    		 $Direccion= $Direccion /12;
     		 $Velocidad=  $Velocidad /12;
    		 $Temperatura=$Temperatura /12 ;
    		 $OneHour= $OneHour /12 ;
    		 $Presion= $Presion /12;
    		 $Humedad = $Humedad /12;
    		 
       $query = "INSERT INTO  valores ($Direccion,$Velocidad,$Temperatura,$OneHour,$Presion,$Humedad ) VALUES('".$WindDirection."','".   $WindSpeedAverage."','".$Temperature."','".$RainfallOneHour."','".$BarPressure."','".$Humidity."')";
        // Ejecutamos la instrucción
        mysqli_query($enlace, $query);
        mysqli_close($enlace);
    	
    	echo "guardo en valores";
    	//mysqli_query($enlace, "TRUNCATE TABLE nombreTabla");
    	
     }// promedio y reset tabla
     
    ?>
    
    
      Votos: 1 - Link respuesta
     
  • Fecha: 11-10-2016 00:19:34 Hola Anabel, que bueno que has podido avanzar a pesar de que no tenes tanta experiencia, muchos se quedan en el potencial y no hacer ni la mitad....

    En una miradita rápida a tu código veo algunos puntos, veamos:
    * Observa que en la línea 28 usas correctamente la función mysqli_query, le pasas la conexión y la consulta, pero en la línea 31 solo le estas pasando la consluta (o sea, debes pasar tambíen la variable enlace en la línea 31).
    * La consulta SELECT que utilizas en la línea 31 siempre te devolverá todas las filas insertas en la tabla temporal (no el último id), para obtener el último debes utilizar (por ejemplo) la función de agregación MAX (devuelve el valor máximo del campo que especifiquemos).
    * En el IF de la línea 35 no estas comparando, sino asignando, lo correcto es usar doble igual (uno solo igual asigna en la variable $resultado el valor 12, siempre devolverá TRUE).
    * Luego de recuperar el resultado del SELECT imprimes directamente la variable en la línea 32 y la comparas directamente en la 35, esto no sería correcto, debes emplear la función mysqli_fetch_assoc() para obtener la fila, y luego recuperar la columan con le nombre de columan.

    Veamos en código como serían las correcciones:
    ...
    ...
    ...
        //consulta el id 
        $resultado = mysqli_query($enlace, "SELECT MAX(id) AS 'id' from temporal");
        $fila = mysqli_fetch_assoc($resultado);
        echo $fila['id'];
       // Si es  igual a 12 inserta los valores
       If ($fila['id'] == 12)  {
    ...
    ...
    ...

    NOTA: observa que en la consulta SELECT estoy utilizando el AS 'id', esto es necesario porque al usar la función de agregación MAX, el nombre de la columan cambia a "MAX(id)", por lo que debemos darle un nombre valido/manejable, y lo hacemos con el AS.

    Un comentario al margen, imagino que estas usando un id autoincremental en la tabla "temporal", para lo cual esta logica que estas planteando de comparar el último id solo funcionaría si luego de tomar los datos y procesarlos haces un TRUNCATE TABLE temporal; (con esto borrarías todos los datos temporales y reinicializas el contador autoincremental a 0, a diferencia de un DELETE FROM que solo borras los datos y en próximo insert sería 13).

    Al margen de lo dicho, entiendo que es un primer script y requiere depuración y/o ajuste de lógica, pero no nos has informado cual es el error que te arroja en pantalla o que te esta frenando (trata de incorporar este detalle).

    Espero haberte ayudado, quedamos al aguardo de tus comentarios.

    Saludos y buen código!
      Votos: 1 - Link respuesta
     
  • Fecha: 11-10-2016 03:49:01 Hola...muchas gracias!! Voy a hacer todas las correciones y luego comento.
    Mas que oxidada necesito varios blades de wd40...jaja
    Agradezco la ayuda
      Votos: 1 - Link respuesta
     
  • Fecha: 12-10-2016 05:25:38 Bueno.. ahi realice las correcciones.. comento un poco como lo pense. el id es auotincremental, inserta y compara si el numero 12 suma todos los datos, hace el promedio, guarda en otra tabla el promedio y recomienza (por eso el truncate).
    me tira este error (cuando entra al for).... seguro me trague algunas lineas de codigo...
    Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\xampp\htdocs\estacion\captura.php on line 61
    
    Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in C:\xampp\htdocs\estacion\captura.php on line 62
    


    y resubo el php... solo desde que inserta
    //insertamos los datos en la tabla temporal
      $query = "INSERT INTO temporal(WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity ) VALUES('".		  $WindDirection."','".$WindSpeedAverage."','".$Temperature."','".$RainfallOneHour."','".$BarPressure."','".$Humidity."')";
        // Ejecutamos la instrucción
        mysqli_query($enlace, $query);
    	
    //consulta el id 
     $resultado = mysqli_query($enlace, "SELECT MAX(id) AS 'id' from temporal");
        $fila = mysqli_fetch_assoc($resultado);
        echo $fila['id'];
     
       // Si es igual a 12 inserta los valores en valores
    If ($fila['id'] == 12)  {
        
    	echo "estoy dentro del si";
    	$Direccion=0;
    	$Velocidad=0;
    	$Temperatura=0;
    	$OneHour=0;
    	$Presion=0;
    	$Humedad=0;
      
    	 	
    	//$acumula= "select * from temporal" ;
    	
    	for ($i = 1; $i = 12; $i++) {
    		$resultado = mysqli_query('SELECT * from temporal');
    		 $i = mysqli_fetch_array( $resultado);
    	     
        	 $Direccion= $Direccion +$WindDirection;
     		 $Velocidad=  $Velocidad + $WindSpeedAverage;
    		 $Temperatura=$Temperatura + $Temperature ;
    		 $OneHour= $OneHour + $RainfallOneHour ;
    		 $Presion= $Presion + $BarPressure;
    		 $Humedad = $Humedad + $Humidity;
    }// fin for
             
    		 echo "estoy dentro del promedio";
    		 $Direccion= $Direccion /12;
     		 $Velocidad=  $Velocidad /12;
    		 $Temperatura=$Temperatura /12 ;
    		 $OneHour= $OneHour /12 ;
    		 $Presion= $Presion /12;
    		 $Humedad = $Humedad /12;
    		 
       $query = "INSERT INTO  valores ($Direccion,$Velocidad,$Temperatura,$OneHour,$Presion,$Humedad ) VALUES('".$WindDirection."','".   $WindSpeedAverage."','".$Temperature."','".$RainfallOneHour."','".$BarPressure."','".$Humidity."')";
        // Ejecutamos la instrucción
        mysqli_query($enlace, $query);
        mysqli_close($enlace);
    	
    	echo "guardo en valores";
    	//mysqli_query($enlace, "TRUNCATE TABLE nombreTabla");
    	
     }// promedio y reset tabla
     
    
    ?>
    
    
    


    Muchas gracias por la paciencia!!!
      Votos: 1 - Link respuesta
     
  • Fecha: 13-10-2016 04:04:09 Hola Anabel, un gusto ayudarte, observa la línea 26:
    $resultado = mysqli_query('SELECT * from temporal');

    Te esta faltando pasar la conexión a mysqli_query, debería ser:
    $resultado = mysqli_query($enlace,'SELECT * from temporal');


    Saludos y buen código!
      Votos: 0 - Link respuesta
     
  • Fecha: 13-10-2016 05:52:41 muchas gracias por la respuesta!!

    le cambie el maximo de ejecucion en el php.ini... porque me daba un error en la ejecucion.. ahora es lo peor.... porque no me da error... pero no me inserta en la otra tabla cuando el id= 12
    el error esta por aqui...

     for ($i = 1; $i = 12; $i++) {
    		 $resultado = mysqli_query($enlace,'SELECT * from temporal');
    		 $i = mysqli_fetch_array( $resultado);
    	     
        	 $Direccion= $Direccion +$WindDirection;
     		 $Velocidad=  $Velocidad + $WindSpeedAverage;
    		 $Temperatura=$Temperatura + $Temperature ;
    		 $OneHour= $OneHour + $RainfallOneHour ;
    		 $Presion= $Presion + $BarPressure;
    		 $Humedad = $Humedad + $Humidity;
    }// fin for
             
    		 echo "estoy dentro del promedio";
    		 $Direccion= $Direccion /12;
     		 $Velocidad=  $Velocidad /12;
    		 $Temperatura=$Temperatura /12 ;
    		 $OneHour= $OneHour /12 ;
    		 $Presion= $Presion /12;
    		 $Humedad = $Humedad /12;
    		 
      		$query = "INSERT INTO  valores (Direccion,Velocidad,Temperatura,OneHour,Presion,Humedad ) VALUES('".$Direccion.		"','".   $Velocidad."','".$Temperatura."','".$OneHour."','".$Presion."','".$Humedad."')";
        // Ejecutamos la instrucción
        	mysqli_query($enlace, $query);
      		mysqli_close($enlace);
    	
      Votos: 0 - Link respuesta
     
  • Fecha: 13-10-2016 06:33:39 De nada Anabel, intenta hacer un echo de $query a ver si la misma se esta confeccionando correctamente, copia el resultado y ejecutalo directamente en MySQL a ver si tienes algun error que no se te este presentando en PHP.

    Cuando no tienes mas errores, no te queda otra que comenzar a hacer debug de tu código, si tienes un editor y/o IDE que soporte xdebug (como Netbeans) podrás verificar tu código de una forma más optima, sino no te queda otra más que ir poniendo echo o var_dump(), luego un exit y ver que sale por pantalla.

    Aquí te dejo una nota que escribí hace un tiempo: Configurar XDebug en NetBeans (debug código PHP)

    Un código de ejemplo para el debug básico:
    echo $query;
    exit;
    


    Saludos y buen código!
      Votos: 0 - Link respuesta
     
  • Fecha: 13-10-2016 09:28:31 Gracias Fernando!!..uso dreamweaver.... pero voy a instalar el netbeans
    Voy a leer lo q enviaste y comento.
      Votos: 0 - Link respuesta
     
  • Fecha: 13-10-2016 10:28:26 Al parecer te has liado con las consultas entre tanta comilla simple y doble.
    los values siempre y cuando sean enteros van sin comillas , ni dobles ni simples.
    Actualmente estan asi:
     
    VALUES('".$Direccion.        "','".   $Velocidad."','".$Temperatura."','".$OneHour."','".$Presion."','".$Humedad."')";
    


    Personalmente lo dejaria asi

     
    VALUES($Direccion,   $Velocidad, $Temperatura, $OneHour, $Presion, $Humedad)";
    


    Si tienes algun valor como cadena de texto entre comillalo sino no.

    Tambien podrias usar un programa para la visualizacion de los querys de las bases de datos como por ejemplo MYSQL Workbench , que arroja lineas de colores cuando alguna consulta esta mal escrita.

    De otro lado permiteme te hago unas recomendaciones que nos dan algunos autores como Graddy Boch , Martin Fowler , entre otros.

    Evita tanto comentario de codigo
    //empieza esto
    //termina aquello
    El código debe entenderse como un libro , es decir como poesia

    Igualmente las variables en letra minuscula , las que deben iniciar en mayuscula son las clases.

    Esto no mejorara la ejecucion del codigo ni lo hara mucho mas rapido simplemente es cuestion de standarizacion tal como lo propone Zend , quien lleva el desarrollo de PHP.

    Podria proponerte una implementacion orientada a objetos ya que esta es mas flexible a la hora de agregar o quitar modulos es decir ampliar la aplicacion en un momento dado sin refactorizar toda la aplicacion.

    saludos y a ver si el problema era la query.
      Votos: 0 - Link respuesta
     
  • Fecha: 13-10-2016 15:51:34 muchas gracias....sobre todo por los consejos, siempre son bienvenidos para mejorar.
    Pruebo y comento como salio.
      Votos: 0 - Link respuesta
     
  • Fecha: 13-10-2016 22:26:53 Hola Anabel espero te haya servido lo de la consulta , si sigue sin funcionarte prueba colocar los valores solo entre comillas simples y ya esta. es decir
     VALUES('variable1' , 'variable2');
    


    a mi a vaces me da la lata y a veces las pilla y a otras no. Esto lo recorde hoy asi que por eso no te lo escribi ayer.

    De otro lado acerca de las sugerencias , casi todas las que te comente estan en un excelente libro llamado CLEAN CODE de Robert C Martin , este esta en español . Te dejo el enlace
    http://www.mediafire.com/file/6gmp5jrq5jbdpd9/Codigo+Limpio.pdf

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 14-10-2016 04:29:40 Anabel, no creo que tu problema este en la forma en que confeccionas tu INSERT, parece estar bien, aunque al desconocer la estructura de tu tabla "valores" no puedo saber si es valida la query o no.....

    Como bien comenta Adrian, uno suele confundirse fácilmente (liarse) con este tipo de cosas. Yo te voy a hacer hincapié en un punto clave al momento de confeccionar una query/consulta concatenando variables: tener presente la diferencia entre comillas simples ' y comillas dobles ".

    Simplificando este asunto, toda variable que coloques dentro de un string encerrado entre comillas dobles será interpretada (expandida), o sea, se remplazará por el valor que contiene dicha variable en el string final. Para extender sobre el concepto, lee en la documentación oficial de php análisis de string

    Volviendo a tu código, así es como debería quedar tu query:
    $query = "INSERT INTO valores (Direccion, Velocidad, Temperatura, OneHour, Presion, Humedad) VALUES ('$Direccion','$Velocidad','$Temperatura','$OneHour','$Presion','$Humedad');";

    Nota: aquí tal vez pareciera que las variables $XXXX se toman como string y no como variables por un tema de colores del presentador de código de PHPCentral, esto en el editor por lo general se ve de otro color, creeme que así funciona.

    Y por otro lado, itenta ejecutar esto directamente contra MySQL (en Workbench, phpMyAdmin, o el editor que uses):
    INSERT INTO valores (Direccion, Velocidad, Temperatura, OneHour, Presion, Humedad) VALUES ('99','99','99','99','99','99');

    Nota: este inserte es un ejemplo de posible query que estaría ejecutando PHP, si no te funciona en el editor tampoco lo hará desde PHP, y habrá que ver cual es el error (comentalo).

    Saludos y buen código!
      Votos: 0 - Link respuesta
     
  • Fecha: 14-10-2016 06:36:34 muchas gracias....sobre todo por los consejos, siempre son bienvenidos... voy a mirar el libro.
    El insert en phpmyadmin anda perfecto.... salvando que equivoque los parametros del insert y era asi
     $query = "INSERT INTO  valores (WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity  )VALUES($Direccion, $Velocidad, $Temperatura, $OneHour, $Presion, $Humedad)";
    


    ahora entra al for...le puse un echo dentro y lo muestra en el navegador... pero aun no me inserta
      Votos: 1 - Link respuesta
     
  • Fecha: 14-10-2016 07:04:33 Buenas tardes, separá el VALUES del paréntesis, capaz que ahí está el error.

    $query = "INSERT INTO  valores (WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity) VALUES ($Direccion, $Velocidad, $Temperatura, $OneHour, $Presion, $Humedad)";
    


    Y como dice Fernando, cuando no te funciona la query, probalo siempre contra la base (desde phpMyAdmin, por ej) y ahi te va a salir el error

    Saludos

    DIEGO
      Votos: 1 - Link respuesta
     
  • Fecha: 14-10-2016 07:24:49 Hola Diego, no funciona... probe de insertarlo desde el phpmyadmin e inserta los datos... el tema es el for.... entra pero cuando sale no inserta
    Gracias

    Hice un archivo aparte solo con la parte que no funciona... cambie el for por un while... y ahora me inserta.... pero cualquier cosa
    la conexion a la bd no la pongo aqui..pero esta
    Probe insertando todos valores 10.... y este es el resultado que me guarda


    $i = 1;
    	while ($i <= 12) {
    		 
    		 $resultado = mysqli_query($enlace,'SELECT * from temporal');
    		 $i = mysqli_fetch_array( $resultado);
    	   	 $Direccion= $Direccion + $WindDirection;
     		 $Velocidad=  $Velocidad + $WindSpeedAverage;
    		 $Temperatura=$Temperatura + $Temperature ;
    		 $OneHour= $OneHour + $RainfallOneHour ;
    		 $Presion= $Presion + $BarPressure;
    		 $Humedad = $Humedad + $Humidity;
    		 $i++;
    	}// fin while
             
    		
    		 $Direccion = $Direccion /12;
     		 $Velocidad =  $Velocidad /12;
    		 $Temperatura = $Temperatura /12 ;
    		 $OneHour = $OneHour /12 ;
    		 $Presion = $Presion /12;
    		 $Humedad = $Humedad /12;
    		  echo "estoy dentro del promedio";
    		 
      		 $query = "INSERT INTO  valores (WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity  ) VALUES ($Direccion, $Velocidad, $Temperatura, $OneHour, $Presion, $Humedad)";
        // Ejecutamos la instrucción
        	mysqli_query($enlace, $query);
      		mysqli_close($enlace);
    	
    	echo "guardo en valores";
    	//mysqli_query($enlace, "TRUNCATE TABLE nombreTabla");
    	
     }// promedio y reset tabla
    
      Votos: 1 - Link respuesta
     
  • Fecha: 14-10-2016 10:49:48 Yo haría algo así
    Un campo estado con valor igual a 0 a aquellos registros que todavía no hiciste promedio.
    Si la cantidad de registros es igual a 12, saco los promedios y actualizo los registros con estado igual a 1 (significa que a esos registros ya les hice el promedio).

            $resultado = mysqli_query($enlace,'SELECT * from temporal WHERE estado = 0');
            if(mysqli_num_rows($resultado)==12){
                while($i = mysqli_fetch_array( $resultado)){
                   $Direccion= $Direccion + $i[0];
                   $Velocidad=  $Velocidad + $i[1];
                   $Temperatura=$Temperatura + $[2];
                   $OneHour= $OneHour + $[3];
                   $Presion= $Presion + $[4];
                   $Humedad = $Humedad + $i[5];
                }
                $Direccion = $Direccion /12;
                $Velocidad =  $Velocidad /12;
                $Temperatura = $Temperatura /12 ;
                $OneHour = $OneHour /12 ;
                $Presion = $Presion /12;
                $Humedad = $Humedad /12;
             
                 $query = "INSERT INTO  valores (WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity  ) VALUES ($Direccion, $Velocidad, $Temperatura, $OneHour, $Presion, $Humedad)";
              mysqli_query($enlace, $query);
    
              $query = "UPDATE temporal SET estado = 1";
              mysqli_query($enlace, $query);
              mysqli_close($enlace);
        }
        
     }
    


    Para que funcione mejor, utilizar transaction con su commit o rollback correspondiente.

    Aclaración: Utilizo mysqli con clases, no se si está bien utilizando mysqli con funciones pero una idea puede ser esa.

    Lo que estás haciendo es hacer 12 veces la consulta SELECT, asignas a $i el resultado de esa consulta (que es un arreglo del resultado del select) y después querer utilizar el valor del campo con $nombre_campo, el cual php no sabe que es.
    Otra cosa, tratá de no utilizar SELECT * FROM tabla, tratá de utlizar SELECT campo1, campo2, ... FROM tabla, aunque sean todos los campos. De esa manera, te asegurás que los campos son los correctos, le das el orden que quieras y, en el caso de que te modifiquen o modifiques la estructura, el SELECT sigue funcionando como uno quiere

    Saludos

    DIEGO
      Votos: 1 - Link respuesta
     
  • Fecha: 14-10-2016 11:24:08 Graciassss..... lo probe sin agregarle el campo estado y funciona...... lo completo asi como lo indicas y comparto el codigo completo!   Votos: 1 - Link respuesta
     
  • Fecha: 14-10-2016 19:41:45 Bueno... ya no se si corresponde al mismo hilo... he logrado acomodar todo y logre hacer un listado de la tabla valores, despues quiero mostrar los valores que va tomando cada 5 minutos en cajas de texto.. cuando lo hago asi
    http://192.168.1.10/splash/index.php?WindDirection=10&WindSpeedAverage=4&Temperature=9&RainfallOneHour=7&BarPressure=4&Humidity=2

    me muestra los valores en las cajas perfectamente... pero cuando conecto el arduino me puso el siguiente error
    Undefined index: WindSpeedAverage


    Luego hice lo siguiente... quizas una burrada... y me dio este error
        $WindDirection = isset (mysqli_real_escape_string($enlace, $_GET["WindDirection"]))? (mysqli_real_escape_string($enlace, $_GET["WindDirection"])) : NULL ;
    
    Cannot use isset() on the result of an expression (you can use "null !== expression" instead) 
    


    Ya casi es lo ultimo para poder presentar la version 1.0.... gracias a todos!
      Votos: 0 - Link respuesta
     
  • Fecha: 15-10-2016 04:06:45 Buen día, algo así tendría que quedar
    $WindDirection = isset (mysqli_real_escape_string($_GET["WindDirection"])) ? (mysqli_real_escape_string($_GET["WindDirection"])) : NULL ;
    


    Saludos

    DIEGO
      Votos: 0 - Link respuesta
     
  • Fecha: 15-10-2016 06:04:21 Hola Diego! muchas gracias!.... me sigue tirando el mismo error
    Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in C:\xampp\htdocs\splash\index.php on line 16


    Subo todo lo que hice... ademas me falta el buscar por fecha que lo tengo como timestamp... pensaba usar un timepicker... pero me parece que es liado...

    
    <?php
    
    //enlace a BD
        $enlace = mysqli_connect("127.0.0.1","root","", "sensores");
    
    if (!$enlace) {
        echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
        echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL;
        echo "error de depuración: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }
    
    //echo "Éxito: Se realizó una conexión apropiada a MySQL! " . PHP_EOL;
    //echo "Información del host: " . mysqli_get_host_info($enlace) . PHP_EOL;
        // Leemos los valores que nos llegan por GET
        $WindDirection = mysqli_real_escape_string($enlace, $_GET["WindDirection"]);
        $WindSpeedAverage = mysqli_real_escape_string($enlace, $_GET["WindSpeedAverage"]);
        $Temperature = mysqli_real_escape_string($enlace, $_GET["Temperature"]);
        $RainfallOneHour = mysqli_real_escape_string($enlace, $_GET["RainfallOneHour"]);
        $BarPressure = mysqli_real_escape_string($enlace, $_GET["BarPressure"]);
        $Humidity = mysqli_real_escape_string($enlace, $_GET["Humidity"]);
    	$time = time();
        $fecha= date("d-m-Y (H:i:s)", $time);
     //insertamos los datos en la tabla temporal
      $query = "INSERT INTO temporal(WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity ) VALUES ('".		  $WindDirection."','".$WindSpeedAverage."','".$Temperature."','".$RainfallOneHour."','".$BarPressure."','".$Humidity."')";
      mysqli_query($enlace, $query);
    	
    //consulta el id 
     	$resultado = mysqli_query($enlace, "SELECT MAX(id) AS 'id' from temporal WHERE estado = 0");
        $fila = mysqli_fetch_assoc($resultado);
        $fila['id'];
     
       // Si es igual a 12 inserta los valores en valores
    If ($fila['id'] == 12)  {
        
    	$Direccion=0;
    	$Velocidad=0;
    	$Temperatura=0;
    	$OneHour=0;
    	$Presion=0;
    	$Humedad=0;
      	
    	$i = 1;
    	
    		 
    		 $resultado = mysqli_query($enlace,'SELECT * from temporal ');
            if(mysqli_num_rows($resultado)==12){
                while($i = mysqli_fetch_array( $resultado)){
                   $Direccion = $Direccion + $i[0];
                   $Velocidad =  $Velocidad + $i[1];
                   $Temperatura = $Temperatura + $i[2];
                   $OneHour = $OneHour + $i[3];
                   $Presion = $Presion + $i[4];
                   $Humedad = $Humedad + $i[5];
                 }
    		
                $Direccion = $Direccion /12;
                $Velocidad =  $Velocidad /12;
                $Temperatura = $Temperatura /12 ;
                $OneHour = $OneHour /12 ;
                $Presion = $Presion /12;
                $Humedad = $Humedad /12;
             
                 $query = "INSERT INTO  valores (WindDirection,WindSpeedAverage,Temperature,RainfallOneHour,BarPressure,Humidity  ) VALUES ($Direccion, $Velocidad, $Temperatura, $OneHour, $Presion, $Humedad)";
              mysqli_query($enlace, $query);
    
              $query = "UPDATE temporal SET estado = 1";
    		 
              mysqli_query($enlace, $query);
    		  mysqli_query($enlace, "TRUNCATE TABLE temporal");
              mysqli_close($enlace);
        }
        
     }
    	
    
    	
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>ESTACION METEOROLOGICA DEL CENS Nº 451 - MONTE HERMOSO</title>
    </head>
    
    <body>
    <p>Estado del tiempo actualizado cada 5 minutos</p>
    <p>Fecha y Hora actual: 
    <input name="frase" type="text" value="<?php echo  $fecha; ?>" size="30" readonly="readonly" /></p>
    
    <p>
      Direccion del viento: 
      <input name="frase" type="text" value="<?php echo $WindDirection;?>" size="10" readonly="readonly" />
    </p>
    <p>Velocidad del viento: 
    
      <input name="frase" type="text" value="<?php echo $WindSpeedAverage;?>" size="10" readonly="readonly" />
    </p>
    <p>Temperatura: 
      <input name="frase" type="text" value="<?php echo $Temperature;?>" size="10" readonly="readonly" />
    </p>
    <p>Lluvia: 
      <input name="frase2" type="text" value="<?php echo $RainfallOneHour;?>" size="10" readonly="readonly" />
    </p>
    <p>
      Presión Barométrica: 
      <input name="frase2" type="text" value="<?php echo $BarPressure;?>" size="10" readonly="readonly" />
    </p>
    <p>
      Humedad: 
      <input name="frase" type="text" value="<?php echo $Humidity;?>" size="10" readonly="readonly" />
    </p>
    <table border="1" cellspacing=1 cellpadding=2 style="font-size: 8pt"><tr> </tr>
    <table width="946" border="1">
      <tr>
        <td width="276">&nbsp;</td>
        <td width="330">PROMEDIOS PRONOSTICO CADA 1 HORA</td>
        <td width="318">&nbsp;</td>
      </tr>
    </table>
    <p>&nbsp;</p>
    <tr>
      <td><font face="verdana"><b>Id</b></font></td>
    <td><font face="verdana"><b>Dirección del viento</b></font></td>
    <td><font face="verdana"><b>Velocidad del viento</b></font></td>
    <td><font face="verdana"><b>Temperatura</b></font></td>
    <td><font face="verdana"><b>Lluvia</b></font></td>
    <td><font face="verdana"><b>Presion</b></font></td>
    <td><font face="verdana"><b>Humedad</b></font></td>
    <td><font face="verdana"><b>Fecha</b></font></td>
    </tr>
    <?php
      $result = mysqli_query($enlace, "SELECT *  from valores");
      $numero = 0;
      while($row = mysqli_fetch_array($result)){
        echo "<tr><td width=\"10%\"><font face=\"verdana\">" . 
    	    $row["id"] . "</font></td>";
        echo "<td width=\"12%\"><font face=\"verdana\">" . 
    	    $row["WindDirection"] . "</font></td>";
        echo "<td width=\"10%\"><font face=\"verdana\">" . 
    	    $row["WindSpeedAverage"] . "</font></td>";
    	echo "<td width=\"10%\"><font face=\"verdana\">" . 
    	    $row["Temperature"] . "</font></td>";
    	echo "<td width=\"10%\"><font face=\"verdana\">" . 
    	    $row["RainfallOneHour"] . "</font></td>";
    	echo "<td width=\"10%\"><font face=\"verdana\">" . 
    	    $row["BarPressure"] . "</font></td>";
    	echo "<td width=\"10%\"><font face=\"verdana\">" . 
    	    $row["Humidity"] . "</font></td>";
        echo "<td width=\"25%\"><font face=\"verdana\">" . 
    	    $row["fecha"]. "</font></td></tr>";    
        $numero++;
      }
      echo "<tr><td colspan=\"15\"><font face=\"verdana\"><b>Cantidad de Registros: " . $numero . 
          "</b></font></td></tr>";
    ?>
    </body>
    </html>
    
      Votos: 1 - Link respuesta
     
  • Fecha: 15-10-2016 21:27:52 Hola Anabel, antes que nada si sos madre feliz día de la madre (como nota de color, hoy 16/10 se celebra en Argentina el día de la madre).

    Volviendo a lo que nos compete, es lógico el error que estas obteniendo, porque el isset() lo estas usando de una forma incorrecta, con esta función deberías comprobar si esta seteada la clave en el array superglobal $_GET antes de intentar acceder al dato contenido en dicha clave.

    Veamos en código:

    Mal aplicado:
    $WindDirection = isset (mysqli_real_escape_string($enlace, $_GET["WindDirection"]))?(mysqli_real_escape_string($enlace, $_GET["WindDirection"])) : NULL ;


    Una opción pro (usando el if ternario):
    $WindDirection = (isset($_GET["WindDirection"]) ? mysqli_real_escape_string($enlace, $_GET["WindDirection"]) : NULL);


    Una opción tradicional y más legible:
    if (isset($_GET["WindDirection"])) {
        $WindDirection = mysqli_real_escape_string($enlace, $_GET["WindDirection"]);
    } else {
        $WindDirection = NULL;
    }


    Lección: siempre que no se pueda garantizar la existencia de una clave en un array se debe comprobar por medio de isset() para evitar mensajes/errores del tipo "Notice: Undefined index"

    Saludos y buen código!
    Fernando
      Votos: 0 - Link respuesta
     
  • Fecha: 16-10-2016 06:28:00 Hola Fernando....gracias! Soy de Argentina....no soy madre pero soy una feliz tia de 15 sobrinos!
    Gracias por la data....como comente anteriormente llevo años sin hacer una linea de codigo (facil 6 años).

    Lo pruebo y comento como salio

    Pd: ahora queda listar por fecha desde la tabla valores...queria usar un datepicker, pero tengo fecha en mysql como timestamp y por lo que lei es un menudo lio....consejo x favor....
      Votos: 1 - Link respuesta
     
  • Fecha: 16-10-2016 10:05:48 Bueno... ahora no me tira error algun... pero tampoco me muestra los datos y para peor me carga la BD con 0....

    Probe de con este codigo, pero lo mismo no muestra nada
    <?php
    echo "<br/> Hora : ".$fecha."...";
    echo " <br/> Velocidad del viento : ".$WindSpeedAverage."Km/h";
    echo " <br/> Direccion del viento : ".$WindDirection."..";
    echo " <br/> Temperatura : ".$Temperature."ºC";
    echo " <br/> Lluvia : ".$RainfallOneHour."mm/h";
    echo " <br/> Presion atmosferica : ".$BarPressure."Pascales";
    echo " <br/> Humedad : ".$Humidity."%";
    ?>
    


    Esto es la recomendacion de Fernando
    $WindDirection = (isset($_GET["WindDirection"]) ? mysqli_real_escape_string($enlace, $_GET["WindDirection"]) : NULL);				    $WindSpeedAverage = (isset($_GET["WindSpeedAverage"]) ? mysqli_real_escape_string($enlace, $_GET["WindSpeedAverage"]) : NULL);
    	$Temperature = (isset($_GET["Temperature"]) ? mysqli_real_escape_string($enlace, $_GET["Temperature"]) : NULL);
    	$RainfallOneHour = (isset($_GET["RainfallOneHour"]) ? mysqli_real_escape_string($enlace, $_GET["RainfallOneHour"]) : NULL);
    	$BarPressure = (isset($_GET["BarPressure"]) ? mysqli_real_escape_string($enlace, $_GET["BarPressure"]) : NULL);
    	$Humidity = (isset($_GET["Humidity"]) ? mysqli_real_escape_string($enlace, $_GET["Humidity"]) : NULL);
    	$time = time();
        $fecha= date("d-m-Y (H:i:s)", $time);
      Votos: 1 - Link respuesta
     
  • Fecha: 16-10-2016 22:17:48 Hola Anabel

    Un par de cosas.

    En el fichero htaccess de tu proyecto coloca la siguiente linea , no sea que haya algun tipo de error que este por defecto en off , asi los activamos todos por si las moscas.

    php_flag display_startup_errors on
    php_flag display_errors on
    php_flag html_errors on

    De donde vienen los valores GET o mas bien como los enviás para recibirlos y procesarlos aqui ?
    Si ya lo has colocado disculpa pero no lo he visto. :)

    Tambien cuando a mi me da este tipo de problemas yo lo que hago es colocar primero un campo y probar , de esta manera voy viendo si la consulta me va funcionando o es un solo campo el que puede "joder" al resto. Es mera practica.

    Por ultimo comentarte que vayas con calma y bueno tomate tu tiempo en la documentación mas que en escribir el código , el código funcionara si o si , dedica tiempo a utilizar herramientas como Workbench de mysql para pulir las consultas que harás en la base de datos ya que este te muestra código de error cuando algo falla y por ahi tomarlo mas facil. El phpmyadmin también sirve pero prefiero el workbench que es mas rápido , mas amigable y por su puesto puedo trabajar con varias bases de datos a la vez.

    Por ultimo hay un tipo de consulta que puede funcionarte tambien

    $query ="REPLACE INTO tabla SET campo_uno = $WindDirection, campo_dos = $WindSpeedAverage, campo_tres = $Temperature";
    


    o tambien

    $query ="INSERT INTO tabla SET campo_uno = $WindDirection, campo_dos = $WindSpeedAverage, campo_tres = $Temperature";
    


    Supongo que trabajas con números enteros por lo cual omito las comillas.

    Saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 17-10-2016 05:14:10 Hola Adrian, muchas gracias por tomarte el tiempo por responderme.
    Te comento que funciona todo.... se lio todo cuando quiero mostrar los datos por pantallas cuando recibo desde el get (el isset)... si quito el isset inserta los datos, pero cuando los coloco para mostrar los datos ya deja de insertar... y tampoco los muestra por pantalla.
    Los valores son float e int que trabajo.
    Probe el .htacess.... pero pasa algo extraño.... si yo pasos los valores por get de forma manual asi por ejemplo los muestra e inserta
    http://192.168.1.10/estacion/index.php?WindDirection=1&WindSpeedAverage=4&Temperature=9&RainfallOneHour=7&BarPressure=4&Humidity=2


    pero si espero los datos del microcontrolador no los inserta (o inserta a veces) en la BD y no los muestra tampoco.

    Agregue esta linea... pero tampoco me ha sido util
    <meta http-equiv="refresh"  content="60" />
      Votos: 0 - Link respuesta
     
  • Fecha: 17-10-2016 10:27:16 Hola Anabel la linea no funciona porque no hace nada propiamente dicho con la base de datos simplemente hace un refresh a la pagina.

    Si dices que los inserta unas veces si y otras no deberías estar atenta cuando si y cuando no , por eso te comente lo de hacer campo por campo , después de probar los primeros tres campos y que funcionen bien entonces insertas los otros , asi controlas mejor la ejecución del código.

    Retomando lo anterior si no los muestra, entonces el problema esta en la recuperación de los datos desde la base de datos porque supongo que es desde alli de donde vienen.

    También hay un par de cosas respecto del isset y el msqli_scape.

    si los datos se envina desde un microcontrolador que es la que envia los datos esto no lo necesitarías porque se hace de forma automática , Si el usuario fuera quien colocara los valores en tu aplicación si lo necesitarías , el isset para validar que haya mandado todo y el real_scape para controlar caracteres especiales y evitar inyección de código y entonces lo que necesitarias es guardarlos y mostralos simplemente.

    Para mostrarlos como los estas trayendo desde la base de datos o se muestran directamente asi como el ejemplo que me has enseñado.

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 17-10-2016 10:50:56 Hola Adrian... muchas gracias por contestar...
    En breves renglones te explico.... cada 5 minutos el microcontrolador envia datos del tiempo que almaceno en una tabla temporal, pero cuando los capturo los quiero mostrar por pantalla.
    luego de 12 veces que almacena (una hora) me hace un promedio, destruye los datos de la tabla temporal y lo pasa a otra tabla permanente.
    Si le quito el isset funciona perfecto....se pone inestable con el isset....
    De ahi que lo quiero mostrar cuando lo captura en el get.... lei por ahi usar un filter_input... pero ya se me hizo un enriedo con tanta sentencia...
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com