PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   MySQL-Abfrage flexibel gestalten (http://www.selfphp.de/forum/showthread.php?t=25987)

flyer99 11.04.2017 18:28:46

MySQL-Abfrage flexibel gestalten
 
Abend allerseits,

Ich hänge nun seit ca. 2 Tagen an einem Abfrageproblem und wende mich nun an euch ...

Hintergrundinfos:
Ich habe eine Datenbank welche mit Temperaturwerten gefüllt wird. Das darstellen als Diagramm dieser Werte machte ich bis dato mit Voreingestellten Datenreihen, sprich beim Drücken von Button1 kommen die Solarwerte, beim Drücken von Button2 die Kesselwerte usw.
Nun möchte ich das flexibel gestalten. Ich kann über Checkboxen auswählen welche Datenreihe ich sehen möchte. Das klappt auch (ich hole nur die Werte aus der Datenbank die ich angewählt habe) jedoch bei dem Punkt bei dem ich das Array befüllen muss welches für die Chartanzeige ist hänge ich ....

Hier bilde ich mir flexibel die Anweisung für das mysqli_query:
PHP-Code:

$result1="datumzeit";
$i=0;
if(
count($_POST["reihe"]))
   {
   while(
$i<count($_POST["reihe"]))
      {
      
//echo $_POST["reihe"][$i];
      //echo "<br>";
      
$result1=$result1 ', ' $_POST["reihe"][$i];
      
$i++;
      }
   } 

if (isset(
$_POST["alles"]) == "alles"):
   {
   
$result1 "datumzeit, aussentemp, speicherobentemp, speicherobentempsoll, kesseltemp, kesseltempsoll, brennerstatus, kollektortemp, speicheruntentemp, solarpumpestatus, nachladeunterdrueckungstatus, heizkreispumpestatus, speicherladepumpestatus, ansteuerungheizunt";
   }
endif; 


Und dann mein Problem bei der while-Schleife, wie gestalte ich das befüllen flexibel ???
PHP-Code:

require_once 'phplot-6.2.0/phplot.php'

$db mysqli_connect("RaspberryHeizung""pi""senf""vitola") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");

if (isset(
$_POST["typ1"]) == "datum"):
   {
   
$result mysqli_query($db"SELECT $result1 FROM werte WHERE DATE(datumzeit) BETWEEN '".$_POST['datum1']."' AND '".$_POST['datum1']."'");
   }
endif;

if (isset(
$_POST["typ2"]) == "zeitfenster"):
   {
   
$result mysqli_query($db"SELECT $result1 FROM werte WHERE DATE(datumzeit) > DATE_SUB(DATE(NOW()), INTERVAL ".$_POST['tage']." DAY);");
   }
endif;

$anzahlds $result->num_rows;

while(
$row mysqli_fetch_assoc($result)) // Wird für jede Reihe wiederholt (Anzahl Datensätze)
    

    
$data[] = array(''strtotime($row["datumzeit"]), $row["aussentemp"], $row["speicherobentemp"], $row["speicherobentempsoll"], $row["kesseltemp"], $row["kesseltempsoll"], $row["brennerstatus"], $row["kollektortemp"], $row["speicheruntentemp"], $row["solarpumpestatus"], $row["nachladeunterdrueckungstatus"], $row["heizkreispumpestatus"], $row["speicherladepumpestatus"], $row["ansteuerungheizunt"]); 
    } 
    
$result->close();
$db->close(); 

Ich hatte schon versucht mir eine Stringvariable zu bilden welche die Abfrage flexibel zusammenbaut, z.B.
PHP-Code:

$string='\'\',' 'strtotime($row["datumzeit"])';
$data[] = array($string); 

Zusammenbau war richtig, lies ich mir mit echo anzeigen ...

Ich komme einfach nicht weiter, vielleicht kann mir jemand einen Wink mit dem Zaunpfahl verpassen ...

Die Seite (Diagrammanzeige) funktioniert natürlich trotzdem wenn ich die Schleife so lasse, jedoch kommen dann zig Warnungen (logisch) was ich unschön finden.

chorn 12.04.2017 09:04:41

AW: MySQL-Abfrage flexibel gestalten
 
