SQL Verständnisfrage SQL in Funktion, Rückgabewert

CheeseCakeMen

Cadet 3rd Year
Registriert
Feb. 2021
Beiträge
42
Hallo zusammen,

Habe eine Verständnisfrage.
Aus einer DB lese ich Daten aus. Kann ich dies ganze einfach in einer Funktion einbauen
welche mir als Rückgabewert Array mit den Daten liefert?

Diese würde ich dann über eine Foreach Schleife auslesen und mit HTML mischen damit es angezeigt wird.

Oder sollte ich die ganze Abfrage gleich an der Stelle machen wo sie später hin soll. Sonst müsste ich ja erst ein Array erstellen, welches mit in der Funktion zurückgeben wird
und anschließend wieder auslesen. Klinkt irgendwie doppelt gemoppelt.

So sieht meine Abfrage aus:
SQL:
$connect = new mysqli($servername, $user, $password, $db);
if($connect->connect_error){
    die("Konnte keine Verbindung zur Datenbank aufbauen". $connect->connect_error);   
  }
 
$sql = $connect->prepare("SELECT country_name FROM `countries` " );
$sql->execute();
$sql->bind_result($res_country);
while ($sql->fetch()) {
 
        // Hier würde ich alles in Array packen?
}
$sql->close();


Oder habe ich das komplett falsche rangehen?

Besten Dank
 
  • Gefällt mir
Reaktionen: PHuV
Und dann gebe ich via return das Array zurück und werte es an der Stelle aus, wo es hin soll?
 
Was für'n return? Also wenn du den Code innerhalb einer Prozedur verwendest, sicherlich ja. Je nach Aufbau deines Codes kann hier die Anwtort ja oder nein sein. ;)

Am besten du gibst dir mal spaßeshalber mit var_dump() das Array aus, dann siehst du ja was darin enthalten ist und kannst dann entscheiden wie du mit den Werten weiter umgehst. Aus der Ferne kann ich dir die Frage zum unbekannten Quellcode nicht genauer beantworten. :)
 
Müsste dann doch eher

Code:
while ($row = $sql->fetch()) {

var_dump($row);


}

heißen?!

EDIT: Achso, nee, vergisses, hast ja noch: $sql->bind_result($res_country);
 
Danke für Eure Ratschläge, hab es jetzt mal auf PDO umgebaut:

Habe folgendes index.php
PHP:
include("database.php");
include("functions.php");
include("header.php");
include("navigation.php");
include("start.php");
include("footer.php");

Meine DB Klasse:
PHP:
class DB {
    public function connect() {
        try {
            $datasource = "mysql:host=localhost;dbname=labcaches";
            return new \PDO($datasource, "root", "");
        } catch (PDOException $exc) {
            echo $exc->getTraceAsString();
            die();
        }
    }
}

Über die Funktionsklasse führe ich verschiedene SQL Statements aus, welche über den Konstruktor reingereicht werden.
PHP:
function showDbResult($sql) {
$db = new DB();
$statement = $db->connect()->prepare($sql);
$statement->execute();
$result = $statement->fetchAll();

return $result;
}

Meine Test in der start.php haben auch soweit funktioniert
PHP:
$test = showDbResult("SELECT country_name FROM `countries`");
var_dump($test);

Habe ich das jetzt soweit richtig verstanden und umgesetzt? Oder wo sollte ich nochmals nachlesen?
 
Und wenn du damit weiter bastelst, dran denken keine parameter vom benutzer ungeprüft in deiner query ausführen (also nicht FROM countries WHERE $userinput oder so). Sonst gibts SQL Injection und 6 setzen ;)
 
Ich würde showDbResult() noch in fetchDbResult() (o.Ä.) umbenennen.
Ansonsten sieht das von der Logiktrennung her schon ganz gut aus. Für den Anfang. ;)

Problematisch ist aber, dass du in showDbResult eine neue Instanz von DB erstellst, die eine Verbindung zur Datenbank aufbaut und dauerhaft hält. Irgendwann hast du dann keine freien Verbindungen mehr, jenachdem wie oft das Script aufgerufen wird. Ich nutze dafür ein sog. Singelton, das beim erstmaligen Erstellen die Verbindung aufbaut und wenn ich die DB nicht mehr brauche wird es geschlossen. Also erst alle Daten aus der DB lesen/schreiben, Verbindung schließen, dann erst die Ausgabe machen.
 
Zurück
Oben