constantin: Suche Hilfe bei PHP und MySQL Programmierung

Hi,

also ich tauche und habe ein Online-Logbuch, was ich in eine Mysql-datenbank importiere. Jetzt möchte ich den letzten Tauchgang (auszugsweise) auf dem Blog darstellen (und alle anderen in einer Art Archiv, wobei das erstmal zweitrangig wäre). Die meisten Daten kann man direkt aus der Datenbank auslesen, das dürfte ein Kinderspiel für jemanden mit PHP Kenntnissen werden. Das kleine Problem ist, daß ich ein Tauchprofil darstellen möchte. Also einen Graphen, der die Tiefe wiedergibt. Dazu habe ich ein Script zur Erstellung von Graphen gefunden. Momentan wird der Tauchgang jedoch als einzelner String gespeichert. Also immer die Tiefe in Dezimetern (also 190 für 19m) und dann kommen 10 Nullen, dann die nächste Tiefe usw. Die Tiefe wird alle 20 (oder 30, das müsste ich noch raus finden) Sekunden gemessen. Also müsste man den String spiegeln, die 10 Nullen jeweils raus filtern und durch irgendetwas ersetzen, was das Graphen-script mag) und dann die Zahlen wieder invertieren. Dann würde das andere Script diese Zahlenreihe in einen Graphen verwandeln.
Das klingt jetzt im ersten Moment recht aufwändig, aber ist (natürlich ohne php-Kenntnisse) strukturell gesehen recht simpel. Man muß nur php und mysql können :-). Das kann ich leider garnicht (weshalb ich mir eigentlich einen fertigen Blog zugelegt habe).
Gerne erkläre ich das auch telefonisch und mit Beispiel oder per Mail oder Messenger.
Ich denke, für jemanden der weiß was er tut (wie ihr) wäre das eine recht simple Sache, da das Graphen-Script, der Blog und die DB schon existieren.
Ich würde mich wirklich sehr über Eure Hilfe freuen. Alleine bekomme ich das nicht gebacken. Danke!