Ich verstehe nicht was du erreichen willst. Da steht was von "Reihe", wenn ich mir das Statement ansehe sieht das aber nach Spalten aus. Und alle unterschiedlichen Typen stehen in der gleichen Tabelle? Ich weiss garnicht was dann noch flexibel sein muss, du bekommst doch die Werte aus der DB geliefert wie du sie abgefragt hast, wie entscheidest du denn bisher wie das array nacher aussieht?

flyer99 13.04.2017 00:45:49

AW: MySQL-Abfrage flexibel gestalten
 
Hallo chorn,

Problem konnte ich heute Mittag lösen .... nichts desto trotz (vielleicht hilft es anderen) hier ein paar Infos:

Zitat:

Da steht was von "Reihe"
Das sind die Checkboxen welche übergeben werden und dann in $result1 geschrieben werden (MySQL-Spalten welche ausgelesen werden sollen).
PHP-Code:

$i=0
if(
count($_POST["reihe"])) 
   { 
   while(
$i<count($_POST["reihe"])) 
      { 
      
$result1=$result1 ', ' $_POST["reihe"][$i]; 
      
$i++; 
      } 
   } 

Wenn der Haken "Alles" ausgewählt wurde werden alle Spaltennamen übergeben
PHP-Code:

if (isset($_POST["alles"]) == "alles"): 
   { 
   
$result1 "datumzeit, aussentemp, speicherobentemp, speicherobentempsoll, kesseltemp, kesseltempsoll, brennerstatus, kollektortemp, speicheruntentemp, solarpumpestatus, nachladeunterdrueckungstatus, heizkreispumpestatus, speicherladepumpestatus, ansteuerungheizunt"
   } 
endif; 


Fürs Verständnis mal ein paar Bilder:

http://up.picr.de/28882564te.jpg

http://up.picr.de/28882565ci.jpg

Oder:

http://up.picr.de/28882598ff.jpg

http://up.picr.de/28882600ig.jpg


Mein Problem lag hier bzgl. der Flexibilität:
PHP-Code:

while($row mysqli_fetch_assoc($result)) // Wird für jede Reihe wiederholt (Anzahl Datensätze) 
    
{  
    
$data[] = array(''strtotime($row["datumzeit"]), $row["aussentemp"], $row["speicherobentemp"], $row["speicherobentempsoll"], $row["kesseltemp"], $row["kesseltempsoll"], $row["brennerstatus"], $row["kollektortemp"], $row["speicheruntentemp"], $row["solarpumpestatus"], $row["nachladeunterdrueckungstatus"], $row["heizkreispumpestatus"], $row["speicherladepumpestatus"], $row["ansteuerungheizunt"]);  
    } 


Dies habe ich nun wie folgt gelöst:
PHP-Code:

