Ankündigung

Einklappen
Keine Ankündigung bisher.

Externe Funktion in index.php ausführen

Einklappen

Neue Werbung 2019

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

  • Externe Funktion in index.php ausführen

    Hallo zusammen,

    bin neu hier im Forum und gleichzeitig Einsteiger in Sachen PHP.
    Derzeit versuche ich spaßeshalber eine Art Anwesenheitskontrolle für mich und ein paar Kommilitonen zu basteln.

    Hierbei soll beim Aufrufen der Seite der Tag, das aktuelle Datum und die Uhrzeit ausgegeben werden. Datum und Uhrzeit werden mittels time(); und date(); ermittelt. Die ID des Wochentags hole ich mir mit date("w"); und ziehe mir den entsprechenden Tag anhand der ID aus einer Datenbank.

    Derzeit sieht das ganze so aus und funktioniert auch:
    PHP-Code:
    if (mysqli_connect_errno() == 0) {
        
    $sql 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"';
        
    $ergebnis $connection->prepare ($sql);
        
    $ergebnis->execute();
        
    $ergebnis->bind_result($tag);
        while(
    $ergebnis->fetch()){
    #        echo $tag;
        
    }
    }
    else {
        echo 
    'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</strong>';
    }
        echo 
    "Heute ist ".$tag." der ".date("d.m.Y",$zeit)." und es ist ".date("H:i",$zeit)." Uhr".'<br />';
    $connection->close(); 



    Dies alles möchte ich nun allerdings mittels einer externen Funktion (im Beispiel uhr genannt) realisieren.

    Der Code der Funktion sieht folgendermaßen aus:

    PHP-Code:
    <?php
    date_default_timezone_set
    ('UTC+1');

        function 
    uhr(){
            
    $zeittime();
            
    $uhrzeitdate("H:i",$zeit);
            
    $datumdate("d.m.Y"$zeit);
            
    $tag date("w");    
        
            if (
    mysqli_connect_errno() == 0) {
                   
    $sql 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"';
                
    $ergebnis $connection->prepare ($sql);
                
    $ergebnis->execute();
                
    $ergebnis->bind_result($tag);
                while(
    $ergebnis->fetch()){}
            }
            else {
                    echo 
    'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</strong>';
            }        
            echo 
    "Heute ist ".$tag." der ".$datum." und es ist ".$uhrzeit." Uhr".'<br />';
        
    $connection->close();
        }
    ?>
    Wenn ich diese Funktion jetzt aber per include ($_SERVER['DOCUMENT_ROOT'] ...) usw. einfüge und per uhr(); in der index.php aufrufen will, passiert leider nix.

    Die Daten für den Verbindungsaufbau zur Datenbank stehen ebenfalls in einer externen Datei, welche ich mithilfe des o.g. Befehls eingebunden habe.

    Es ist mir wichtig, das alles wirklich als externe Funktion zu haben. Einerseits, weil es dann übersichtlicher ist und andererseits kann ich hier evtl. aus meinem Fehler lernen kann, statt nun irgendeine "drumherrum-Lösung" zu verwenden.

    Habe natürlich schon mehrere Seiten im Netz befragt aber ich scheine irgendetwas zu übersehen.

    Kann jemand auf anhieb meinen Fehler erkennen? Bin mittlerweile etwas ratlos

    Vielen Dank für eure Unterstürtzung.

  • #2
    Das hilft dir weiter:

    Richtig debuggen

    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
    Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

    Kommentar


    • #3
      Erstmal Daumen hoch für den Einsatz von mysqli_*

      Übergib $connection mal als Funktionsparameter an uhr().

      Es ist mir wichtig, das alles wirklich als externe Funktion zu haben. Einerseits, weil es dann übersichtlicher ist und andererseits kann ich hier evtl. aus meinem Fehler lernen kann, statt nun irgendeine "drumherrum-Lösung" zu verwenden.
      Dann empfehle ich gleich mal OOP, oder zumindest den Einsatz von Klassen als kleinen Schritt in die Richtung und ich lass das gleich mal hier http://www.peterkropff.de/site/php/oop.htm
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Zitat von Pacifier Beitrag anzeigen
        PHP-Code:
            $sql 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"';
            
        $ergebnis $connection->prepare ($sql);
            
        $ergebnis->execute(); 
        Zitat von VPh Beitrag anzeigen
        Erstmal Daumen hoch für den Einsatz von mysqli_*
        Ich würde eher sagen Daumen halb hoch, die Idee mysqli zu Verwenden ist gut, die Umsetzung leider noch nicht ganz perfekt. Das $tag hat in einer prepared Query nichts zu suchen. Man setzt hier zuerst nen Platzhalter und füllt dieses danach mit dem Inhalt von Tag.
        [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
        [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

        Kommentar


        • #5
          Vielen Dank für eure Hilfe!

          Ich habe die Funktion untersucht und mir die Fehler ausgeben lassen. Gleichzeitig habe ich $connection als Übergabeparameter angegeben (okay, da hätte ich drauf kommen können ;D)

          Nun ist das Problem, dass $connection als undefinierte Variable angemeckert wird. Habe also probiert, per include meine config.php (in welcher sich die $connection befindet) zusätzlich noch in meine functions.php einzubinden. Die config.php ist nun also per include sowohl in der index.php als auch in der functions.php.

          Trotzdem meckert er noch rum, dass $connection nicht definiert sei.

          Der Code sieht nun so aus:
          PHP-Code:
          <?php
              
          include($_SERVER['DOCUMENT_ROOT'].'/config.php');
              
          error_reporting(-1);
              
          ini_set('display_errors'true);
              
          date_default_timezone_set('Europe/Berlin');
              function 
          uhr($connection){
                  
          $zeittime();
                  
          $uhrzeitdate("H:i",$zeit);
                  
          $datumdate("d.m.Y",$zeit);
                  
          $tag date("w");    
                  
                  echo 
          "Tag: ".$tag;
                  echo 
          "Timestamp: ".$zeit;
                  echo 
          "Datum: ".$datum;
                  echo 
          "Uhrzeit: ".$uhrzeit;
                  if (
          mysqli_connect_errno() == 0) {
                         
          $sql 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"';
                      
          $ergebnis $connection->prepare ($sql);
                      
          $ergebnis->execute();
                      
          $ergebnis->bind_result($tag);
                      
          $ergebnis->fetch();
                  }
                  else {
                          echo 
          'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</strong>';
                  }        
                  echo 
          "Heute ist ".$tag." der ".$datum." und es ist ".$uhrzeit." Uhr".'<br />';
              
          $connection->close();
              }
          ?>
          Die echos sind wie in uha's Leitfaden beschrieben Probeausgaben (funktionieren).

          Ich verstehe nun nicht, warum er $connection nicht nehmen will. In der index.php (s.o.) habe ich sie eingebunden und kann sie problemlos aufrufen.

          Des Weiteren kommt diese Meldung: "Fatal error: Call to a member function prepare() on a non-object in /home/schule/www/php/functions.php on line 18". Wobei ich hierbei davon ausgehe, dass sie daraus resultiert, dass $connection als undefined angesehen wird und somit nicht verwendet werden kann.

          In der index.php rufe ich die Funktion im Ürbigen einfach nur mit "uhr();" auf.

          Noch jemand eine Idee?

          Danke nochmals!

          @ChrisvA: Danke für deinen Hinweis. Auch mysqli ist für mich noch Neuland, werde mir deinen Comment zu Herzen nehmen und mir das nochmal genauer ansehen, sobald ich mein erstes Problem behoben habe.

          EDIT: Ich habe den Funktionsaufruf nun mal mit uhr($connection); probiert. (Ich denke mal das meinte VPh ursprünglich, oder?) und auch in der functions.php habe ich $connection übergeben (function uhr($connection){...})

          Es geht zwar noch immer nicht, aber die Fehlermeldung ist nun eine andere...

          Hier die Meldung, Ratschläge werden gern entgegengenommen:
          Warning: mysqli:repare(): Couldn't fetch mysqli in /home/schule/www/php/functions.php on line 20

          Fatal error: Call to a member function execute() on a non-object in /home/schule/www/php/functions.php on line 21

          Kommentar


          • #6
            schon mal igendwo
            PHP-Code:
            var_dump($connection); 
            gemacht?
            http://php-de.github.io/jumpto/leitfaden/

            Kommentar


            • #7
              Wo rufst du die function uhr auf? Es scheint so als ob du da schon keine $connection hast, also der Parameter den du in die Funktion übergibts schon nicht "vorhanden" ist. Aber das sieht man oben nciht, also den Aufruf von uhr();

              Und bitte die $connetction in der function schliessen wenn du die von aussen übergeben bekommst. Schliessen sollte die "Instanz/Ebene" die auch öffnet, oder gar nicht, denn das macht PHP selbst und ist daher nicht nötig, sofern du nicht mit mehr Verbindungen hantierst, dann kann es passen.
              The string "()()" is not palindrom but the String "())(" is.

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

              Kommentar


              • #8
                Hallo hausl,

                der Aufruf der Funktion ist hier abgebildet:
                PHP-Code:
                <?php
                    error_reporting
                (-1);
                    
                ini_set('display_errors'true);
                    include(
                $_SERVER['DOCUMENT_ROOT'].'/php/config.php');
                    include(
                $_SERVER['DOCUMENT_ROOT'].'/php/functions.php');

                #if (mysqli_connect_errno() == 0) {
                #    $sql = 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"';
                #    $ergebnis = $connection->prepare ($sql);
                #    $ergebnis->execute();
                #    $ergebnis->bind_result($tag);
                #    $ergebnis->fetch();
                #        echo $tag;
                    
                #}
                #else {
                #    echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</strong>';
                #}
                #    echo "Heute ist ".$tag." der ".date("d.m.Y",$zeit)." und es ist ".date("H:i",$zeit)." Uhr".'<br />';
                #$connection->close();        
                uhr($connection);
                ?>
                Der auskommentierte Bereich ist zu Testzwecken drin, da dieser Block funktioniert.

                Die $connection kommt ursprünglich aus der eingebundenen config.php und sieht so aus:
                PHP-Code:
                $connection = new mysqli($hostname$username$password$database); 
                Die Anmerkung mit dem schliessen verstehe ich nicht ganz. Hier nochmal die Funktion:
                PHP-Code:
                    function uhr($connection){
                        
                $zeittime();
                        
                $uhrzeitdate("H:i",$zeit);
                        
                $datumdate("d.m.Y",$zeit);
                        
                $tag date("w");    
                        
                var_dump($connection);
                        echo 
                "Tag: ".$tag;
                        echo 
                "Timestamp: ".$zeit;
                        echo 
                "Datum: ".$datum;
                        echo 
                "Uhrzeit: ".$uhrzeit;
                        if (
                mysqli_connect_errno() == 0) {
                               
                $sql 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"';
                            
                $ergebnis $connection->prepare ($sql);
                            
                $ergebnis->execute();
                            
                $ergebnis->bind_result($tag);
                            
                $ergebnis->fetch();
                        }
                        else {
                                echo 
                'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <strong>' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</strong>';
                        }        
                        echo 
                "Heute ist ".$tag." der ".$datum." und es ist ".$uhrzeit." Uhr".'<br />';
                    [
                B]$connection->close();[/B]
                    } 
                Mit der fettgedruckten Zeile wird die $connection doch geschlossen, oder nicht?

                @moma: habe mal einige var_dump() eingebaut. Ergebnis:
                object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.5.37" ["client_version"]=> int(50537) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(16) "5.5.38-0+wheezy1" ["server_version"]=> int(5053 ["stat"]=> string(141) "Uptime: 475773 Threads: 1 Questions: 566424 Slow queries: 1 Opens: 1587 Flush tables: 1 Open tables: 171 Queries per second avg: 1.190" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(17842) ["warning_count"]=> int(0) }
                Bin ehrlichgesagt aber noch nicht dahintergestiegen, was diese Meldung nun genau aussagt, lese diesbezüglich aber nebenbei etwas.

                Ohje, scheint doch etwas komplizierter zu sein der Spaß. Ich hoffe ich geh hier keinem auf die Ketten

                Kommentar


                • #9
                  Die Anmerkung mit dem schliessen verstehe ich nicht ganz
                  ...
                  Mit der fettgedruckten Zeile wird die $connection doch geschlossen, oder nicht?
                  Die $connection kommt ursprünglich aus der eingebundenen config.php und sieht so aus:
                  Ja, genau das, schliesse die nicht in irgendeiner Funktion, wenn du die ganz wo anders öffnest.

                  PHP-Code:
                   $sql 'SELECT `wochentag` FROM `wochentage` WHERE `wo_id`="'.$tag.'"'
                              
                  $ergebnis $connection->prepare ($sql); 
                  Das ist keine korrekte query für ein prep. Statment. Da muss mind. ein ? rein.

                  Schau mal hier, das kann auch bei dir der Grund sein: http://www.peterkropff.de/site/php/m...feinheiten.htm

                  LG
                  The string "()()" is not palindrom but the String "())(" is.

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

                  Kommentar

                  Lädt...
                  X