PHP SQL Query in Funktionen

KnowSlayes

Cadet 4th Year
Registriert
März 2016
Beiträge
86
Hallo zusammen,

ich glaube ich habe irgendwo ein großen Dankfehler oder rufe etwas an der falschen Stelle auf.
Was ich will:
Klasse db extends mysqli
dann soll die db verbindung hergestellt werden
und nun möchte ich die db klasse auch in einer Funktion aufrufen.

PHP:
	require ("core/config.php");
	
	class db extends mysqli {
		public function __construct ($db_host, $db_user, $db_pass, $db_name) {
			parent::__construct ($db_host, $db_user, $db_pass, $db_name);
		}
		/* Später weitere Funktionen wie create_table */
	}
	
	$db = new db($db_host, $db_user, $db_pass, $db_name);
	$db -> query('SELECT * FROM core_user'); // Klappt ist auch klar.
	
	function sid_exists($f_sid){
		$query = sprintf(
			"SELECT sid FROM core_session WEHRE sid = '%s'",
			$db->real_escape_string($f_sid)
		);
		$result = $db->query($query); //kann nicht klappen, weil ja nicht bekannt.
		if ($row = $result->fetch_array(MYSQLI_ASSOC)){
			return true;
		} else {
			return false;
		}
	}

Übergebe ich an der Funktion noch die $db gehts natürlich auch.

Die Frage ist eher. Wie kann man es am besten anstellen das die Datenbank nur einmal geöffnet wird. Aus allen Klassen und Fuktionen aufgrufen werden kann und am ende geschlossen wird.

Geht das überhaupt??? Ich finde nichts entsprechenden, seit zwei Tagen. Aber ggf. fehlt mir nur das richtige Suchwort.

Gruß
 
Zuletzt bearbeitet:
SELECT sid FROM core_session WEHRE sid = '%s'"
Das muss schonmal WHERE heißen nicht WEHRE

Wie kann man es am besten anstellen das die Datenbank nur einmal geöffnet wird. Aus allen Klassen und Fuktionen aufgrufen werden kann und am ende geschlossen wird.
Mach Klasse DB zu einem Singleton-Object, dann wird Sie nur einmal instanziert und alle nutzen die gleiche Instanz.
 
Entweder du benutzt in der Funktion am Anfang
Code:
global $db;
dann sollte $db innerhalb der Funktion möglich sein.

Ist aber mehr als naja...

Ich würde die Anbindung als Parameter übergeben.
Code:
function sid_exists(\db $DatabaseLink, $f_sid)

Damit greifst du per $DatabaseLink auf deine $db zu.
mit \db gehst du sicher, dass nur eine Instanz von "class db" genutzt werden kann.

Aussagekräftige Name wäre durchaus von Vorteil.
Also statt "db" dann eben "DatabaseLink".
 
alxtraxxx schrieb:
Das muss schonmal WHERE heißen nicht WEHRE
Mach Klasse DB zu einem Singleton-Object, dann wird Sie nur einmal instanziert und alle nutzen die gleiche Instanz.
Habe ich leider auch gemerkt :mad:

Singleton hat nicht geklappt.
Ergänzung ()

Fuselpower schrieb:
Damit greifst du per $DatabaseLink auf deine $db zu.
mit \db gehst du sicher, dass nur eine Instanz von "class db" genutzt werden kann.

Aussagekräftige Name wäre durchaus von Vorteil.
Also statt "db" dann eben "DatabaseLink".

Heisst damit würde nur eine Instanz laufen, also nur eine Datenbankverbindung hergestellt??
 
Ja, wenn du ganz sicher gehen willst, übergibst nur ne Referenz.
Ist aber grundsätzlich nicht nötig, da du DBLink nicht in der Funktion verändern solltest.

Definition:
Code:
class DatabaseLink extends mysqli
{
     ...
}

function sid_exists(DatabaseLink $DatabaseLink, $f_sid)
{
     ...
     $result = $DatabaseLink->query($query)
     ...
}

Anwendung:
Code:
$DBLink = new DatabaseLink($db_host, $db_user, $db_pass, $db_name);

if ( sid_exists($DBLink , $f_sid) )
{
}
else
{
}
 
Kann ich damit dann auch in einer Funktion auf die db zugreifen? Das wird in der Doku nicht ganz klar.

Aber cooler tip
 
du könntest auch ganz einfach einen register für deinen fall verwenden.. in dem du die db instance einmalig beim bootstrappin speicherst.. udn wenn du sie brauchst halt wieder aus dem register holst.. die saubere lösung wäre ein di-container

kleines beispiel
PHP:
<?php

class Register
{
    private static $instance = null;
    private $items = [];

    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function set($key, $value)
    {
        $this->items[$key] = $value;
        return $this;
    }

    public function get($key)
    {
        return $this->has($key) ? $this->items[$key] : false;
    }

    public function has($key)
    {
        return isset($this->items[$key]);
    }
}

$db = new Db();

Register::getInstance()->set('db', $db);

function test_db()
{
    $db = Register::getInstance()->get('db');
    if (!$db) {
        return;
    }

    $db->execute('sql stuff');
}
 
Zuletzt bearbeitet von einem Moderator:
Warum ist die Erstellung einer eigenen Klasse sinnlos?

Wenn man eine Klasse um eigene Funktionen erweitern möchte, bringt mir ein externes Modul keinen Vorteil.

Beispiel:
Ich will immer eine bestimmte Abfrage mit gewählten Parametern machen.
Vererbe "mysqli" und pack meine Funktion dazu, welche mir das Ergebnis liefert.

Immer schön fremde Module, bloß nicht nachdenken und selbst mal etwas "entwickeln"...
 
Fuselpower schrieb:
Warum ist die Erstellung einer eigenen Klasse sinnlos?

Wenn man eine Klasse um eigene Funktionen erweitern möchte, bringt mir ein externes Modul keinen Vorteil.

Beispiel:
Ich will immer eine bestimmte Abfrage mit gewählten Parametern machen.
Vererbe "mysqli" und pack meine Funktion dazu, welche mir das Ergebnis liefert.

Immer schön fremde Module, bloß nicht nachdenken und selbst mal etwas "entwickeln"...

vll macht man ja wenn man das was in deinem fall macht.. etwas falsch ;)

wenn ich die wahl habe zwischen einem getesteten packet, weclhes ich nur einbinden brauche oder etwas was ich noch selber schreiben muss, habe, dann nehme ich doch das schon fertige packet..
 
In größerem Umfang sicherlich der bessere Weg.
Aber für paar Extras einpflegen, Doku durchlesen.

Nö, mach ich nicht ;)

Ist genauso wie JQuery. Für simple Funktionen schreib ich ein eigenes JS. Da brauch ich mir nicht das Paket an die Backe kleben mit Optionen, die ich dann nie brauche.
 
kleinere sachen.. können schnell größer werden und dann nerven die selbst geschriebene sachen..
und jquery würde ich gar nicht benutzen.. für nichts! aber das ist wieder ne andere sache
 
Zurück
Oben