$i2=0;    
while(
$row mysqli_fetch_assoc($result)) 
    { 
    
$data[] = array(''strtotime($row["datumzeit"]));
    if (
in_array("aussentemp"$sammlung)):
       {
       
$data[$i2][] = $row["aussentemp"];
       }
    endif;
    if (
in_array("speicherobentemp"$sammlung)):
       {
       
$data[$i2][] = $row["speicherobentemp"];
       }
    endif;
    if (
in_array("speicherobentempsoll"$sammlung)):
       {
       
$data[$i2][] = $row["speicherobentempsoll"];
       }
    endif;
    if (
in_array("kesseltemp"$sammlung)):
       {
       
$data[$i2][] = $row["kesseltemp"];
       }
    endif;
    if (
in_array("kesseltempsoll"$sammlung)):
       {
       
$data[$i2][] = $row["kesseltempsoll"];
       }
    endif;
    if (
in_array("brennerstatus"$sammlung)):
       {
       
$data[$i2][] = $row["brennerstatus"];
       }
    endif;
    
    if (
in_array("kollektortemp"$sammlung)):
       {
       
$data[$i2][] = $row["kollektortemp"];
       }
    endif;
    if (
in_array("speicheruntentemp"$sammlung)):
       {
       
$data[$i2][] = $row["speicheruntentemp"];
       }
    endif;
    if (
in_array("solarpumpestatus"$sammlung)):
       {
       
$data[$i2][] = $row["solarpumpestatus"];
       }
    endif;
    if (
in_array("nachladeunterdrueckungstatus"$sammlung)):
       {
       
$data[$i2][] = $row["nachladeunterdrueckungstatus"];
       }
    endif;
    if (
in_array("heizkreispumpestatus"$sammlung)):
       {
       
$data[$i2][] = $row["heizkreispumpestatus"];
       }
    endif;
    if (
in_array("speicherladepumpestatus"$sammlung)):
       {
       
$data[$i2][] = $row["speicherladepumpestatus"];
       }
    endif;
    if (
in_array("ansteuerungheizunt"$sammlung)):
       {
       
$data[$i2][] = $row["ansteuerungheizunt"];
       }
    endif;
    if (isset(
$_POST["alles"]) == "alles"):
          {
          
$data[$i2][] = $row["aussentemp"];
       
$data[$i2][] = $row["speicherobentemp"];
       
$data[$i2][] = $row["speicherobentempsoll"];
       
$data[$i2][] = $row["kesseltemp"];
       
$data[$i2][] = $row["kesseltempsoll"];
       
$data[$i2][] = $row["brennerstatus"];
       
$data[$i2][] = $row["kollektortemp"];
       
$data[$i2][] = $row["speicheruntentemp"];
       
$data[$i2][] = $row["solarpumpestatus"];
       
$data[$i2][] = $row["nachladeunterdrueckungstatus"];
       
$data[$i2][] = $row["heizkreispumpestatus"];
       
$data[$i2][] = $row["speicherladepumpestatus"];
       
$data[$i2][] = $row["ansteuerungheizunt"]; 
          }
    endif;
    
$i2++;
    } 


Vielleicht nicht "schön", aber funktionell und ich habe es hinbekommen ...
Wenn jemand ne kürzere Version hat lasse ich mich gerne "belehren" ... :-)

chorn 13.04.2017 08:25:22

AW: MySQL-Abfrage flexibel gestalten
 
Ergibt für mich immernoch keinen Sinn. Wenn du das Statement auf bestimmt Spalten (sehe keinen Zusammenhang zu Reihen) reduzierst, bekommst du auch nur die geliefert, also ist das mapping doch überflüssig.

flyer99 13.04.2017 23:07:17

AW: MySQL-Abfrage flexibel gestalten
 
Abend chorn,

Die Checkboxen mit welchen ich auswähle welche "Temperaturen, Statuszustände" angezeigt werden sollen haben als name -> reihe (vielleicht etwas unglücklich, es ist ja eigentlich eine Spalte in der Datenbank ...)

HTML-Code:

<input style="height: 20px; width: 20px; vertical-align: middle;" type="checkbox" name="reihe[]" value="aussentemp">Aussentemperatur
value ist der Name welcher auch so in der Datenbank steht.

Das Auslesen der nur ausgewählten Daten aus der Datenbank war auch nicht das Problem, sondern nachher das

PHP-Code:

while($row mysqli_fetch_assoc($result)) 

flexibel auszuwerten und das Daten-Array für phplot zu schreiben.

Was ich noch übersehen hatte war die falsche Zuordnung der Legendennamen (nur bei Auswahl alles !), es muss folgendes gelöscht werden:

PHP-Code:

if (isset($_POST["alles"]) == "alles"): 
          { 
          
$data[$i2][] = $row["aussentemp"]; 
       
$data[$i2][] = $row["speicherobentemp"]; 
       
$data[$i2][] = $row["speicherobentempsoll"]; 
       
$data[$i2][] = $row["kesseltemp"]; 
       
$data[$i2][] = $row["kesseltempsoll"]; 
       
$data[$i2][] = $row["brennerstatus"]; 
       
$data[$i2][] = $row["kollektortemp"]; 
       
$data[$i2][] = $row["speicheruntentemp"]; 
       
$data[$i2][] = $row["solarpumpestatus"]; 
       
$data[$i2][] = $row["nachladeunterdrueckungstatus"]; 
       
$data[$i2][] = $row["heizkreispumpestatus"]; 
       
$data[$i2][] = $row["speicherladepumpestatus"]; 
       
$data[$i2][] = $row["ansteuerungheizunt"];  
          } 
    endif; 

Ich hoffe ich konnte es einigermaßen verständlich erklären.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:27:43 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.