tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
326
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Disasterp1ece Disasterp1ece ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    7
    Guten Tag!

    Ich hab ein Problem. Bin ein Anfänger, bitte nicht gleich steinigen, wenn das alles noch etwas wirsch ist. Ich hab eine Funktion geschrieben, die verschiedene Dateien implementieren soll (siehe Anhang). Dies tut sie auch (angeblich Rückgabewert) nur wird mir dann leider diese Fehlermeldung ausgegeben:

    Fatal error: Call to a member function query() on a non-object in xxx/functions.php on line 15

    line15:
    Code :
    1
    
     $fetch_db = $con->query($select_sql)->fetch_assoc();

    $con ist in mysql_connect.php definiert. Diese Datei wird mit meiner eigenen include-Funktion implementiert und sollte ab da an ja eigentlich verfügbar sein:
    Code :
    1
    2
    
      $con = new mysqli($host, $user, $pass, $db);  // Verbindungsdaten sind in   mysql_user.php
       global $con;

    Ich dachte erst, dass irgendwelche Dateien nicht richtig includet werden, aber meine Funktion gibt dies aus:

    constants.php implementiert.
    1
    mysql_user.php implementiert.
    1
    mysql_connect.php implementiert.
    1
    functions.php implementiert.
    1


    Ich habe sie so aufgerufen:
    Code :
    1
    2
    
        include '../confidential/include.php';
        include_data('constants', 'mysql_user', 'mysql_connect', 'functions');

    Und hier ist mal meine Funktion:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    <?php
     
        function include_data($constants, $mysql_user, $mysql_connect, $functions)
        {
            //  Funktion dient zur individuellen Implementierung von Dateien.
     
            // $constants     = 'constants' oder 'no_constants'
            // $mysql_user    = 'mysql_user' oder 'no_mysql_user'
            // $mysql_connect = 'mysql_connect' oder 'no_mysql_connect'
            // $functions     = 'functions' oder 'no_functions'
     
     
            // Konstanten
     
            if($constants == 'constants')
            {
                $ret1 = include 'constants.php';
                echo "constants.php implementiert."."<br>";
                echo $ret1."<br>";
            }
     
            elseif($constants == 'no_constants')
            {
                // echo "constants.php nicht implementiert."."<br>";
            }
     
            // Mysql-Daten
     
            if($mysql_user == 'mysql_user')
            {
                $ret2 = include 'mysql_user.php';
                echo "mysql_user.php implementiert."."<br>";
                echo $ret2."<br>";
            }
     
            elseif($mysql_user == 'no_mysql_user')
            {
                // echo "mysql_user.php nicht implementiert."."<br>";
            }
     
            // Mysql-Verbindung
     
            if($mysql_connect == 'mysql_connect')
            {
                $ret3 = include 'mysql_connect.php';
                echo "mysql_connect.php implementiert."."<br>";
                echo $ret3."<br>";
            }
     
            elseif($mysql_connect == 'no_mysql_connect')
            {
                // echo "mysql_connect.php nicht implementiert."."<br>";
            }
     
            // Funktionen
     
            if($functions == 'functions')
            {
                $ret4 = include 'functions.php';
                echo "functions.php implementiert."."<br>";
                echo $ret4."<br>";
            }
     
            elseif($functions == 'no_functions')
            {
                // echo "functions.php nicht implementiert."."<br>";
            }
        }
    ?>

    Bevor ich diese Funktion benutzt habe ging alles. Habe die Dateien einfach nacheinander mit include "..." implementiert.
    Nur ich dachte mir, dass so etwas vielleicht von Vorteil sein könnte, wenn später diese Dateien nicht gebraucht werden.
    Wenn die ganze Idee bescheuert ist oder falls ihr eine bessere habt lasst es mich bitte wissen. Wie gesagt ich lerne im Moment und freue mich über jeden Verbesserungsvorschlag
     

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    1.854
    Blog-Einträge
    2
    Dabei hast du vielleicht den Gültigkeitsbereich (Scope) nicht beachtet.

    Stelle dir dein Programm als ein Haus vor, deine Funktion ist ein verschlossener Raum davon.
    In dem Raum sagst du jetzt: include "Stuhl"; und es steht ein Stuhl in dem Raum.
    Das doofe ist nur das man im Haus nicht an den Stuhl dran kommt, weil der Raum zu ist und nur der Raum "weis" das in ihm ein Stuhl steht.

    Führe dazu auch mal folgendes Beispiel aus:
    PHP-Code:
    $text "Hallo";

    function 
    foo()
    {
      
    $text "Tschüss";
    }

    foo();
    echo 
    $text
    Und hier fast das gleiche nochmal nur diesmal gibts eine "Tür zu dem Raum"
    PHP-Code:
    $text "Hallo";

    function 
    foo()
    {
      global 
    $text;  // Tür auf ;D

      
    $text "Tschüss";
    }

    foo();
    echo 
    $text
    Am besten include nicht in einer Funktion verwenden, wenn du außerhalb der Funktion damit arbeiten willst.

    Was zum lesen: http://us2.php.net/manual/de/languag...bles.scope.php
    Geändert von ZodiacXP (11.03.09 um 17:47 Uhr)
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  3. #3
    CraHack CraHack ist offline Mitglied Silber
    Registriert seit
    Sep 2004
    Beiträge
    96
    Ich glaube das global $con; musst du innerhalb der funktion machen in der du darauf zugreifen willst.

    Ich teste das gleich mal.


    Edit: Jo hat sich bestetigt:

    PHP-Code:
    <?PHP
    error_reporting
    (E_ALL);


    $Blubber="test";
    global 
    $Blubber;

    function 
    Ausgeben()
    {
        echo 
    $Blubber;
        global 
    $Blubber;
        echo 
    $Blubber;
    }

    Ausgeben();

    ?>
    das erste echo giebt eine Notice aus das zweite funktioniert.


    Edit2: ohh sehe jetzt erst das Zodiac schneller war
    Geändert von CraHack (11.03.09 um 17:49 Uhr)
     
    emefge CraHack

  4. #4
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    Hi,

    Zitat Zitat von Disasterp1ece Beitrag anzeigen
    Bevor ich diese Funktion benutzt habe ging alles. Habe die Dateien einfach nacheinander mit include "..." implementiert.
    Nur ich dachte mir, dass so etwas vielleicht von Vorteil sein könnte, wenn später diese Dateien nicht gebraucht werden.
    Wenn die ganze Idee bescheuert ist oder falls ihr eine bessere habt lasst es mich bitte wissen. Wie gesagt ich lerne im Moment und freue mich über jeden Verbesserungsvorschlag
    Der Sinn erschließt sich mir überhaupt nicht. Binde die Dateien da und dann ein, wo und wann sie gebraucht werden.

    LG
     
    Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.

  5. #5
    Disasterp1ece Disasterp1ece ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    7
    Hallo,

    als erstmal vielen Dank für eure Aufmerksamkeit


    @kuddeldaddeldu:
    Der Sinn der Funktion soll sein, dass ich nicht am Anfang von jedem Skript mehrere Zeilen Includes habe. Wenn es später noch mehr Include-Dateien werden, wird der Codeblock auch immer größer.
    Wenn ich nur eine include-datei mache in der ich alle anderen Dateien implementiere kann ich nicht steuern, welche ich implementiere und welche nicht.
    Mit dieser Funktion würde das gehen bzw. das tut es nicht

    @zodiac & crahack:
    Das heißt, ich implementiere die Dateien in die Funktion, die Funktion schließt sich nach Ablauf und dann sind die implementierten Daten auch futsch?
     

  6. #6
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    Hi,

    Zitat Zitat von Disasterp1ece Beitrag anzeigen
    Wenn ich nur eine include-datei mache in der ich alle anderen Dateien implementiere kann ich nicht steuern, welche ich implementiere und welche nicht.
    Warum nicht?

    LG
     
    Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.

  7. #7
    Disasterp1ece Disasterp1ece ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    7
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    <?
        // include.php
     
        include 'functions.php';
        include 'mysql.php';
        include 'xy.php';
    ?>

    Code :
    1
    2
    3
    4
    5
    
    <?
        // beispiel.php
     
        include 'include.php';
    ?>

    So implementiere ich immer alle Dateien in include.php, auch wenn ich jetzt xy.php gar nicht implementieren will.
    Ist am Anfang wahrscheinlich ziemlich egal, aber ist es nicht besser Dateien, die man eh nicht braucht, nicht zu includen, damit wenig Traffic etc. entsteht?

    mfg
    Disasterpiece

    edit:
    @zodiac und crahack:
    hab mir das mit dem Geltungsbereich nun mal durchgelesen. Hat mir sehr geholfen vielen Dank nochmal
    Geändert von Disasterp1ece (11.03.09 um 18:27 Uhr)
     

  8. #8
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    Hi,

    Zitat Zitat von Disasterp1ece Beitrag anzeigen
    So implementiere ich immer alle Dateien in include.php, auch wenn ich jetzt xy.php gar nicht implementieren will.
    Ist am Anfang wahrscheinlich ziemlich egal, aber ist es nicht besser Dateien, die man eh nicht braucht, nicht zu includen, damit wenig Traffic etc. entsteht?
    Mit Traffic hat das nichts zu tun.
    Inkludiere in jedem Script genau die Dateien, die Du brauchst. Ob Du in Deinem jeweiligen Hauptscript nun einen längeren Block mit includes hast (da spricht nichts gegen), oder das in eine zugehörige Datei auslagerst, ist egal. Sich wegen sowas der Krücke "globale Variablen" zu bedienen, ist ziemlich überflüssig.

    Und was hindert Dich daran, in Deiner include.php die gleiche Steuerung einzubauen, wie in dieser Funktion?

    LG
     
    Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.

  9. #9
    Disasterp1ece Disasterp1ece ist offline Rookie
    Registriert seit
    Nov 2007
    Beiträge
    7
    Entschuldige bitte, wenn ich auf dem Schlauch stehe, aber ich dachte ich hätte das getan, in dem ich in der include.php diese Funktion definiert habe.
    Wollte dann nur noch diese augelagerte Funktion einbinden und dann im jeweiligen Hauptskript mit unterschiedlichen Parametern aufrufen.

    Ich hab es nun geändert. Es funktioniert zwar nicht, aber bin schlau daraus geworden.
    Danke an alle
     

  10. #10
    kuddeldaddeldu kuddeldaddeldu ist offline Mitglied Diamant
    Registriert seit
    Dec 2007
    Ort
    Bremen
    Beiträge
    3.418
    Zitat Zitat von Disasterp1ece Beitrag anzeigen
    Entschuldige bitte, wenn ich auf dem Schlauch stehe, aber ich dachte ich hätte das getan, in dem ich in der include.php diese Funktion definiert habe.
    Wollte dann nur noch diese augelagerte Funktion einbinden und dann im jeweiligen Hauptskript mit unterschiedlichen Parametern aufrufen.
    Ich meinte dieses Beispiel von Dir.

    LG
     
    Da es nötig zu werden scheint: Ich leiste hier keinen Support über PN. Stellt Rückfragen zu Euren Problemen bitte in Eurem Thread, dann können alle helfen.

  11. #11
    Registriert seit
    Mar 2004
    Beiträge
    1.854
    Blog-Einträge
    2
    So. Vom zocken wieder da ^ ^

    Zitat Zitat von Disasterp1ece Beitrag anzeigen
    Das heißt, ich implementiere die Dateien in die Funktion, die Funktion schließt sich nach Ablauf und dann sind die implementierten Daten auch futsch?
    Das ist gut Umschrieben. Aber haste ja schon selbst herausgefunden

    Zitat Zitat von Disasterp1ece Beitrag anzeigen
    Wollte dann nur noch diese augelagerte Funktion einbinden und dann im jeweiligen Hauptskript mit unterschiedlichen Parametern aufrufen.
    Um deins beizubehalten fallen mir spontan zwei Wege ein. Wenn es Klassen sind die du lädts (dürfte dir ein Begriff sein, wenn nicht -> der andere Weg), dann kannst du am Anfang von deinem Script folgendes schreiben:
    PHP-Code:
    function __autoload($class)
    {
      
    // alles was du vorher noch machen willst...
      
    include($class ".php");  // so dass es den Dateinamen ergibt
      // alles was danach soll...
    }

    $foo = new Object(); // bewirkt das Object.php geladen wird und deine sachen 
    Autoload wird ausgeführt wenn man eine neue Klasse instanziert die bis dahin noch unbekannt ist (letzte Zeile).

    Die zweite Möglichkeit wäre, du schreibst deine include.php um:
    PHP-Code:
    // alles was du machen willst
    include($script); 
    Und dort wo du Sachen einbinden willst:
    PHP-Code:
    $script "foo.php";
    // sonstige deiner variablen
    include("include.php"); 
    Ganz normal iterativ (nicht als Funktion) schreiben.
    Meiner Meinung nach, ist es überflüssig diese einfachen Sachen zu protokollieren. Zumal es die Performance (insbesondere beim letzten Vorschlag) negativ beeinträchtigt.
    Aber du hast ja jetzt alles für dein Vorhaben HF
    Geändert von ZodiacXP (11.03.09 um 19:27 Uhr)
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

Ähnliche Themen

  1. Probleme mit Include
    Von sindyho0374 im Forum PHP
    Antworten: 17
    Letzter Beitrag: 11.11.10, 14:26
  2. Antworten: 2
    Letzter Beitrag: 20.03.10, 13:26
  3. Probleme Schleifen und include()
    Von 28dayslater im Forum PHP
    Antworten: 3
    Letzter Beitrag: 13.08.08, 13:28
  4. probleme mit include
    Von janosch im Forum PHP
    Antworten: 3
    Letzter Beitrag: 02.12.03, 19:37
  5. Probleme mit include
    Von Oli im Forum PHP
    Antworten: 5
    Letzter Beitrag: 09.06.02, 15:59