Daten über das Webfront von Hand in eine MySQL eingeben und auswerten

Hallo zusammen,

da immer mal wieder die Frage nach manuellen Eingaben über das WF auftaucht, hier mal meine Lösung am Beispiel zur Erfassung des monatlich abgelesenen Trinkwasserverbrauchs.

Grobe Vorgehensweise:

  • MySQL-server installieren (wenn nicht vorhanden)
  • MySQLTabelle für den jeweiligen Zweck anlegen
  • ein Eingabescript anlegen und konfigurieren (Ansicht im WF und übergabe an das Ausgabescript)
  • ein Ausgabescript anlegen und konfigurieren (Verarbeitung der eingegebenen Daten, Weiterverarbeitung, evtl hinzufügen von Daten anderer (MySQL) Daten und schreiben in die MySQL Datenbank.
  • Auswerten mit HighCharts

Voraussetzungen: MySQL-Server.
Empfehlung: MySQL Workbench, zur einfacheren Kontrolle und evtl Korrektur der Tabellen und Daten.
Empfehlung: Ein Editor mit dem das ein u. Ausgabescript bearbeitet werden. Ich nutze NotePad++
Empfehlung: Die Zugangsdaten und Tabellen-Namen in der __autoload.php zentral in Variablen ablegen.
Dann muss man, wenn sich was ändert nicht alle Scripte anpassen.
Bsp:
$MySQLAdmin=‚xxx‘; // Name des MySQL-Users der da reinschreiben und manipulieren darf
$MySQLAdminPW=‚xxx‘;
$MySQLIP=‚192.168.xxx.xxx‘; //die ip des MySQL-Hosts
$MySQLPort=’:3306’; // wenn nicht verändert der Standadport
$IPS_DB=‚xxx‘; // Name der Datenbank (nicht der Tabelle)
$TBL_Verbr_Wasser_demo = ‚tbl_Verbr_Wasser_TW_demo‘;

Man sollte sich Gedanken machen, wie die Tabelle aufgebaut werden soll, und ob Daten aus anderen Tabellen einfliessen sollen.
Z.B eine extra Tabelle, in der Preise für z.B Strom, Wasser, Abwasser zentral abgelegt sind.
Die X hinter machen SpaltenNamen sollen Fehler / Probleme beim nutzen von Spaltennamen im Script mit vorbelegten Namen in der jewiligen Scriptsprache vermeiden.

Also am Beispiel für den Trinkwasserverbrauch sieht meine Tabelle so aus:
id: integer, autoincrment, primaryKey // So ein Feld sollte jede Tabelle haben zur eindeutigen Identifizierung der Datensätze
abgelwert: decimal (12,3) // nimmt die Eingabe auf
Verbrauch: double // errechneter Verbrauchswert zwischen dem neuen und dem zuletzt eingegebenen Wert
Kosten: decimal(4,2) // die errechneten Kosten für den errechneten Verbrauchswert zwischen dem neuen und dem zuletzt eingegebenen Wert
DateDiffX: int(11) // Tage seit dem letzten Eintrag
VerbrauchTag: double // erechneter Tagesverbrauch
KostenTag: double // errechnete Tageskosten
Bemerkung: text // freie texteingabe
timestamp: timestamp // wird von MySQL automatisch mit aktuellem Datum u Uhrzeit befüllt wenn sich am Datensatz irgend was ändert

Script zum erstellen: Erstellen, anpassen, ausführen -> tabelle wird gelöscht wenn vorhandne und neu erstellt. Wenn alles läuft am besten die Bereiche „MySQL Tabelle $SQLTable löschen“ und „MySQL Tabelle $SQLTable erstellen“ auskommentieren.

<?
 // löscht die angegeben Tabelle (wenn vorhanden) und erstellt sie neu.
 // !! nur zur einmaligen Ausführung da sonst Daten wieder geöscht werden.

// MySQL DB-Daten:
$MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
$db = $IPS_DB;
$SQLTable = $TBL_Verbr_Wasser_demo;

//------------------------------------------------------------------------------
// MySQL Verbindung prüfen
if (!$MySQLConn)
    {IPS_LogMessage('MySQL_Create_Tab', 'error= '. mysql_error());}
     $db_selected = mysql_select_db($db, $MySQLConn);
if (!$db_selected)
    {IPS_LogMessage('MySQL_Create_Tab', 'opendb= '. mysql_error());}

//------------------------------------------------------------------------------
//MySQL Tabelle $SQLTable löschen
        $sql_drop_table = mysql_query("DROP TABLE ". $SQLTable . ";");
        if($sql_drop_table)
           {print_r("Tabelle gelöscht 
");}
        else
           {print_r("Tabelle nicht gelöscht 
");}

//------------------------------------------------------------------------------
//MySQL Tabelle $SQLTable erstellen
        $sql_create_table = mysql_query("CREATE TABLE " . $SQLTable . "(
            id INT NOT NULL AUTO_INCREMENT,
            datex datetime,
            AbgelWert DECIMAL(12,3),
            Verbrauch double,
            Kosten DECIMAL(4,2),
            DateDiffX INT(11),
            VerbrauchTag DOUBLE,
            KostenTag DOUBLE,
            Bemerkung Text,
            TimeStamp TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
            PRIMARY KEY (id));")
         OR die("'".$sql_create_table."':".mysql_error());

            if($sql_create_table)
               {print_r("Tabelle erstellt 
");}
            else
               {print_r("Tabelle nicht erstellt 
");}

//------------------------------------------------------------------------------
//MySQL Verbindung beenden
mysql_close($MySQLConn);

?>

So Weit ich das recherchiert habe benötigt man zum Speichern von Daten ein Eingabe und ein Ausgabescript.
Die beiden Scripte müssen in ein Unterverzeichnis von .\webfront\user. Das Eingabescript muss im WF als externe Seite eingebunden werden.
Eingabescript:
Integriert verschiedene js- Scripte und behandetlt z.T. Fehleingaben und fehlende Eingaben
Die Datumseingabe erfolgt über den Datepicker wenn man reinclickt oder Tastatur im Format tt.mm.yyyy ohne leerzeichen oder über den Button heute.
Die Werteingabe muss mit Punkt als Dezimaltrennzeichen erfolgen. Sonst gibt einen nicht abgefangen Fehler → wird nicht in die DB geschrieben.
Hier das Script das die EingabeMaske darstellt:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<!doctype html>
<html lang="de">

<head>

<meta charset="utf-8" />
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

<title>TrinkwasserVerbrauch Eingabe</title>
<!--link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" /-->
<link rel="stylesheet" href="/user/jquery/jquery-ui.css" />
<link rel="stylesheet" href="/user/jquery-timepicker-master/jquery.timepicker.css" />
<link rel="stylesheet" href="../../css/webfront.css" />

<!--script src="http://code.jquery.com/jquery-1.9.1.js"></script-->
<script type="text/javascript" src="/user/jquery/jquery.js"></script>

<!--script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script-->
<script type="text/javascript" src="/user/jquery/jquery-ui.js"></script>

<!--link rel="stylesheet" href="/resources/demos/style.css" /-->

<!--script src="https://raw.github.com/jonthornton/jquery-timepicker/master/jquery.timepicker.js"></script-->
<script type="text/javascript" src="/user/jquery-timepicker-master/jquery.timepicker.js"></script>

<script>

<!-- die Function macht den Datepicker deutsch. von: http://www.blogrammierer.de/jquery-ui-datepicker-in-deutscher-sprache/ -->
jQuery(function($){
        $.datepicker.regional['de'] = {clearText: 'löschen', clearStatus: 'aktuelles Datum löschen',
                closeText: 'schließen', closeStatus: 'ohne Änderungen schließen',
                prevText: '<zurück', prevStatus: 'letzten Monat zeigen',
                nextText: 'Vor>', nextStatus: 'nächsten Monat zeigen',
                currentText: 'heute', currentStatus: '',
                monthNames: ['Januar','Februar','März','April','Mai','Juni',
                'Juli','August','September','Oktober','November','Dezember'],
                monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
                'Jul','Aug','Sep','Okt','Nov','Dez'],
                monthStatus: 'anderen Monat anzeigen', yearStatus: 'anderes Jahr anzeigen',
                weekHeader: 'Wo', weekStatus: 'Woche des Monats',
                dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
                dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d',
                dateFormat: 'dd.mm.yy', firstDay: 1, 
                initStatus: 'Wähle ein Datum', isRTL: false};
        $.datepicker.setDefaults($.datepicker.regional['de']);
});

<!-- beim click auf heute aktuelles Datum gleich eintragen -->
$(
    function(){
        $('#setDate').click(function(){
            var now = new Date();
            if (now.getDate() < 10) var day = "0" + now.getDate(); else var day = now.getDate();
            if (now.getMonth()+1 < 10) var month = "0" + (now.getMonth()+1); else var month = now.getMonth()+1;
            var today = day + '.' + month + '.' + now.getFullYear();
            $('#datepicker').val(today);  
        });
        
    }
);

<!-- beim click auf jetzt aktuelle Uhrzeit gleich eintragen -->
$(
    function(){
     
        $('#setTime').click(function(){
            var now = new Date();
            if (now.getHours() < 10) var hour = "0" + now.getHours(); else var hour = now.getHours();
            if (now.getMinutes() < 10) var minute = '0' + now.getMinutes(); else var minute = now.getMinutes();
            var now = hour + ':' + minute;
            $('#timepicker').val(now);  
        });
        
    }
);

<!-- Datepicker Function -->
$(function() {
$( "#datepicker" ).datepicker(
    {
    dateFormat:'dd.mm.yy',
    disableTouchKeyboard: true,
    showOtherMonths: true,
    selectOtherMonths: true
    }
    );
});
<!-- Timepicker Function -->
$(function() {
$( "#timepicker" ).timepicker({
    show24Hours: true,
    scrollDefaultNow: true,
    timeFormat: 'H:i',
    step: 5,
    });
});

</script>

    
<style>.error {color: #FF0000;}</style>

</head>


<body>

<?php

// define variables and set to empty values

//$datexErr = $timexErr = $holzartErr = $stkErr = "";
$datex = $zaehlerstand = $Bem = "";


if ($_SERVER["REQUEST_METHOD"] == "POST")
{
    //echo "post";
   if (empty($_POST["datex"]))
     {$datexErr = "Datum ist Pflicht";}
   else
     {
     $datex = test_input($_POST["datex"]);
     // check if datex is a date like 31.12.2013
     if (!preg_match("/[\d]{2}+[\.]+[\d]{2}+[\.]+[\d]{4}/",$datex))
       {
       $datexErr = "Nur Datum im Format 31.12. 2013 erlaubt";
       }
     }
  
   if (empty($_POST["zaehlerstand"]))
     {$zaehlerstand = "Zählerstand ist Pflichtfeld";}
   else
     {
     $zaehlerstand = test_input($_POST["zaehlerstand"]);
     }
}


function test_input($data)
{
     $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);
     return $data;
}

?>

<!--h2>TrinkwasserVerbrauch Eingabe</h2-->
<!--p><span class="error">* required field.</span></p-->
<!--form action="<?php //echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post"-->
<form method="post" action="trinkwasser-ausgabe.php">

<table border="0">
  <tr>
    <td>*</td>

  </tr>
  <tr>
    <td>*</td>
    <td height="20" ><h2>TrinkwasserVerbrauch Eingabe</h2></td>
  </tr>
</table>
<table border="0">

  <colgroup>
    <col width="10">
    <col width="55">
    <col width="120">
    <col width="80">
  </colgroup>


  <tr>
    <td>*</td>
    <td height="20" >Datum:</td>
    <td><input type="text" name="datex" id="datepicker" value="<?php echo $datex;?>" style="width:100px;"/></td>
    <td><input type="button" name="setDate" value="heute" id="setDate" style="width:120px;"/></td>
  </tr>
  
  <tr>
    <td>*</td>
    <td height="20" >ZählerStand:</td>
    <td>
        <input type="text" name="zaehlerstand" value="<?php echo $zaehlerstand;?>" style="width:100px;"><br>
    </td>
  </tr>

  <tr>
    <td>*</td>
    <td height="20" >Bemerkung:</td>
    <td>
        <textarea name="Bem" cols="35" rows="4"> 
        </textarea>
    </td>
  </tr>
  
  <tr>
    <td>*</td>
    <td>Eingabe</td>
    <td>
        <input type="Submit" name="save" value="speichern" style="width:98px;"/>
    </td>
    <td>*</td>
  </tr>
  <!-- usw. andere Zeilen der Tabelle -->
</table>
</form>    
</body>
</html>

Und hier das Ausgabescript, das die eingegebenen Daten in die MySQL schreibt weiter bearbeitet und eine Rückmeldung gibt.
Das AusgabeScript hat eine Update-Funktion, d.h. wenn für das letzte Datum ein anderer Verbrauchswert (weil man sich beim ersten mal vertippt hat) eingegeben wird, werden die Daten für diesen Datensatz überschrieben. Ist sozusagen eine Korrekturfunktion.
Bei Eingabe eines Werts mit einem neuen Datum wird ein neuer Datensatz angelegt und die Werte Datum und Zählerstand eingetragen. Weiter wird die Datums u Werte-Differenz zum letzten Datensatz und die aktuellen Wasser und Abwasserpreise (bei mir aus einer anderen Tabelle, ihr müsst die Variablen hier statisch mit eueren Preisen setzen) ermittelt und daraus die Kosten und Werte pro Tag berechnet. Dann wird damit der letzte Datensatz (weil für den Moant gelten ja die ermittelten Verbrauchsdaten) aktualisiert.

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<!doctype html>
<html lang="de">

<head>
<link rel="stylesheet" href="../../css/webfront.css" />

<title>Trinkwasser Ausgabe</title>

</head>


<body>
<?
include 'trinkwasser-eingabe.php';

$datum = $_POST["datex"];
//$datum = date("Y-m-d H:i:m",strtotime($datum));
$zaehlerstand = $_POST["zaehlerstand"];
$Bem = $_POST["Bem"];

$fehler = "";

  if (empty($datum)) {
    $fehler .= "<li>Datum fehlt</li>" ;
  }
  if (empty($zaehlerstand)) {
    $fehler .= "<li>Zählerstand fehlt</li>" ;
  }

   if ($Bem == "") {
    $Bem = "''";}
    //echo $Bem;    

        // -------------------------------------------------
        // Function convertiert ein Datum (String) in einen Timestamp
        
        function convert_datetime($str) {
         list($datum) = explode(' ', $str);
         list($day, $month, $year) = explode('.', $datum);
         //list($hour, $minute) = explode(':', $datum);

         $timestamp = mktime(0, 0, 0, $month, $day, $year);

         return $timestamp;
        }
        //echo convert_datetime($datetime)."
";

        // -------------------------------------------------
        // Function convertiert einen Timestamp in ein Datum (String)
        function timestamp($t = null){
         if($t == null){
          $t = time();
         }
        return date('Y-m-d H:i:s', $t);
         }
        //echo timestamp(convert_datetime($datetime))."
";
    
if (empty($fehler)) { //wenn alles ausgefüllt
             // Weitere Daten berechnen
                // Tage seit letztem Eintrag
                // Verbrauch seit letztem Eintrag
                // Kosten Seit Letztem Eintrag
                // Verbrauch / Tag seit letztem Eintrag
                // Kosten / Tag seit letztem Eintrag
                //------------------------------------------------------------------------------
                // MySQL DB-Daten:
                $MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
                $db = $IPS_DB;
                $SQLTable1 = $TBL_Verbr_Wasser_demo;
                $SQLTable2 = $TBL_verbr_preise;
                //------------------------------------------------------------------------------
                // Verbindung prüfen
                if (!$MySQLConn)
                    {IPS_LogMessage('EingabeToMySQL', 'error= '. mysql_error());}
                     $db_selected = mysql_select_db($db, $MySQLConn);
                if (!$db_selected)
                    {IPS_LogMessage('EingabeToMySQL', 'opendb= '. mysql_error());}    
                    
                // Letztes Datum ermitteln ------------------------------------------------------
                  $sql_query1 = mysql_query("SELECT datex, Max(AbgelWert)
                                            FROM " . $SQLTable1 . ";")
                                            OR die("'".$sql_query1."':".mysql_error());
                  if($sql_query1) 
                        while($data = mysql_fetch_array($sql_query1, MYSQL_ASSOC))
                          {if ($data)
                            $MaxAbgelwert = $data['Max(AbgelWert)'];
                            $MaxDateX = $data['datex'];
                        //    echo "letzter Wert ".$MaxAbgelwert." 
--";
                        //    echo "letztes Datum ".$MaxDateX." 
--";                                
                          }
                // VorLetztes Datum ermitteln -----------------------------------------------------
                  $sql_query2 = mysql_query("SELECT datex, AbgelWert
                                            FROM " . $SQLTable1 . "
                                            ORDER BY datex DESC LIMIT 1,1;")
                                            OR die("'".$sql_query2."':".mysql_error());
                  if($sql_query2) 
                        while($data = mysql_fetch_array($sql_query2, MYSQL_ASSOC))
                          {if ($data)
                            $LMaxAbgelwert = $data['AbgelWert'];
                            $LMaxDateX = $data['datex'];
                        //    echo "vorletzter Wert ".$LMaxAbgelwert." 
--";
                        //    echo "vorletztes Datum ".$LMaxDateX." 
--";                                
                          }
                
                // Aktuelle Wasser und Abwasserpreise ermitteln --------------------------------
                //------------------------------------------------------------------------------
                // MySQL DB-Daten:
                $MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
                $db = $IPS_DB;
                  $sql_query3 = mysql_query("SELECT PreisEinheit 
                                            FROM " . $SQLTable2 . " where Kategorie = 'Wasser' and gueltig = 1 ;")
                                            OR die("'".$sql_query3."':".mysql_error());
                  if($sql_query2) 
                        while($data = mysql_fetch_array($sql_query3, MYSQL_ASSOC))
                          {if ($data)
                            $PreisWasser = $data['PreisEinheit'];
                            //echo $PreisWasser."
";                            
                          }
                          
                  $sql_query3 = mysql_query("SELECT PreisEinheit
                                            FROM " . $SQLTable2 . " where kategorie = 'Abwasser' and gueltig = 1;")
                                            OR die("'".$sql_query3."':".mysql_error());
                  if($sql_query2) 
                        while($data = mysql_fetch_array($sql_query3, MYSQL_ASSOC))
                          {if ($data)
                            $PreisAbwasser = $data['PreisEinheit'];
                            //echo $PreisAbwasser."
--";                            
                          }
            // GesamtwasserPreis -----------------------------------------------------------
            $WasserPreis = $PreisWasser + $PreisAbwasser;
            //echo "WasserPreis ".$WasserPreis."
--";

            
            //------------------------------------------------------------------------------
            //MySQL Verbindung beenden
            //mysql_close($MySQLConn);
            
            //------------------------------------------------------------------------------
            // Werte berechnen
            // Werte für update - Korrektur
                $LVerbrLetzterMonat = $MaxAbgelwert - $LMaxAbgelwert;
                //    echo "LVerbrMonat ".$LVerbrLetzterMonat."
--";
                $LKostenLetzterMonat = $LVerbrLetzterMonat * $WasserPreis;
                //    echo "LKostenMonat ".$LKostenLetzterMonat."
--";
                //echo $datum." - ".$MaxDateX."
--";
                $LTageLetzterMonat = date("d", convert_datetime($datum) - $MaxDateX);
                //    echo "LTageLetzterMonat ".$LTageLetzterMonat."
--";
                $LVerbrTag = round($LVerbrLetzterMonat/$LTageLetzterMonat,3);
                //    echo "LTagesverbrauch ".$LVerbrTag."
--";
                $LKostenTag = round($LVerbrTag*$WasserPreis,3);                  
                //    echo "LTagesKosten ".$LKostenTag."
--";
                $LBem = "'".$Bem."'";
                //    echo "Bemerkung ".$LBem."
--";
            // Werte für insert - neuer Datensatz u Eintrag der Verbrauchswerte des letzten
                $VerbrLetzterMonat = $zaehlerstand - $MaxAbgelwert;
                //    echo "VerbrMonat ".$VerbrLetzterMonat."
--";
                $KostenLetzterMonat = $VerbrLetzterMonat * $WasserPreis;
                //    echo "KostenMonat ".$KostenLetzterMonat."
--";
                //echo $datum." - ".$MaxDateX."
--";
                $TageLetzterMonat = date("d", convert_datetime($datum) - $MaxDateX);
                //    echo "TageLetzterMonat ".$TageLetzterMonat."
--";
                $VerbrTag = round($VerbrLetzterMonat/$TageLetzterMonat,3);
                //    echo "Tagesverbrauch ".$VerbrTag."
--";
                $KostenTag = round($VerbrTag*$WasserPreis,3);                  
                //    echo "TagesKosten ".$KostenTag."
--";
                $Bem = "'".$Bem."'";
                //    echo "Bemerkung ".$Bem."
--";

        // Daten in MySQL schreiben und vorher noch einige Werte ermitteln/bearbeiten ------      
        //----------------------------------------------------------------------------------
        // MySQL Verbindung prüfen
        if (!$MySQLConn)
            {IPS_LogMessage('EingabeToMySQL', 'error= '. mysql_error());}
             $db_selected = mysql_select_db($db, $MySQLConn);
        if (!$db_selected)
            {IPS_LogMessage('EingabeToMySQL', 'opendb= '. mysql_error());}

            //------------------------------------------------------------------------------
            else
                 {
                  $sql_query = mysql_query("SELECT datex
                                            FROM " . $SQLTable1 . "
                                            where datex = '".timestamp(convert_datetime($datum))."';")
                                            OR die("'".$sql_query."':".mysql_error());
                  if($sql_query) 
                        while($data = mysql_fetch_array($sql_query, MYSQL_ASSOC))
                          {if ($data)
                            $TimeData = $data['datex'];
                          }
                          if (isset($TimeData))
                            {//print_r("Eintrag gibts schon");
                            // letzen Datensatz mit abgelesenem Wert aktualisieren -----------------------------------------
                            $sql_update1 = mysql_query("UPDATE  ".$SQLTable1."
                                                    SET    AbgelWert='".$zaehlerstand."' 
                                                    where datex = '".date("Y-m-d",convert_datetime($datum))."';")
                                                    OR die("'".$sql_update1."':".mysql_error());
                                if($sql_update1)
                                    {echo "<Table><tr><td>*</td><td><font color=green><h2>Daten aktualisiert</h2></font></td></tr></table>";}
                                else
                                    {echo "<Table><tr><td>*</td><td><font color=red><h2>Daten nicht aktualisiert</h2></font></td></tr></table>";}
                            // und den vorletzen Datensatz mit den neu berechneten Werten aktualisieren ---------------------
                            $MaxDateXT = strtotime($datum);
                            $sql_update2 = mysql_query("UPDATE  ".$SQLTable1."
                                                    SET    Verbrauch=".$LVerbrLetzterMonat.", 
                                                        Kosten=".$LKostenLetzterMonat.", 
                                                        DateDiffX=".$TageLetzterMonat.", 
                                                        VerbrauchTag=".$LVerbrTag.", 
                                                        KostenTag=".$LKostenTag.",
                                                        Bemerkung=".$LBem."  
                                                    WHERE datex = "."'".date("Y-m-d",mktime(0, 0, 0, date("m",$MaxDateXT)-1, date("d",$MaxDateXT),   date("Y",$MaxDateXT)))."'".";")
                                                    OR die("'".$sql_update2."':".mysql_error());
                                if($sql_update2)
                                    {echo "<Table><tr><td>*</td><td><font color=green><h2>Daten aktualisiert</h2></font></td></tr></table>";}
                                else
                                    {echo "<Table><tr><td>*</td><td><font color=red><h2>Daten nicht aktualisiert</h2></font></td></tr></table>";}
                            exit;}
                  else
                    // wenns das eingegebene Datum noch nicht gibt
                    // Neuen Datensatz mit Datum u abgelesenem Wert einfügen -------------------------------
                    $sql_insert1 = "INSERT INTO  ".$SQLTable1." 
                                    SET datex        = '".timestamp(convert_datetime($datum))."',
                                    AbgelWert        = ".$zaehlerstand.",
                                    Bemerkung        = ".$Bem.";";
                                    
                    //echo $sqlinsert."
";
                    $sql_insert1 = mysql_query($sql_insert1)
                                            OR die("'".$sql_insert1."':".mysql_error());
                    if($sql_insert1)
                        {echo "<Table><tr><td>*</td><td><font color=green><h2>Daten eingefügt</h2></font></td></tr></table>";}
                    else
                        {echo "<Table><tr><td>*</td><td><font color=red><h2>Daten nicht eingefügt</h2></font></td></tr></table>";}
                    
                    // und den letzten Datensatz mit berechneten Werten aktualisieren -------------------------------
                    $MaxDateXL = strtotime($datum);
                    $sql_update3 = mysql_query("UPDATE  ".$SQLTable1."
                                            SET    Verbrauch=".$VerbrLetzterMonat.", 
                                                Kosten=".$KostenLetzterMonat.", 
                                                DateDiffX=".$TageLetzterMonat.", 
                                                VerbrauchTag=".$VerbrTag.", 
                                                KostenTag=".$KostenTag.",
                                                Bemerkung=".$Bem."  
                                            WHERE datex = "."'".date("Y-m-d",mktime(0, 0, 0, date("m",$MaxDateXL)-1, date("d",$MaxDateXL),   date("Y",$MaxDateXL)))."'".";")
                                            OR die("'".$sql_update3."':".mysql_error());
                        if($sql_update3)
                            {echo "<Table><tr><td>*</td><td><font color=green><h2>Daten aktualisiert</h2></font></td></tr></table>";}
                        else
                            {echo "<Table><tr><td>*</td><td><font color=red><h2>Daten nicht aktualisiert</h2></font></td></tr></table>";}
                }

            //------------------------------------------------------------------------------
            //MySQL Verbindung beenden
            mysql_close($MySQLConn);

}
else
    {echo "<Table>
                <tr><td>*</td><td><font color=red><h2>Eingabe nicht gespeichert</h2></font></td></tr>
                <tr><td>*</td><td><font color=red>".$fehler."</font></td></tr>
            
           </table>";
           
    if( isset($_SESSION['aktuell']) )
    {
        $_SESSION['letzte'] = $_SESSION['aktuell'];
        $_SESSION['aktuell'] = $_SERVER['PHP_SELF'];
        echo $_SESSION['letzte'];
    }
     
    }
?>
</body>
</html>

Die Auswertung mit HC (V2.x khc) sieht dann so aus:

<?php
    // ConfigScript für $version = "2.02"; $versionDate = "20.05.2012";

    // bei der Konfiguration unbedingt auf die Groß/Kleinschreibung achten
    // es wurde versucht folgende Namensgebeung in der Konfiguration zu verwenden
    // Parameter mit kleinen Anfangsbuchstaben = Parameter welche von Highcharts übnernommen wurden. Siehe dazu: http://www.highcharts.com/ref/
    // Parameter mit großen Anfangsbuchstaben = für das IPS-Highcharts-Script eingeführte Parameter

    Global $CfgDaten; // damit kann der Script auch von anderen Scripten aufgerufen werden und bereits mit CfgDaten vorkonfiguriert werden

    // IPS Variablen ID´s
    $CfgDaten['ContentVarableId']= 14672 /*[Logisch\Verbrauche\Wasser\HC\TrinkWasserVerbrauch\TrinkWasserVerbrauch]*/ ;  // ID der String Variable in welche die Daten geschrieben werden (-1 oder überhaupt nicht angeben wenn die Content Variable das übergordnete Element ist)
    $CfgDaten['HighChartScriptId']= 37577 /*[Global\HighCharts\Highcharts_V2.02.ips]*/ ;                  // ID des Highcharts Scripts

    // Highcharts oder Highstock (default = Highcharts
    $CfgDaten['Ips']['ChartType'] = 'Highcharts';


    // Zeitraum welcher dargestellt werden soll (kann durch die Zeitvorgaben in den Serien verändert werden)
    $CfgDaten['StartTime'] = mktime(0,0,0, 1, 1, 2014);
//    $CfgDaten['EndTime'] = mktime(23,59,59, date("m", time()) , date("d",time()), date("Y",time())); // ist ok für "jetzt"
    $CfgDaten['EndTime'] = mktime(0,0,0, date("m", time())-1 , date("d",time()), date("Y",time())); // "t" = Anzhl der Tage im Monat // nur bis zum letzten monat // 2678400 = 31 Tage in Sekunden
     $SQLStart = "'".date("Y-m-d H:i:s",$CfgDaten["StartTime"])."'";
//     print_r($SQLStart);
     $SQLEnd = "'".date("Y-m-d H:i:s",$CfgDaten["EndTime"])."'";
//     print_r($SQLEnd);
//    print_r(date("d",time()-2678400));
//------------------------------------------------------------------------------
// MySQL DB-Daten:
    $MySQLConn=mysql_connect($MySQLIP.$MySQLPort, $MySQLAdmin, $MySQLAdminPW);
    $db = $IPS_DB;
    $SQLTable1 = $TBL_Verbr_Wasser_demo;
    $db_selected = mysql_select_db($db, $MySQLConn);

//------------------------------------------------------------------------------
// MySQL Daten holen
// Trinkwasser-Verbrauchsdaten
        $sql_Ergebnis = mysql_query("SELECT DateX, Verbrauch, Kosten, VerbrauchTag, KostenTag, Bemerkung
                                                FROM " . $SQLTable1 ."
                                                WHERE DateX >= ".$SQLStart." AND DateX <= ".$SQLEnd."
                                                ORDER BY DateX;")
                                                OR die("'".$sql_Ergebnis."':".mysql_error());
      //$data = mysql_fetch_array($sql_Ergebnis, MYSQL_ASSOC); // wenn die Zeile aktiviert wird, beginnt der TimeStamp einen Tag später. ?? warum?? nicht gelöst.
            $i = 0;
                while($data = mysql_fetch_array($sql_Ergebnis, MYSQL_ASSOC))
                {
                     $DataForSerieVerbrauch[]    = array("Value"=>$data['Verbrauch']*1000, "TimeStamp"=>strtotime($data['DateX']), "TimeStampHuman"=>date("d.m.Y h:i",strtotime($data['DateX']))); //, "TimeStampHuman"=>date("d.m.Y",$data['TimeStamp']) geht nicht, ist schon human
                     $DataForSerieKosten[]        = array("Value"=>$data['Kosten'], "TimeStamp"=>strtotime($data['DateX']), "TimeStampHuman"=>date("d.m.Y h:i",strtotime($data['DateX'])));
                     $DataForSerieVerbrauchD[]    = array("Value"=>$data['VerbrauchTag']*1000, "TimeStamp"=>strtotime($data['DateX']), "TimeStampHuman"=>date("d.m.Y h:i",strtotime($data['DateX'])));
                $DataForSerieBemerkung[]    = array("Value"=>$data['Bemerkung'], "TimeStamp"=>strtotime($data['DateX']), "TimeStampHuman"=>date("d.m.Y h:i",strtotime($data['DateX'])));
                     }
            $i++;
//print_r($DataForSerieVerbrauch);

    // damit wird die Art des Aufrufes festgelegt
    $CfgDaten['RunMode'] = "script";     // file, script, popup

    if ($CfgDaten['RunMode'] == "popup")
    {
        $CfgDaten['WebFrontConfigId'] = 36122 /*[Wolf]*/ ;
        $CfgDaten['WFCPopupTitle'] = "Ich bin der Text, welcher als Überschrift im Popup gezeigt wird";
    }

    // **************************************************************************************
    // *** exporting *** http://www.highcharts.com/ref/#exporting
    // **************************************************************************************
     $CfgDaten['exporting']['enabled'] = false;

    // **************************************************************************************
    // *** PlotOptions *** http://www.highcharts.com/ref/#plotoptions
    // **************************************************************************************
        $CfgDaten['plotOptions']['series']['lineWidth'] = 2;
        $CfgDaten['plotOptions']['series']['states']['hover']['lineWidth'] = 4;
        $CfgDaten['plotOptions']['series']['marker']['symbol'] = 'circle';
        $CfgDaten['plotOptions']['series']['marker']['enabled'] = false;
        $CfgDaten['plotOptions']['series']['marker']['states']['hover']['radius'] = 5;
        $CfgDaten['plotOptions']['series']['marker']['states']['hover']['lineWidth'] = 2;
        $CfgDaten['plotOptions']['series']['marker']['states']['hover']['enabled'] = true;

    // **************************************************************************************
    // *** Highcharts Options ***
    // **************************************************************************************

    // **************************************************************************************
    // *** title *** siehe http://www.highcharts.com/ref/#title
    // **************************************************************************************
    $CfgDaten['title']['text'] = "<b>TrinkWasserverbrauch<\b>";

    $CfgDaten['subtitle']['text'] = "<b>Zeitraum: %STARTTIME% - %ENDTIME% <\b>";
    $CfgDaten['subtitle']['Ips']['DateTimeFormat'] = "M Y";

    // **************************************************************************************
    // *** yAxis *** http://www.highcharts.com/ref/#yAxis
    // **************************************************************************************
    $CfgDaten['yAxis'][0]['title']['text'] = "Wasserverbrauch";
    $CfgDaten['yAxis'][0]['Unit'] = "L";
    $CfgDaten['yAxis'][0]['opposite'] = false;
    $CfgDaten['yAxis'][0]['tickInterval'] = 500;
//    $CfgDaten['yAxis'][0]['min'] = 0;
//    $CfgDaten['yAxis'][0]['max'] = 70;

    $CfgDaten['yAxis'][1]['title']['text'] = Null;
    $CfgDaten['yAxis'][1]['labels']['enabled'] = false;
    $CfgDaten['yAxis'][1]['Unit'] = "€";
//    $CfgDaten['yAxis'][1]['opposite'] = false;
//    $CfgDaten['yAxis'][1]['tickInterval'] = 500;
//    $CfgDaten['yAxis'][1]['min'] = 0;
//    $CfgDaten['yAxis'][1]['max'] = 70;

    // **************************************************************************************
    // *** series *** http://www.highcharts.com/ref/#series
    // **************************************************************************************
    $serie = array();
    $serie['name'] = "Verbrauch";
    $serie['visible'] = true;
    $serie['showInLegend'] = false;
    $serie['Unit'] = "Liter";
    $serie['ReplaceValues'] = false;
    $serie['RoundValue'] = 1;
    $serie['type'] = "line";
    $serie['color']= '#2E9AFE'; //blau
    $serie['lineColor'] = '#2E9AFE';
    $serie['yAxis'] = 0;
//    $serie['marker']['enabled'] = false;
    $serie['shadow'] = true;
//    $serie['lineWidth'] = 1;
    $serie['states']['hover']['lineWidth'] = 2;
   $serie['states']['hover']['enabled'] = false;
//    $serie['marker']['states']['hover']['enabled'] = true;
//    $serie['marker']['states']['hover']['symbol'] = 'circle';
//    $serie['marker']['states']['hover']['radius'] = 4;
//    $serie['marker']['states']['hover']['lineWidth'] = 1;
   $serie['Data'] = $DataForSerieVerbrauch;
    $CfgDaten['series'][] = $serie;

    $serie = array();
    $serie['name'] = "Kosten";
    $serie['visible'] = True;
    $serie['showInLegend'] = false;
    $serie['Unit'] = "€";
    $serie['ReplaceValues'] = false;
    $serie['RoundValue'] = 2;
    $serie['type'] = "line";
    $serie['color']= '#2E9AFE'; //blau
    $serie['lineColor'] = '#2E9AFE';
    $serie['yAxis'] = 1;
//    $serie['marker']['enabled'] = false;
    $serie['shadow'] = true;
    $serie['lineWidth'] = 0;
//    $serie['states']['hover']['lineWidth'] = 2;
   $serie['states']['hover']['enabled'] = false;
//    $serie['marker']['states']['hover']['enabled'] = true;
//    $serie['marker']['states']['hover']['symbol'] = 'circle';
//    $serie['marker']['states']['hover']['radius'] = 4;
//    $serie['marker']['states']['hover']['lineWidth'] = 1;
   $serie['Data'] = $DataForSerieKosten;
    $CfgDaten['series'][] = $serie;

    $serie = array();
    $serie['name'] = "Verbr/Person/Tag";
    $serie['visible'] = True;
    $serie['showInLegend'] = false;
    $serie['Unit'] = "Liter";
    $serie['ReplaceValues'] = false;
    $serie['RoundValue'] = 2;
    $serie['ScaleFactor'] = 0.5; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
    $serie['type'] = "line";
    $serie['color']= '#2E9AFE'; //blau
    $serie['lineColor'] = '#2E9AFE';
    $serie['yAxis'] = 1;
//    $serie['marker']['enabled'] = false;
    $serie['shadow'] = true;
    $serie['lineWidth'] = 0;
//    $serie['states']['hover']['lineWidth'] = 2;
   $serie['states']['hover']['enabled'] = false;
//    $serie['marker']['states']['hover']['enabled'] = true;
//    $serie['marker']['states']['hover']['symbol'] = 'circle';
//    $serie['marker']['states']['hover']['radius'] = 4;
//    $serie['marker']['states']['hover']['lineWidth'] = 1;
   $serie['Data'] = $DataForSerieVerbrauchD;
    $CfgDaten['series'][] = $serie;

    $serie = array();
    $serie['name'] = "Bemerkung";
    $serie['visible'] = true;
    $serie['showInLegend'] = false;
    $serie['Unit'] = "";
    $serie['ReplaceValues'] = false;
    $serie['RoundValue'] = 2;
    $serie['ScaleFactor'] = 0.5; // Skalierungsfaktor mit welchem der ausgelesene Werte multipliziert wird
    $serie['type'] = "line";
    $serie['color']= '#2E9AFE'; //blau
    $serie['lineColor'] = '#2E9AFE';
    $serie['yAxis'] = 1;
//    $serie['marker']['enabled'] = false;
    $serie['shadow'] = true;
    $serie['lineWidth'] = 0;
//    $serie['states']['hover']['lineWidth'] = 2;
   $serie['states']['hover']['enabled'] = false;
//    $serie['marker']['states']['hover']['enabled'] = true;
//    $serie['marker']['states']['hover']['symbol'] = 'circle';
//    $serie['marker']['states']['hover']['radius'] = 4;
//    $serie['marker']['states']['hover']['lineWidth'] = 1;
   $serie['Data'] = $DataForSerieBemerkung;
    $CfgDaten['series'][] = $serie;

    // **************************************************************************************
    // *** tooltip *** http://www.highcharts.com/ref/#tooltip
    // **************************************************************************************
        $CfgDaten['tooltip']['useHTML']    = true;
       $CfgDaten['tooltip']['shared']    = true;
       $CfgDaten['tooltip']['crosshairs'][]    = array('width' =>1,'color' =>'grey','dashStyle'=>'dashdot' );
        $CfgDaten['tooltip']['formatter'] = "@function() {
            var s;
            var s = '<b>' + Highcharts.dateFormat('%b %Y', this.x) + '</b>';
            s += '<table cellspacing=\"0\" cellpadding=\"0\" cellpadding=\"0\">';
            $.each(this.points, function(i, point)
            {var unit = {
                '".@$CfgDaten['series'][0]['name']."': '"." ".@$CfgDaten['series'][0]['Unit']."',
                '".@$CfgDaten['series'][1]['name']."': '"." ".     '€' ."',
                '".@$CfgDaten['series'][2]['name']."': '"." ".@$CfgDaten['series'][2]['Unit']."',
                '".@$CfgDaten['series'][3]['name']."': '"." ".@$CfgDaten['series'][3]['Unit']."',
            }[point.series.name];
            var colorX = {
                '".@$CfgDaten['series'][0]['name']."': '".@$CfgDaten['series'][0]['lineColor']."',
                '".@$CfgDaten['series'][1]['name']."': '".@$CfgDaten['series'][1]['lineColor']."',
                '".@$CfgDaten['series'][2]['name']."': '".@$CfgDaten['series'][2]['lineColor']."',
                '".@$CfgDaten['series'][3]['name']."': '".@$CfgDaten['series'][3]['lineColor']."',
            }[point.series.name];

        s += '<td align=".'right'." colspan= 0><span style=color:' + colorX + '>' + this.series.name + ': </span></td>
                <td align=".'right'."><b><span style=color:' + colorX + '>' + ' '  + this.y + '</b></span></td>
                <td><b><span style=color:' + colorX + '>' + ' ' + unit + '</b></span></td>';
      s += '</tr>';
        });
        s += '</table>';
        return s;
        }@";

// PlotLines über der X-Achse --------------------------------------------------
// AbWasserpreiserhöhung 1.6.2009 von 1,69€ um 0,26€ auf 1,95€ = 13%
    $pl['value'] = mktime(0,0,0,6,1,2009)*1000; //1347490800 = 13.9.2012;
    $pl['label']['text'] = "Abwasserpreiserhöhung zum ". date("d.m.Y",$pl['value']/1000)."<br>".
                                    "Abwasservon 1,69€ um 0,26€ auf 1,95€ ~ 13%"."<br>".
                                    "Gesamt von 3,85€ um 0,26€ auf 4,11€ ~ 6%";
    $pl['color'] = 'darkgrey';
    $pl['dashStyle'] = 'longdashdot';
    $pl['width'] = 0.5;
    $pl['label']['x'] = -5; // verschiebt Text: - nach links; + nach rechts (absolut gesehen)
//    $pl['label']['y'] = 10; // verschiebt Text: - nach oben; + nach unten (absolut gesehen)
    $pl['label']['textAlign'] = 'right';
    $pl['label']['style']['color'] = 'white';
    $pl['label']['rotation'] = 0;
    $pl['zIndex'] = 0;
      $CfgDaten["xAxis"]['plotLines'][] = $pl;
      //---------------------------------------------------------------------------
// AbWasser + Wasserpreiserhöhung 1.3.2013
// Wasser von 2,16€ um 0,11€ auf 2,27€ = 5%
// AbWasser von 1,95€ um 0,20€ auf 2,15€ = 9%
    $pl['value'] = mktime(0,0,0,1,1,2012)*1000; //1347490800 = 13.9.2012;
    $pl['label']['text'] = "Abwasser und Wasserpreiserhöhung zum ". date("d.m.Y",$pl['value']/1000)."<br>".
                                    "Wasser von 2,16€ um 0,11€ auf 2,27€ ~ 5%"."<br>".
                                    "AbWasser von 1,95€ um 0,20€ auf 2,15€ ~ 9%"."<br>".
                                    "Gesamt von 4,11€ um 0,31€ auf 4,42€ ~ 7%";
    $pl['color'] = 'darkgrey';
    $pl['dashStyle'] = 'longdashdot';
    $pl['width'] = 0.5;
    $pl['label']['x'] = -5; // verschiebt Text: - nach links; + nach rechts (absolut gesehen)
//    $pl['label']['y'] = 10; // verschiebt Text: - nach oben; + nach unten (absolut gesehen)
    $pl['label']['textAlign'] = 'right';
    $pl['label']['style']['color'] = 'white';
    $pl['label']['rotation'] = 0;
    $pl['zIndex'] = 0;
      $CfgDaten["xAxis"]['plotLines'][] = $pl;
      //---------------------------------------------------------------------------
// AbWasserpreiserhöhung 4.6.2013 von 2,15€ um 0,05€ auf 2,20€ = 2,3%
    $pl['value'] = mktime(0,0,0,6,4,2013)*1000; //1347490800 = 13.9.2012;
    $pl['label']['text'] = "Abwasserpreiserhöhung zum ". date("d.m.Y",$pl['value']/1000)."<br>".
                                    "AbWasser von 2,15€ um 0,05€ auf 2,20€ ~ 2,3%"."<br>".
                                    "Gesamt von 4,42€ um 0,05€ auf 4,47€ ~ 1,1%";
    $pl['color'] = 'darkgrey';
    $pl['dashStyle'] = 'longdashdot';
    $pl['width'] = 0.5;
    $pl['label']['x'] = -5; // verschiebt Text: - nach links; + nach rechts (absolut gesehen)
//    $pl['label']['y'] = 10; // verschiebt Text: - nach oben; + nach unten (absolut gesehen)
    $pl['label']['textAlign'] = 'right';
    $pl['label']['style']['color'] = 'white';
    $pl['label']['rotation'] = 0;
    $pl['zIndex'] = 0;
      $CfgDaten["xAxis"]['plotLines'][] = $pl;

    // Highcharts-Theme
    //    $CfgDaten['HighChart']['Theme']="grid.js";   // von Highcharts mitgeliefert: dark-green.js, dark-blue.js, gray.js, grid.js
    $CfgDaten['HighChart']['Theme']="ips.js";   // IPS-Theme muss per Hand in in Themes kopiert werden....

    // Abmessungen des erzeugten Charts
    $CfgDaten['HighChart']['Width'] = 0;             // in px,  0 = 100%
    $CfgDaten['HighChart']['Height'] = 600;         // in px

    // -------------------------------------------------------------------------------------------------------------------------------------
    // und jetzt los ......
    $s = IPS_GetScript($CfgDaten['HighChartScriptId']);     // Id des Highcharts-Scripts
    include($s['ScriptFile']);

      // hier werden die CfgDaten geprüft und bei Bedarf vervollständigt
    $CfgDaten = CheckCfgDaten($CfgDaten);

    // abhängig von der Art des Aufrufs -> json String für Highcharts erzeugen
    if (isset($CfgDaten['RunMode'])
        && ($CfgDaten['RunMode'] == "script" || $CfgDaten['RunMode'] == "popup"))
    {
        // Variante1: Übergabe der ScriptId. Daten werden beim Aufruf der PHP Seite erzeugt und direkt übergeben. Dadurch kann eine autom. Aktualisierung der Anzeige erfolgen
        if ($IPS_SENDER != "WebInterface")
        {
            WriteContentWithScriptId ($CfgDaten, $IPS_SELF);             // und jetzt noch die ContentTextbox
            return;                                                   // Ende, weil durch die Zuweisung des Script sowieso nochmals aufgerufen wird
        }

        $sConfig = CreateConfigString($CfgDaten);                     // erzeugen und zurückgeben des Config Strings
    }
    else
    {
        //Variante2: Übergabe des Textfiles. Daten werden in tmp-File gespeichert. Eine automatische Aktualisierung beim Anzeigen der Content-Textbox erfolgt nicht
        $sConfig = CreateConfigString($CfgDaten);                     // erzeugen und zurückgeben des Config Strings

        $tmpFilename = CreateConfigFile($sConfig, $IPS_SELF);         // und ab damit ins tmp-Files
        if ($IPS_SENDER != "WebInterface")
        {
            WriteContentWithFilename ($CfgDaten, $tmpFilename);       // und jetzt noch die ContentTextbox
        }
    }
?>

Noch mal zur wiederholung:
Ich hab mir das alles aus dem Internet und hier aus dem Forum zusammengestückelt und habe nicht wirklich Ahnung vom scripten.
Bin für jede Korrektur, Vereinfachung und Belehrung von denen dies wirklich können offen.
Aber vielleicht hilfts ja dem einen oder der anderen trotzem.

Die Werte im Screenshot sind fiktiv.

Zwischenablage-1.png