Probleme mit include

Disasterp1ece

Grünschnabel
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:
 $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:
  $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:
    include '../confidential/include.php';
    include_data('constants', 'mysql_user', 'mysql_connect', 'functions');

Und hier ist mal meine Funktion:
Code:
<?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 :)
 
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:
$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:
$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/language.variables.scope.php
 
Zuletzt bearbeitet:
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:
<?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 ;)
 
Zuletzt bearbeitet:
Hi,

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
 
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?
 
Code:
<?
    // include.php

    include 'functions.php';
    include 'mysql.php';
    include 'xy.php';
?>

Code:
<?
    // 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 :)
 
Zuletzt bearbeitet:
Hi,

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
 
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 :)
 
Zurück