Announcement

Collapse
No announcement yet.

gd-lib Diagramm - Problem mit Daten aus DB

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • gd-lib Diagramm - Problem mit Daten aus DB

    Hallo Leute!

    Ich brauch mal euren Rat.

    Es geht darum, dass ich mittel gd-lib Liniendiagramme zeichnen möchte, was auch funktioniert, solang ich die Daten nicht aus der DB hole.
    Sobald ich jedoch eine SQL Abfrage der Daten mache wird mir nichts mehr angezeigt. An der SQL Anweisung kann es nicht liegen, das hab ich getestet, ich bekomm die richtigen Ergebnisse.

    Fazit einzeln funktioniert alles, nur zusammen nicht.


    Hier mal mein php code der funktioniert ( die Datei wird von einer anderen aus aufgerufen mittels
    PHP Code:
     echo "<img src=\"diagramm.php\" alt=\"Fehler beim anzeigen\" />"
    )
    PHP Code:

    $daten
    [0]='27.9';
    $daten[1]='27.89';
    $daten[2]='27.86';
    $daten[3]='27.79';
    $daten[4]='27.83';
    $daten[5]='30';
    $daten[6]='27.97';
    $daten[7]='28.08';
    $daten[8]='28.07';
    $daten[9]='28.02';
    $daten[10]='27.92';
    $daten[11]='27.92';
    $daten[12]='27.91';
    $daten[13]='27.99';
    $daten[14]='28.04';
    $daten[15]='28.1';
    $daten[16]='28.07';
    $daten[17]='28.01';
    $daten[18]='27.96';
    $daten[19]='27.99';
      
    $daten_x[0]='01.06.2011 00:00:00';
    $daten_x[1]='01.06.2011 00:05:00';
    $daten_x[2]='01.06.2011 00:10:00';
    $daten_x[3]='01.06.2011 00:15:00';
    $daten_x[4]='01.06.2011 00:20:00';
    $daten_x[5]='01.06.2011 00:25:00';
    $daten_x[6]='01.06.2011 00:30:00';
    $daten_x[7]='01.06.2011 00:35:00';
    $daten_x[8]='01.06.2011 00:40:00';
    $daten_x[9]='01.06.2011 00:45:00';
    $daten_x[10]='01.06.2011 00:50:00';
    $daten_x[11]='01.06.2011 00:55:00';
    $daten_x[12]='01.06.2011 01:00:00';
    $daten_x[13]='01.06.2011 01:05:00';
    $daten_x[14]='01.06.2011 01:10:00';
    $daten_x[15]='01.06.2011 01:15:00';
    $daten_x[16]='01.06.2011 01:20:00';
    $daten_x[17]='01.06.2011 01:25:00';
    $daten_x[18]='01.06.2011 01:30:00';
    $daten_x[19]='01.06.2011 01:35:00'

      
      

      
    $realHeight '740';
      
    $realWidth '923';
      
      
    $imgHeight '590';
      
    $imgWidth '773';
      
      
    // Position von $diagramm in $background
      
    $x_background '70';
      
    $y_background '50';
      
      
    $schrift 3;
      
      
    $background imagecreate($realWidth$realHeight);
      
    $diagramm imagecreate($imgWidth$imgHeight);

      
      
    imagecolorallocate($diagramm255255255); // Hintergrundfarbe fuer Diagramm
      
    imagecolorallocate($background255255255); // Hintergrundfarbe fuer Diagramm
      
      // Farben fuer Background       !!! ACHTUNG REIHENFOLGE !!!
      
    $farbeUmrandung imagecolorallocate($background000);     // Farbe Umrandung

      // Farben fuer Diagramm    
      
    $farbeText imagecolorallocate($diagramm00); 
      
    $farbeRaster imagecolorallocate($diagramm229229229); // Farbe des Rasters
      
    $farbeLinie imagecolorallocate($diagramm2626223);    // Farbe der Diagrammlinie und Text
      
    $farbeAchse imagecolorallocate($diagramm00);       // Farbe Achsenbeschriftung
      
      // Umrandung Hintergrund: imageline($Bildname, $x1, $y1, $x2, $y2, $Textfarbe)
      
    imageline($background00$realWidth 0$farbeUmrandung); //oben
      
    imageline($background$realWidth-10$realWidth-1$realHeight-1$farbeUmrandung); //rechts
      
    imageline($background0$realHeight-1$realWidth$realHeight-1$farbeUmrandung); //unten
      
    imageline($background000$realHeight$farbeUmrandung); //links
      

      // Zeichnen des Rasters
      
    $pxRaster '20'//Abstand Rasterlinien
      
    $pxWidth round($imgHeight $pxRaster0); // Anzahl der Rasterlinien

      
    for( $i=0$i $pxWidth$i++ )  
       {
        
    //Erklärung: imageline($bild, x1, y1, x2, y2, $farbe);
        
    imageline($diagramm0, ($imgHeight-($pxRaster*$i)-1), ($imgWidth-10), ($imgHeight-($pxRaster*$i)-1), $farbeRaster); //horizontal
        //imageline($diagramm, $i*$pxRaster, 0, $i*$pxRaster, $imgHeight, $farbeRaster); //vertikal 
       
    }
      
      
    // Linien fuer x- und y-Achse
      
    imageline($diagramm0$imgHeight-1$imgWidth$imgHeight-1$farbeAchse); //unten
      
    imageline($diagramm000$imgHeight$farbeAchse); //links


      // Anfangswert um den maximalen Wert aus dem Datensatz berechnen zu koennen
      
    $maxHeight $daten[0];
      
      
    // sucht nach dem hoechsten Wert im Datensatz
      
    for( $i=1$i count($daten); $i++ )
       {
        if( 
    $maxHeight $daten[$i] )
         {
            
    $maxHeight $daten[$i];
         }
       }

       
      
    // der hochste Wert bestimmt die Einteilung der y-Achse mit
      
    $dynWidth round(($imgWidth-45) / (count($daten)-1), 0);
      @
    $dynHeight = ($imgHeight-1) / ($maxHeight+0.5);

      
    // Zeichnet die Daten ein
      
    for ($i=0$i count($daten); $i++)
       {
          
    // zur Berechnung der x-Werte notwendig
          
    $aktNewSize = @round($dynHeight $daten[$i]);
          
    $aktNewSize2 = @round($dynHeight $daten[$i+1]);
      
          if(
    $i+count($daten))
           {
              
    // Erklärung: imageline($bild, x1, y1, x2, y2, $farbe);
              
    imageline($diagramm, ($i*$dynWidth), ($imgHeight-$aktNewSize),(($i+1)*$dynWidth), ($imgHeight-$aktNewSize2), $farbeLinie);
              
              
    // Beschriftung im Diagramm
              
    if($daten[$i] == 0// sollte der Wert 0 sein wird die Beschriftung etwas verschoben
               
    {
                  
    imagestring($diagramm$schrift, ($i*$dynWidth+5), ($imgHeight-$aktNewSize-13), $daten[$i], $farbeLinie);
               }else{ 
    // normale Ausgabe
                      
    imagestring($diagramm$schrift, ($i*$dynWidth+5), ($imgHeight-$aktNewSize-7), $daten[$i], $farbeLinie);
                    }
           }else{
                  
    // Beschriftung des letzten Punktes im Diagramm
                  
    imagestring($diagramm$schrift, ($i*$dynWidth+5), ($imgHeight-$aktNewSize-7), $daten[$i], $farbeLinie);
                }
           
           
    // Beschriftung der x-Achse im Diagramm ( hier Uhrzeit)
           
    $uhrzeit substr($daten_x[$i],11,8);  // Datum und Uhrzeit stehen in einem Feld (-> Zeit heraus nehmen)
           
    imagestringup($background$schrift, (($i*$dynWidth-7)+$x_background), ($imgHeight+65+$y_background), $uhrzeit$farbeText); // Text wird gegen den Uhrzeigersinn gedreht
       
    }  

       
    // Diagrammueberschrift
       
    $zeitraum "Temperaturdaten vom ".substr($daten_x[0],0,10);

       
    // fuer die Berechnung der px-Breite des Textes
       
    $font_width imagefontwidth($schrift);
       
    $text_width $font_width strlen($zeitraum);

       
    // Ausgabe der Diagrammueberschrift
       
    imagestring($background$schrift, (($realWidth/2)-($text_width/2)), 20$zeitraum$farbeText);
       
    // Ausgabe der y-Achsen Bezeichnung
       
    imagestring($background$schrift5050"°C"$farbeText);
       
       
    // Ausgabe der x-Achsen Bezeichnung
       
    imagestring($background$schrift, (count($daten)*$dynWidth+$x_background), ($imgHeight+$y_background), "Uhrzeit"$farbeText);
       
       
    // Kopiert das Bild $diagramm in das Bild $background
       
    imagecopy($background$diagramm$x_background$y_background00imagesx($diagramm), imagesy($diagramm));

         
    header("Content-type: image/png");
       
    imagepng($background);
       
    imagedestroy($background); 
    ersetze ich nun die beiden Arrays ($daten, $daten_x) durch eine SQL Abfrage
    (function.php sorgt für die Abfrage in der Datenbank)

    PHP Code:
    include_once("function.php");
    $datum "01-JUN-11";
         
    $where_name '';
       
    $sql "SELECT Temperatur_1
               FROM TEMPERATUR_FEUCHTE
               WHERE messdatum LIKE '
    $datum%'
               ORDER BY messdatum"

       
    $order='';
               
       
    $daten column_value($sql$where_name$order);
      
      
         
    $where_name1 '';
       
    $sql1 "SELECT to_char (tf.messdatum, 'dd.mm.yyyy hh24:mi:ss')
               FROM TEMPERATUR_FEUCHTE tf
               WHERE tf.messdatum LIKE '
    $datum%'
               ORDER BY tf.messdatum"

       
    $order1='';
               
       
    $daten_x column_value($sql1$where_name1$order1); 
    erhalte ich nur noch ein rotes X

    Was mach ich falsch??
    P.S.: Es ist eine Oracle Datenbank

    Vielen Dank für eure Hilfe

    Gruß Tricia

  • #2
    Hallo,
    Originally posted by Tricia View Post
    ...Was mach ich falsch??
    Was macht denn die Funktion column_value? Das ist keine Standardfunktion von PHP und damit kann auch keiner hier sagen was da falsch läuft. Offensichtlich liefert diese Funktion kein Ergebnis in der erwarteten Form.

    Hast du dir den Inhalt von $daten bzw. $daten_x mal ausgeben lassen?

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      die Funktion sorgt dafür, dass die SQL Abfrage an die Datenbank gesendet wird. Was auch funktioniert. Ich hab mir die Ergebnisse von $daten und $daten_x angesehen die enthalten die gewünschten Daten, die werden nur nicht angezeigt. Ich hab jetzt wo gelesen, dass es daran liegen könnte das die Ergebnisse in eine Sessionvariable geschrieben werden. Von Sessionvariablen hab ich aber keine Ahnung. Wäre es möglich das meine Ergebnisse in einer Sessionvariablen stehen??


      Hier noch die Funktionen column_value und db_query zum auslesen.
      An den Funktionen kann es nicht liegen die verwend ich auch an anderer Stelle und da klappts.

      PHP Code:
      function column_value($select$where$order)
        {
          
      $column_value db_query($select,$where$order);
          
      $value_array = array(); // Funktionsaufruf fuer DB_Abfrage

          
      $i 0
          while (
      $value oci_fetch_array($column_valueOCI_ASSOC+OCI_RETURN_NULLS)) // Alle Spalteninhalte in ein Array schreiben
          
      {   
            foreach(
      $value as $c_value
              { 
                
      $value_array[$i] = $c_value;
                
      $i++;                                                  
              }
          }
          return 
      $value_array;
        }

        
        
      // Funktion fuer die Datenbank_Abfrage
        
      function db_query($select$where$order)
        {
          include(
      "db.connection.php"); //Einbinden der Datenbank_Verbindung

          
      if($where != NULL)
           {
            if (
      $order != NULL)
             {
               
      $column_db oci_parse($conn$select '$where$order");  // DB_Abfrage nach den uebergebenen Werten
             
      }else{
                
      $column_db oci_parse($conn$select '$where' ");
                  }
          }else{
            
      $column_db oci_parse($conn"$select");
               }
              
          if (!
      $column_db
           {
             
      $e oci_error($conn);
             
      trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
           }

          
      $b oci_execute($column_db);   // fuehrt die Logik der Abfrage aus
          
      if (!$b
           {
             
      $e oci_error($column_db);
             
      trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
           }
        
          return 
      $column_db;  //Rueckgabe der Ergebnisse
        
         
      oci_free_statement($column_db);  //Freigabe der Variablen
         
      oci_close($conn); 
        } 
      Gruß Verena

      Comment


      • #4
        Ich hab jetzt wo gelesen, dass es daran liegen könnte das die Ergebnisse in eine Sessionvariable geschrieben werden. Von Sessionvariablen hab ich aber keine Ahnung. Wäre es möglich das meine Ergebnisse in einer Sessionvariablen stehen??
        Nein........
        Christian

        Comment


        • #5
          Hallo Verena,

          ist natürlich schwer zu sagen woran es liegen könnte. Wenn du ein "rotes X" erhältst, deutet das darauf hin dass kein Bild erzeugt wird, weil z.B. ein Fehler auftritt. Du solltest also zu Testzwecken mal den Content-Type-Header wieder auf text/html ändern und das Script direkt aufrufen, um zu sehen ob evtl. Fehlermeldungen ausgegeben werden. Ansonsten hilft hier wohl nur debuggen, um die Stelle zu finden an der die Daten "verloren" gehen.

          Auch könnten einige deiner Berechnungen schief gehen, bzw. dafür sorgen, dass nichts ausgegeben wird.

          PHP Code:
          $dynWidth round(($imgWidth-45) / (count($daten)-1), 0); 
          Das wird z.B. 0, wenn in $daten sehr viele Einträge enthalten sind. Und es gibt eine Division durch Null, wenn $daten nur einen Datensatz enthält!

          Den grössten Wert eines Arrays liefert übrigens die PHP-Funktion max() sehr viel effizienter als deine Schleife.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment

          Working...
          X