PHP function MySQL Problem

dsNDesign

Erfahrenes Mitglied
Hei,
ich habe folgende Funktion:
PHP:
$id = 1;
$usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
while($usr = $usr_erg->fetch_array()) {
	echo $usr["username"];
};
$usr_erg->close();

Sie funktioniert an sich perfekt.
Nun möchte ich sie aber in eine Funktion packen, um später die id mittels Funktionsaufruf variabel zu gestalten.

Meine Funktion:
PHP:
function user_ausgabe() {
	$id = 1;
	$usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
	while($usr = $usr_erg->fetch_array()) {
		echo $usr["username"];
	};
	$usr_erg->close();
}
user_ausgabe();

Dort bekomme ich aber nun folgenden Fehler:
Code:
Fatal error: Call to a member function query() on a non-object in /var/www/web34/html/Temline2012/index.php on line 48

Woran liegt das? Kann man in Funktionen keine MySQL Befehle packen?
 
$mysqli ist innerhalb der Funktion nicht bekannt.

global oder $GLOBALS[] ist die Lösung

PHP:
function user_ausgabe() {
    global $mysqli;
    ....
    $usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
    ...
}
oder 
function user_ausgabe() {
    ....
    $usr_erg = $GLOBALS['mysqli']->query("SELECT username FROM user WHERE id = $id;");
    ...
}
 
Hei,
ich habe folgende Funktion:
PHP:
$id = 1;
$usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
while($usr = $usr_erg->fetch_array()) {
	echo $usr["username"];
};
$usr_erg->close();

Sie funktioniert an sich perfekt.
Nun möchte ich sie aber in eine Funktion packen, um später die id mittels Funktionsaufruf variabel zu gestalten.

Meine Funktion:
PHP:
function user_ausgabe() {
	$id = 1;
	$usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
	while($usr = $usr_erg->fetch_array()) {
		echo $usr["username"];
	};
	$usr_erg->close();
}
user_ausgabe();

Dort bekomme ich aber nun folgenden Fehler:
Code:
Fatal error: Call to a member function query() on a non-object in /var/www/web34/html/Temline2012/index.php on line 48

Woran liegt das? Kann man in Funktionen keine MySQL Befehle packen?


Doch das kann man schon, aber in Funktionen sind nur Variablen gültig die entweder in der Funktion selbst definiert wurden, oder als Parameter mitgegeben.

entweder du verwendest in deiner Funktion:

PHP:
function user_ausgabe() {
    global $mysqli;

    $id = 1;
    $usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
    while($usr = $usr_erg->fetch_array()) {
        echo $usr["username"];
    };
    $usr_erg->close();
}

// oder als Parameter
function user_ausgabe($db) {
  if($db instanceof MySQLi){
    $id = 1;
    $usr_erg = $mysqli->query("SELECT username FROM user WHERE id = $id;");
    while($usr = $usr_erg->fetch_array()) {
        echo $usr["username"];
    };
  }else{
     return "Keine Datenbankverbindung möglich";
  }
    $usr_erg->close();
}
 
ok, danke.

Aber wie sieht es mit der Sicherheit aus?
Ich habe mal gelesen, dass man bei Verbindungen nicht "global" verwenden soll.
Und wie ist es bei Parametern?
 
Globale Variablen sind grundsätzlich eine unschöne Sache. Sobald jede Funktion ohne Probleme darauf zugreifen kann, kann sie auch jede Funktion verhunzen. Sowas is schwer zu debuggen. Parameter sind da schon sinnvoller, da, wenn die Variabe im Parameter verhunzt wird, nur innerhalb der Funktion verhunzt ist. Damit lässt sich ein Fehler auf eine Funktion eingrenzen, was das Debugging erleichtert.

Noch besser sind jedoch die von mir immer wieder angepriesenen Singletons *bekehr* ;-)
 
Mit Singletons meinst du Klassen oder?
Das würde dann so aussehen oder?

PHP:
class Singleton
	static private $mysqli;
	public function user_ausgabe() {
		$id = 1;
		$usr_erg = self::$mysqli->query("SELECT username FROM user WHERE id = $id;");
		while($usr = $usr_erg->fetch_array()) {
			echo $usr["username"];
		};
		$usr_erg->close();
	}
Singleton::user_ausgabe();

Quelle: http://www.phpbar.de/w/Singleton
 
Hmm, naja, so ähnlich. Statt die $mysqli-Instanz global verfügbar zu machen, kannst du die Instanz in ein Singleton einbetten. Ungefähr so:

PHP:
class DB
{
  private static $instance = null;

  public static getInstance()
  {
    if( sellf::$instance == null )
    {
      self::$instance = new MySQLi(...hier die Connection parameter ...);
    }

    return self::$instance;
  }
}

Dann kannst du das von jeder beliebigen Funktion aus aufrufen:

PHP:
function user_ausgabe() {
    $id = 1;
    $usr_erg = DB::getInstance()->query("SELECT username FROM user WHERE id = $id;");
    while($usr = $usr_erg->fetch_array()) {
        echo $usr["username"];
    };
    //unsinnig und performance-lastig: ****** ICH NEHME ALLES ZURÜCK ****** Beim ersten Lesen sah es so aus, als ob die Verbindung geschlossen würde - Sorry
    $usr_erg->close();
}
user_ausgabe();  

// Nur als zweites Beispiel:
function user_loeschen() {
    $id = 1;
    $usr_erg = DB::getInstance()->query("DELETE FROM user WHERE id = $id;");
    if ( mysqli_affected_rows( DB::getInstance() ) == 0 )
       die("Irgendwas ist schief gelaufen: " . mysqli_error( DB::getInstance() ) );
}
 
Zuletzt bearbeitet:
Vorrausgesetzt er hat einen Autoloader oder bindet die Klassen dann immer händisch ein.
 
Also es funktioniert jetzt soweit.

Nur was genau hat es mit dem Autoloader auf sich? (Fürs Verständnis)

Ich habe ja eine extra Datei, in welcher ich eine Verbindung zur Datenbank aufbaue.
(Folgender Inhalt:)
PHP:
$mysqli = new mysqli("host", "name", "pw", "datenbank");
if($mysqli->connect_error) {
	echo "Fehler bei der Verbindung: " . mysqli_connect_error();
	exit();
}

Wenn ich diese nicht include, funktioniert es aber genauso (Wird ja jetzt auch in der Klasse DB gemacht).

EDIT:
Oder ist die Klasse DB quasi mein Autoloader?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück