Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem bei SQL INSERT

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem bei SQL INSERT

    Zunächst erstmal ein Hallo an alle hier im Forum. Ich bin ganz neu hier und habe mich als User registriert, da ich von PHP fast noch nichts weis und mir deshalb von Euch Spezialisten hilfreiche Tipps erhoffe. Eigentlich komme ich mehr aus der Delphi-Programmierung, aber neue Aufgaben erfordern auch mal neue Wege zur Lösung.
    Es geht um folgendes Problem:
    Wir erhalten aus ständigen Temperaturüberwachungen binäre Messwertdateien, deren Struktur auch bekannt ist. Diese Messwerte sollen dann in eine Datenbank geschrieben werden.
    Das Auslesen der Binärdatei erfolgt mit fread und das 'Erzeugen' der lesbaren Temperaturwerte (Typ double) mit der unpack-Funktion. Über var_dump wird mir auch der richtige Wert angezeigt.
    Will ich dann diesen Wert in die Datenbank schreiben (Feld 'T1' vom Typ double), so steht anschließend immer nur eine 0.000 in der Tabelle 'Temperaturwerte' drin. Erzeuge ich jedoch den Wert der Variable direkt, z.B. $t1='1.2345',
    dann wird der richtige Wert der Variablen in die DB eingetragen. Wo wäre dabei der Unterschied und wo mache ich hier eine Fehler ?
    Hier kurz ein einfacher Code.

    PHP-Code:
    $bytes=fread($file,8);         //T1
    $t1=unpack("d",$bytes);

    $query "INSERT INTO Temperaturwerte (T1) VALUES ('$t1')";
    $result mysql_query($query,$connection) or die ("Ungültige Anweisung "); 
    Der MySQL-Server läuft auf einer QNAP-NAS. PHP-Version 5.6.36

    Vielen Dank im voraus.

  • #2
    PHP-Code:
    mysql_ 
    Zitat von PHP Handbuch
    Diese Erweiterung ist seit PHP 5.5.0 veraltet und wurde in PHP 7.0.0 entfernt. Stattdessen sollten entweder die mysqli oder PDO_MySQL Erweiterungen genutzt werden
    Quelle: http://php.net/manual/de/intro.mysql.php

    Daher, zB: https://php-de.github.io/jumpto/pdo/...red-statements
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Werte sollten nicht direkt in SQL-Code eingefügt werden. Beschäftige dich mal mit Prepared Statements und am besten gleich PDO.

      Kommentar


      • #4
        Schalte in der Entwicklungsphase auch immer das Error-Reporting ein, damit dir Fehler auch angezeigt werden.
        Dein Code sollte dir dann eine Notice auswerfen, siehe auch das Errorlog zu PHP.

        Schau dir dann auch mal den Rückgabewert von unpack an, das ist nämlich nicht das was du erwartest.

        Kommentar


        • #5
          Ups, das Error-Reporting spuckt zumindest schon mal massenhaft Notices und Warnungen aus.
          Werde mich mal um das unpack-Problem und Prepared Statements kümmern. Vielleicht steckt dort ja mein Fehler.
          Bzgl. mysqli oder PDO befürchte ich, dass ich da auf der NAS nicht viel ändern kann.
          Es sollte doch zumindest auch unter mysql fehlerfrei laufen können, oder ?

          Kommentar


          • #6
            Ja. Mysql und Mysqli sind 2 verschiedene APIs, Wenn Mysql geht geht auch Mysqli. Ersteres ist in neueren PHP Versionen schon entfernt worden.
            http://php.net/manual/en/mysqlinfo.api.choosing.php

            Kommentar


            • #7
              Vielen Dank für die Tipps. Dieses Problem ist vorerst gelöst. Ich habe den unpack-Code nun folgendermaßen umgebaut (z,B. für 4 Messkanäle a 8 Byte):
              PHP-Code:
              if (!$bytes=fread($file,32)) return;   
                      
              $werte_format =
                          
              'dZeit1/' .    #Zeitkanal 1
                          
              'dT1/' .       #T1
                          
              'dT2/' .       #T2
                          
              'dT3';         #T3
                       
              $werte=unpack($werte_format,$bytes);

                       
              $t1 $werte['T1'];
                       
              $t2 $werte['T2'];
                       
              $t3 $werte['T3'];
                       
              $query "INSERT INTO Temperaturwerte (T5_1,T5_2,T5_3) VALUES ('$t1','$t2', '$t3')";
                       
              $result mysql_query($query,$connection) or die ("Ungültige Anweisung "); 
              Ich füge zwar immer noch die Werte direkt in den SQL-Code ein, aber mit 'Prepared Statements ' werde ich mich später beschäftigen.

              Und wie das so ist, gibt es gleich das nächste Problem:
              In der Messwertdatei ist ein 8-Byte Zeitstempel hinterlegt, der als double z.B. einen Wert = 43489.6458333 hat.
              Wie kann ich denn daraus eine normale Zeitangabe machen, möglichst noch getrennt nach Datum und Zeit ?
              Gibt es dazu auch spezielle Funktionen wie beispielsweise im Delphi die Funktion FormatDateTime ?
              Vielen Dank

              Kommentar


              • #8
                Zitat von deurkama Beitrag anzeigen
                Ich füge zwar immer noch die Werte direkt in den SQL-Code ein, aber mit 'Prepared Statements ' werde ich mich später beschäftigen.
                Und #2 nicht vergessen, gleich mit den PrepStatments mit zu ändern (zB auf PDO zu gehen). Du nutzt derzeit nämlich eine tote MySQL-API.
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Zitat von deurkama Beitrag anzeigen
                  Und wie das so ist, gibt es gleich das nächste Problem:
                  In der Messwertdatei ist ein 8-Byte Zeitstempel hinterlegt, der als double z.B. einen Wert = 43489.6458333 hat.
                  Wie kann ich denn daraus eine normale Zeitangabe machen, möglichst noch getrennt nach Datum und Zeit ?
                  Kein Thema. PHP kennt von Hause aus aber kein Float-Timestamp. Welches Datum/Zeit soll denn der Wert 43489.6458333 liefern? Gibt es dafür eine Vorschrift/Norm?

                  Kommentar


                  • #10
                    Es gibts sowas, für den aktuellen (und nur den) TS. Zu zurückrechnen wäre interessant.. da kannst eh nur den Nachkommaanteil kappen!?

                    PHP-Code:
                    var_dumpmicrotime(true) );
                    // float(1549448039.8431) 
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      In der Messwertdatei ist ein 8-Byte Zeitstempel hinterlegt, der als double z.B. einen Wert = 43489.6458333 hat.
                      Wie kann ich denn daraus eine normale Zeitangabe machen, möglichst noch getrennt nach Datum und Zeit ?
                      Da Google wohl ein Aussetzer hat liefere ich mal den entsprechenden LInk
                      http://delphidabbler.com/tips/30

                      in PHP
                      PHP-Code:
                      function delphi_to_unix_timestamp($delphiTS){

                          
                      $timestamp round($delphiTS 25569.0)* 86400;
                          return 
                      $timestamp;
                      }

                      echo 
                      date("Y-m-d H:i:s"delphi_to_unix_timestamp(43489.6458333)); 
                      ergibt
                      2019-01-25 01:00:00

                      Dieses Ergebnis kannst du direkt als DateTime Datentyp für die Datenbank verweneden.

                      Kommentar


                      • #12
                        Hallo und schon mal vielen Dank für die Vorschläge.
                        Ich mache wohl wieder etwas falsch.
                        Ich bekomme für drei verschiedene Werte (43489.5677894, 43489.5886227 und 43489.609456) immer die gleiche Angabe zurück: 2019-01-25 01:00:00
                        PHP-Code:
                        echo date("Y-m-d H:i:s"delphi_to_unix_timestamp(43489.5677894));
                        echo 
                        date("Y-m-d H:i:s"delphi_to_unix_timestamp(43489.5886227));
                        echo 
                        date("Y-m-d H:i:s"delphi_to_unix_timestamp(43489.609456)); 


                        Die Werte müssten sich aber immer um 30 Minuten unterscheiden und mit dem 25.01.2019 hat es auch nichts zu tun.

                        Kommentar


                        • #13
                          Schau dir die verlinkte Seite an. Hier wird der komplette Ausdruck gerundet.

                          Kommentar


                          • #14
                            In der Tat, da habe ich eine Klammerebene vergessen.

                            PHP-Code:
                            <?php
                            function delphi_to_unix_timestamp$delphiTS )
                            {

                                
                            $timestamp round(($delphiTS 25569.0)* 86400);
                                return 
                            $timestamp;
                            }

                            echo 
                            date("Y-m-d H:i:s"delphi_to_unix_timestamp(43489.6458333));
                            ?>
                            Da kommt dann natürlich was ganz anderes bei raus.

                            Kommentar


                            • #15
                              deurkama : Du solltest schon wissen welchen Timestamp du hier umrechnen möchtest anstelle blind Skriptvorschläge zu kopieren. In #14 ist m.E. immer noch ein Fehler drin.

                              Kommentar

                              Lädt...
                              X