VG
Constantin

  1. Hallo Constantin,

    [...] das dürfte ein Kinderspiel für jemanden mit PHP Kenntnissen werden.
    Das kleine Problem ist, [...]
    [...] aber ist (natürlich ohne php-Kenntnisse) strukturell gesehen recht simpel. [...]
    Ich denke, für jemanden der weiß was er tut (wie ihr) wäre das eine recht simple Sache, [...]

    ich bin erstaunt, was Du ohne Kenntnisse als "einfach", "simpel" und "Kinderspiel" bezeichnest. Du bist respektlos denen gegenüber, die Zeit und Arbeit investiert haben, um sich die entsprechenden Kenntnisse angeeignet haben. Das ist keine gute Einstellung, um hier Hilfe zu bekommen.

    Gerne erkläre ich das auch telefonisch und mit Beispiel oder per Mail oder Messenger.

    und diese Einstellung, um private kostenlose Nachhilfe zu bitten, passt meiner Meinung nach nicht in ein öffentliches Forum. Wer sowas will, soll die Hilfe angemessen bezahlen!

    Willst Du hingegen hier an dieser Stelle an der Lösung *Deines* Problems mitarbeiten, bist Du bereit Dir Wissen anzueignen und bereits vorhandenes Wissen einzubringen, dann und genau dann kann ich mir vorstellen, dass Du hier hervorragende Hilfe erhalten wirst.

    Verständnislose Grüße

    Vinzenz

    1. Hi Vinzenz,

      ich wollte in keinster Weise respektlos sein. Ich möchte damit eigentlich nur niemanden abschrecken.
      Das ich mein Wissen einbringe ist ja klar, aber ich finde es schade, daß man nicht auf normalem Weg um Hilfe bitten kann ohne gleich mit Scheinen zu winken. Dieser Materialismus enttäuscht mich :-(

      Viele Grüße
      Constantin

      1. Hallo,

        ich wollte in keinster Weise respektlos sein. Ich möchte damit eigentlich nur niemanden abschrecken.

        aber genau das tust du mit solchen Formulierungen.

        Das ich mein Wissen einbringe ist ja klar, aber ich finde es schade, daß man nicht auf normalem Weg um Hilfe bitten kann ohne gleich mit Scheinen zu winken. Dieser Materialismus enttäuscht mich :-(

        Irgendwas hast du gerade *völlig* missverstanden.

        Hier im Forum triffst du auf viele Leute, die sich freiwillig hier tummeln, freiwillig anderen helfen und freiwillig ihre Zeit und ihr Wissen dafür einsetzen. Und das, ohne eine materielle Entlohnung dafür zu erwarten oder gar zu verlangen.
        Das setzt aber voraus, dass der Hilfesuchende nicht einfach fordert, sondern selbst aktiv mitwirkt.

        Wenn er das nicht möchte oder nicht kann, bleibt natürlich immer noch, auf dem normalen Geschäftsweg einen Fachmann zu beauftragen und zu bezahlen. *Dann* darf man sich auch gern hinstellen und sagen: "Machma."

        Da einige von denen, die hier unentgeltlich mitlesen und versuchen zu helfen, andererseits auch ihren Lebensunterhalt mit Tätigkeiten im Bereich der Software- und Webentwicklung verdienen, kommt es gelegentlich vor, dass so jemand Eigenwerbung macht, wenn der Ton für eine freiwillige Hilfe nicht mehr angemessen ist.
        Möglich, dass du den Hinweis von Vinzenz in den falschen Hals gekriegt hast, nur weil der Satz auch das Schlüsselwort "kostenlos" enthielt. Ich verstehe seine Kritik nur so, dass er individuelle (er sagt "privat") Hilfe ablehnt, denn der Anstand gebietet, dass man die Lösung gemeinsam und öffentlich entwickelt, wenn schon die Frage in der Öffentlichkeit gestellt wird.

        Übrigens finde ich auch, dass dein Posting eher wie eine Aufgabenbeschreibung klingt und du "nur" jemanden suchst, der das für dich erledigt - und nicht Hilfestellung, um das selbst tun zu können.

        Nun alle Klarheiten beseitigt?

        So long,
         Martin

        --
        Wieso heißen die Dinger eigentlich Anrufbeantworter? Eigentlich sind es doch nur Anrufanhörer.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Na, also um auch von meiner Seite das klar zu stellen, ich wollte hier niemandem irgendwie auf den Schlips treten. Schließlich kann ich PHP so gut wie nicht und "bewundere" jeden der sich damit auskennt.
          Wahrscheinlich habe ich mich auch sonst etwas unvorteilhaft ausgedrückt. Was ich kann sind Bausteine aus dem Internet suchen und das habe ich auch bereits getan. Ich habe eine Codezeile um Umkehren der Zahlenreihe, eine zum Ersetzen der Nullen in der Zahlenreihe und ein Script für den Graphen. Nur das Zusammenfügen und entsprechend Anpassen kann ich leider nicht :-(
          Und dafür bitte ich um Hilfe.

          Hier auch die Codeschnipsel:

          Umkehren der Zahlenreihe:
          .strrev($zeichenkette);

          Ersetzen der Nullen:
          replace($str;"0000000000";";")

          Und final der Graph (die aufgerufenen php-files existieren ebenfalls):

          <?php // content="text/plain; charset=utf-8"  
          require_once ('jpgraph/jpgraph.php');  
          require_once ('jpgraph/jpgraph_line.php');  
            
          $datay = array(0,25,12,47,27,27,0);  
            
          // Setup the graph  
          $graph = new Graph(350,250);  
          $graph->SetScale("intlin",0,$aYMax=50);  
            
          $theme_class= new UniversalTheme;  
          $graph->SetTheme($theme_class);  
            
          $graph->SetMargin(40,40,50,40);  
            
          $graph->title->Set('Inverted Y-axis');  
          $graph->SetBox(false);  
          $graph->yaxis->HideLine(false);  
          $graph->yaxis->HideTicks(false,false);  
            
          // For background to be gradient, setfill is needed first.  
          $graph->ygrid->SetFill(true,'#FFFFFF@0.5','#FFFFFF@0.5');  
          $graph->SetBackgroundGradient('#FFFFFF', '#00FF7F', GRAD_HOR, BGRAD_PLOT);  
            
          $graph->xaxis->SetTickLabels(array('G','F','E','D','C','B','A'));  
          $graph->xaxis->SetLabelMargin(20);  
          $graph->yaxis->SetLabelMargin(20);  
            
          $graph->SetAxisStyle(AXSTYLE_BOXOUT);  
          $graph->img->SetAngle(180);  
            
          // Create the line  
          $p1 = new LinePlot($datay);  
          $graph->Add($p1);  
            
          $p1->SetFillGradient('#FFFFFF','#F0F8FF');  
          $p1->SetColor('#aadddd');  
            
          // Output line  
          $graph->Stroke();  
            
          ?>
          

          Konnte ich damit etwas versöhnen?

          1. Hallo Constantin,

            Na, also um auch von meiner Seite das klar zu stellen, ich wollte hier niemandem irgendwie auf den Schlips treten. Schließlich kann ich PHP so gut wie nicht und "bewundere" jeden der sich damit auskennt.

            die Lösung bestimmter Probleme ist in den Grundzügen unabhängig von der Programmiersprache.

            Wahrscheinlich habe ich mich auch sonst etwas unvorteilhaft ausgedrückt.

            Das trifft den Nagel auf den Kopf.

            Ich habe eine Codezeile um Umkehren der Zahlenreihe, eine zum Ersetzen der Nullen in der Zahlenreihe und ein Script für den Graphen.

            Du hast eine Vorstellung davon, wie Du die Ziffernzeichenkette, die nach dem Muster

            <Tiefe in dm>0000000000<Tiefe in dm>0000000000<Tiefe in dm> ...

            aufgebaut ist zu einer nutzbaren Form umwandeln willst. Du hast das Problem erkannt, dass eine Tiefe auf eine (oder mehrere Nullen) enden kann und Du daher nicht einfach eine Folge von 10 Nullen in ein Trennzeichen umwandeln kannst, weil die Umwandlung von vorn beginnt. Daher hast Du Dir das Verfahren überlegt:

            • Umkehren der Zeichenfolge
            • Ersetzen von 10 Nullen in Folge in ein Trennzeichen
            • Erneutes Umkehren der Zeichenfolge

            Nun hast Du die Nutzdaten, durch ein Trennzeichen getrennt, in der Zeichenkette.

            Umkehren der Zahlenreihe:
            .strrev($zeichenkette);

            Ersetzen der Nullen:

            replace($str;"0000000000";";")

            Na, so ganz richtig sind diese Funktionen nicht. Aber dazu kommen wir

            [...]

            Wir sehen, dass Deine Plott-Funktione ein [link:http://de3.php.net/manual/de/language.types.array.php@title=Array] haben möchte.

            $datay = array(0,25,12,47,27,27,0);

            [...]

            // Create the line
            $p1 = new LinePlot($datay);

              
            Du benötigst somit eine Funktion, die eine Zeichenfolge in einem bestimmten (oben angegebenen Format) entgegennimmt, die angegebenen Umformungen vornimmt und anschließend am Trennzeichen in ein Array von Zahlen aufteilt.  
              
            http://de3.php.net/manual/de/function.strrev.php hast Du bereits gefunden, vermutlich auch [str_replace()](http://de3.php.net/manual/de/function.str-replace.php). Damit kriegen wir bereits den ersten Teil hin:  
              
            Gehen wir Schritt für Schritt vor, mit entsprechenden Ausgaben, um die Abarbeitung nachvollziehen zu können.  
              
            ~~~php
              
            # für besser lesbare Debugausgaben:  
            echo "<pre>\n"  
            # Im Codebeispiel verwende ich die Nutzdaten 190, 208 und 22  
            $originalData = '1900000000000208000000000022';  
              
            # Temporärer Stand nach dem ersten Umwandeln:  
            $temp = strrev($originalData);  
            echo $temp, "\n";   # gibt 2200000000008020000000000091 aus  
              
            # Darauf wenden wir str_replace() an. Beachte die im Handbuch angegebene  
            # Reihenfolge der Parameter  
            # Als Trennzeichen verwende ich, wie von Dir angegeben das Semikolon  
            $temp1 = str_replace('0000000000', ';', $temp);  
            echo $temp1, "\n";   # gibt 22;802;091 aus  
              
            # Auf das Ergebnis dieser Operation lassen wir erneut strrev() los:  
            $temp2 = strrev($temp1);  
            echo $temp1, "\n";   # gibt 190;208;22 aus  
            
            

            Zum Auftrennen in ein Array kannst Du die Liste der String-Funktionen durchsuchen, ob Du anhand der Beschreibung etwas passendes findest. Du wirst bei explode() fündig.

            # Aufsplitten am Trennzeichen ';' mit explode() in ein Array  
            $temp3 = explode(';', $temp2);  
            # [link:http://de3.php.net/manual/de/function.var-dump.php@title=var_dump()] benutzen, um sich das Ergebnis anzuschauen:  
            var_dump($temp3);  
              
            /*  
            Ausgabe:  
            array(3) {  
              [0]=>  
              string(3) "190"  
              [1]=>  
              string(3) "208"  
              [2]=>  
              string(2) "22"  
            */  
            
            

            Wir haben also noch Zeichenketten vor uns, die Funktion erwartet jedoch Zahlen. Wir könnten uns darauf verlassen, dass PHP die Konvertierung von selbst hinbekommt. Wir können die Konvertierung auch selbst vornehmen. Dazu wenden wir auf jedes Array-Element die gleiche Funktion an, die eine Zeichenkette in einen Integer-Wert umwandelt: intval(). Bei den Array-Funktionen finden wir array_map(), die genau das kann, was wir brauchen:

            # Erzeuge ein Array mit Integer-Werten als Elemente  
            $datay = array_map("intval", $temp3);  
            var_dump($datay);  
              
            /*  
            Ausgabe:  
            array(3) {  
              [0]=>  
              int(190)  
              [1]=>  
              int(208)  
              [2]=>  
              int(22)  
            }  
            */
            

            genau das, was an den Graphen verfüttert werden kann :-)
            Die Zwischenschritte in den temporären Variablen werden natürlich nicht benötigt und in Deinem Fall hier können wir jedesmal den Rückgabewert des ersten Funktionsaufrufs als Parameter dem nächsten Funktionsaufruf übergeben:

            Aus

            # Im Codebeispiel verwende ich die Nutzdaten 190, 208 und 22  
            $originalData = '1900000000000208000000000022';  
              
            $temp = strrev($originalData);  
            $temp1 = str_replace('0000000000', ';', $temp);  
            $temp2 = strrev($temp1);  
            $temp3 = explode(';', $temp2);  
            $datay = array_map("intval", $temp3);  
            
            

            wird somit

            $originalData = '1900000000000208000000000022';  
            $delimiter    = ';'    # wir brauchen den ja zweimal  
              
            /* Zwischenschritte einzeln zum Nachprüfen mit echo bzw var_dump,  
               wenn Du es Dir in Einzelschritten anschauen willst.  
            $temp1 = str_replace('0000000000', $delimiter, strrev($originalData));  
            $temp2 = strrev(str_replace('0000000000', $delimiter, strrev($originalData)));  
            $temp3 = explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData))));  
            */  
              
            $datay = array_map("intval", explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData)))));  
              
            /*  
            Ausgabe:  
            array(3) {  
              [0]=>  
              int(190)  
              [1]=>  
              int(208)  
              [2]=>  
              int(22)  
            }  
            */
            

            Selbstverständlich gibt es noch andere Wege, dieses Ziel zu erreichen. Ich habe hier den Weg gewählt, den Du vorskizziert hast und die Lücken ausgefüllt.

            Die nächste Aufgabe wäre es, zu lernen, wie man einen Datensatz aus einer Tabelle einer Datenbank auslesen kann und im Ergebnis auf den Inhalt einer bestimmten Spalte zugreifen kann. Dazu empfehle ich Dir das Tutorial von Quakenet.

            Freundliche Grüße

            Vinzenz

            1. Hi Vinzenz,

              erstmal danke für die Anleitung und die ausführliche Erklärung. Ich habe versucht das Script so umzusetzen und es zeigt mal grad garnichts an :-(

              Es sieht jetzt so aus:

                
              <?php  
                
              require_once ('jpgraph/jpgraph.php');  
              require_once ('jpgraph/jpgraph_line.php');  
                
              $db = @new mysqli('localhost', 'username', 'mein_passwort', 'datenbankname');  
              if (mysqli_connect_errno()) {  
                  die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');  
              }  
                
              $sql='SELECT max(ID), Profil FROM L_Logbuch';  
                
              $originalData = $db->query($sql);  
              $delimiter    = ';'  
              $temp1 = str_replace('0000000000', $delimiter, strrev($originalData));  
              $temp2 = strrev(str_replace('0000000000', $delimiter, strrev($originalData)));  
              $temp3 = explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData))));  
              $datay = array_map("intval", explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData)))));  
                
              echo $temp1, "\n";  
              echo $temp2, "\n";  
              echo $temp3, "\n";  
              echo $datay, "\n";  
                
              // Setup the graph  
              $graph = new Graph(350,250);  
              $graph->SetScale("intlin",0,$aYMax=50);  
                
              $theme_class= new UniversalTheme;  
              $graph->SetTheme($theme_class);  
                
              $graph->SetMargin(40,40,50,40);  
                
              $graph->title->Set('Inverted Y-axis');  
              $graph->SetBox(false);  
              $graph->yaxis->HideLine(false);  
              $graph->yaxis->HideTicks(false,false);  
                
              // For background to be gradient, setfill is needed first.  
              $graph->ygrid->SetFill(true,'#FFFFFF@0.5','#FFFFFF@0.5');  
              $graph->SetBackgroundGradient('#FFFFFF', '#00FF7F', GRAD_HOR, BGRAD_PLOT);  
                
              //$graph->xaxis->SetTickLabels(array('G','F','E','D','C','B','A'));  
              $graph->xaxis->SetLabelMargin(20);  
              $graph->yaxis->SetLabelMargin(20);  
                
              $graph->SetAxisStyle(AXSTYLE_BOXOUT);  
              $graph->img->SetAngle(180);  
                
              // Create the line  
              $p1 = new LinePlot($datay);  
              $graph->Add($p1);  
                
              $p1->SetFillGradient('#FFFFFF','#F0F8FF');  
              $p1->SetColor('#aadddd');  
                
              // Output line  
              $graph->Stroke();  
                
              ?>  
              
              

              Wo ist der Fehler?

              VG
              Constantin

              1. Hi!

                Wo ist der Fehler?

                Üblicherweise dort, wo Wunsch und Wirklichkeit nicht mehr übereinstimmen. Die genaue Stelle findet man mit der weniger erfreulichen aber notwendigen Arbeit namens Debugging heraus. Lass dir mit var_dump() die Werte der Variablen und auch Ergebnisse von Ausdrücken anzeigen.

                Ich habe versucht das Script so umzusetzen und es zeigt mal grad garnichts an :-(

                Dann stirbt es vielleicht, ohne eine Meldung ausgeben zu können. Soll es eine Grafik produzieren? Dann kann es auch sein, dass der Browser sie nicht anzeigen kann, weil die Grafikdaten mit einem Fehlermeldungstext gespickt sind. Ist das nicht der Fall (und auch wenn es keine Grafik ausgeben soll) kann man ein die('irgendein text'), von oben beginnend schrittweise nach immer weiter nach hinten im Programmablauf setzen und schauen, wenn die Ausgabe unterbleibt, denn dann starb das Script vor dem die().

                Lo!

                1. var_dump() habe ich bereits überall hin geschrieben, aber die Seite bleibt weiß -.-

                  1. Hallo,

                    var_dump() habe ich bereits überall hin geschrieben, aber die Seite bleibt weiß -.-

                    » » » $sql='SELECT max(ID), Profil FROM L_Logbuch';  
                      
                    
                    > > > $originalData = $db->query($sql);  
                    > > > $delimiter    = ';'  
                    > > > $temp1 = str_replace('0000000000', $delimiter, strrev($originalData));  
                    > > > $temp2 = strrev(str_replace('0000000000', $delimiter, strrev($originalData)));  
                    > > > $temp3 = explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData))));  
                    > > > $datay = array_map("intval", explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData)))));  
                      
                    
                    > > > echo $temp1, "\n";  
                    > > > echo $temp2, "\n";  
                    > > > echo $temp3, "\n";  
                    > > > echo $datay, "\n";  
                    
                    

                    das bedeutet, dass diese echo-Anweisungen schon nichts ausgeben. Also würde ein

                    echo "<pre>\n";            # damit es besser zu lesen ist  
                    var_dump($originalData);  
                    echo "</pre>\n";
                    

                    direkt nach Erstbefüllung und vor Weiterverarbeitung dieser Variable helfen.
                    Vergleiche bitte mit entsprechenden Abschnitt im Quakenet-Tutorial.

                    Noch ein Hinweis: Dein SQL-Statement ist ebenfalls fehlerhaft. Es liefert Dir irgendein Profil zurück, nicht das Profil, das zur höchsten ID passt.

                    Möchtest Du das Profil zur höchsten ID, so sortiere nach ID absteigend und limitiere die Ergebnismenge auf einen Datensatz. Besser wäre es, wenn es in der Tabelle eine Datums/Zeitspalte gäbe, die sich auf den Zeitraum des Tauchgangs bezieht. Sortiere in diesem Fall nach dieser Spalte absteigend und limitiere entsprechend.

                    Freundliche Grüße

                    Vinzenz

      2. Hallo,

        Hi Vinzenz,

        ich wollte in keinster Weise respektlos sein. Ich möchte damit eigentlich nur niemanden abschrecken.
        Das ich mein Wissen einbringe ist ja klar, aber ich finde es schade, daß man nicht auf normalem Weg um Hilfe bitten kann ohne gleich mit Scheinen zu winken. Dieser Materialismus enttäuscht mich :-(

        Sei mal lieb zu Vinzenz. Ich habe schon viele (!) sehr wertvolle (!) und sachbezogene Antworten von ihm erhalten, fundiert und auf den Punkt! Um Verhaltenskodexdiskussionen machte er m.E. eigentlich immer einen Bogen und konzentriert sich auf die Sachverhalte ohne dabei (wie einige andere) schnippisch zu werden.

        Gruß

        jobo

        1. Hallo,

          ich wollte in keinster Weise respektlos sein. Ich möchte damit eigentlich nur niemanden abschrecken.
          Das ich mein Wissen einbringe ist ja klar, aber ich finde es schade, daß man nicht auf normalem Weg um Hilfe bitten kann ohne gleich mit Scheinen zu winken. Dieser Materialismus enttäuscht mich :-(

          Sei mal lieb zu Vinzenz. Ich habe schon viele (!) sehr wertvolle (!) und sachbezogene Antworten von ihm erhalten, fundiert und auf den Punkt! Um Verhaltenskodexdiskussionen machte er m.E. eigentlich immer einen Bogen und konzentriert sich auf die Sachverhalte ohne dabei (wie einige andere) schnippisch zu werden.

          z.b.

          Gruß

          jobo