Warum funktioniert das nur ohne Funktion?

Cyperfriend

Der ohne Avatar
Registriert
14 Juli 2013
Beiträge
1.123
Kann mir bitte jemand erklären, warum Code 1 funktioniert und Code 2 nicht? Ich blicks nicht. Die Datenbankverbindung kommt bei beiden Codes zustande, aber das Auslesen der Daten klappt nur bei Code 1. Bei Code 2 bekomme ich folgende Fehlermeldung:
Fatal error: Call to a member function query() on a non-object in ...
Code 1:
[src=php]
$db_host = "**********";
$db_user = "**********";
$db_pass = "**********";
$db_name = "**********";
$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
if($mysqli->connect_error) {
echo "Datenbankverbindung fehlgeschlagen. Fehler: ".mysqli_connect_error();
exit();
}
echo "Datenbankverbindung hergestellt";

$result = $mysqli->query("SELECT kunden_id FROM db_kunden");
while($row = $result->fetch_array()){
echo "Test: ".$row['kunden_id'];
}
[/src]

Code 2.1 (function.inc.php):
[src=php]
function db_connect() {
$db_host = "**********";
$db_user = "**********";
$db_pass = "**********";
$db_name = "**********";
$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
if($mysqli->connect_error) {
echo "Datenbankverbindung fehlgeschlagen. Fehler: ".mysqli_connect_error();
exit();
}
echo "Datenbankverbindung hergestellt";
return $db_connect;
}
[/src]

Code 2.2 (index.php):
[src=php]
$db_connect = db_connect();

$result = $mysqli->query("SELECT kunden_id FROM db_kunden");
while($row = $result->fetch_array()){
echo "Test: ".$row['kunden_id'];
}
[/src]
 
$result = $mysqli->query("SELECT kunden_id FROM db_kunden");
$result = $db_connect->query("SELECT kunden_id FROM db_kunden");

:unknown:

nachm edit "return $db_connect;" -> "return $mysqli;".
 
  • Thread Starter Thread Starter
  • #3
Danke für die sehr schnelle und brauchbare Antwort (Keine lange Erklärung mit hunderten Fachausdrücken was man machen muss, einfach mal den richtigen Code. Sehr schön)

Nun aber zum Verständnis:
1) Warum muss das "return $db_connect;" in "return $mysqli;" umbenannt werden und vor allem: Wo greife ich darauf wieder zurück? Hier fehlen mir die Zusammenhänge
2) Warum muss das "$result = $mysqli->" in "$result = $db_connect-" umbenannt werden? Auch hier fehlt mir der Zusammenhang.

Bitte die Antwort wieder möglichst einfach halten und nicht mit irgendwelchen Fachausdrücken um sich werfen.
 
Ich versuchs mal:
1) Warum muss das "return $db_connect;" in "return $mysqli;" umbenannt werden und vor allem: Wo greife ich darauf wieder zurück? Hier fehlen mir die Zusammenhänge
Du sagst "Gib den Wert der Variablen $db_connect zurück". Die gibt es aber gar nicht (nur deine Funktion heißt so, die kannst du aber nicht zurückgeben). Du willst das Datenbankobjekt zurückgeben, dass du mit new mysqli erstellt hast, und das ist in der Variablen $mysqli gespeichert.
2) Warum muss das "$result = $mysqli->" in "$result = $db_connect-" umbenannt werden? Auch hier fehlt mir der Zusammenhang.
Die Variable $mysqli ist an der Stelle nicht definiert. Die gab es in deiner Funktion, aber was in einer Funktion deklariert wird ist außerhalb nicht automatisch sichtbar. Deshalb musstest du das auch in das return packen. Mit $db_connect = db_connect(); hast du jetzt gesagt: "Nimm das was die Funktion db_connect zurückgibt (also das mysqli Objekt) und speichere es in einer Variablen $db_connect". Folglich heißt dein Datenbankobjekt jetzt $db_connect und du musst darüber auf die Methoden wie query zugreifen.
 
  • Thread Starter Thread Starter
  • #5
Verwende ich eigentlich den "Prozedural"-Stil oder den "Objektorientierten"-Stil?
 
  • Thread Starter Thread Starter
  • #7
Ich denke ich bin dabei den Objektorientierten zu verwenden. Ich war mir halt nicht sicher. Momentan suche ich auch noch die Vorteile dessen, weil ich bislang ja immer nur mysql verwendet habe und daher alles ungewohnt ist. Mit dem abstrakten Denken habe ichs nicht so.
 
Prozedual ist "du schleppst A nach B und verwendest es dort. Dann schleppst du es wieder von B nach C."
OOP ist "du hast es irgendwo liegen" und benutzt es einfach in A und C.
 
  • Thread Starter Thread Starter
  • #9
Wo muss ich nun eigentlich das mysqli->close(); verwenden? Noch in der Funktion selbst oder am Ende jeder Seite?

Das $result->close(); muss ich wohl so anwenden, oder?
[src=php]
$result = $mysqli->query("SELECT kunden_id FROM db_kunden");
while($row = $result->fetch_array()){
echo "Test: ".$row['kunden_id'];
$result->close();
}
[/src]
 
Wieso sollte "$result->close();" in der while-Schleife stehen?
 
  • Thread Starter Thread Starter
  • #11
Ja gut, ich meinte natürlich nach der geschweiften Klammer ;)
Beantwortet aber meine Frage noch nicht ganz.
 
"Das $result->close(); muss ich wohl so anwenden, oder?" Ist beantwortet ;)

Aber mal eben ne andere sache, du musst doch nicht den "query" schließen, du musst die geöffnete verbindung schließen.

[src=php]$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name);
$result = $mysqli->query("SELECT kunden_id FROM db_kunden");
while($row = $result->fetch_array()){
echo "Test: ".$row['kunden_id'];
}
$mysqli->close();[/src]


Und zur anderen Frage, du solltest "close" natürlich innerhalb der Funktion verwenden.
Das sind aber so Fragen, die du selbst beantworten können solltest. Ich würde dir empfehlen ein paar Bücher durchzulesen und Tutorials durchzuarbeiten.
Ich meine, das sind so Basics die musst du einfach können. Im grunde kauen wir dir gerade den Code vor und du tippst den nur ab.
Das hilft dir wenig bis garnicht weiter wenn du garnicht verstehst was überhaupt passiert.
 
Zuletzt bearbeitet:
Zurück
Oben