Hugo Egon Balder: Ausgabe mehrerer MySQL Datansätze anhand der ID

Hallo Forum!

Gegeben sei eine MySQL Datenbank mit einer ganz einfache Tabelle, in der in der ersten Spalte als Primärschlüssel eine ID steht und in der zweiten Spalte ein Vorname.

Wenn ich jetzt _einen_ bestimmten Datensatz anhand der ID ausgeben möchte, dann mache ich das so:

// Die Verbindung zur DB und das Trennen der Vrbindung habe ich ausgelagert:  
include("db_connect.php");  
$result=$connection->query("SELECT id, name FROM namen WHERE id=4");  
if(!$result)  
  {  
    die("Abfragefehler: ( ".$db->error." )");  
  }  
else  
  {  
    echo"<ul>\n";  
    while($row=$result->fetch_assoc())  
      {  
        echo"<li>".htmlspecialchars($row['name'])."</li>\n";  
      }  
    echo"</ul>\n";  
  }  
include("db_disconnect.php");

So weit, so gut. Was mache ich jetzt aber, wenn ich mehrere Datensätze Anhand verschiedener IDs ausgeben möchte? Meine Google Suchen ergaben, dass ich hier offensichtlich mit einem "foreach" arbeiten muss. Stimmt das? Mir käme es als Lösung in den Sinn, die IDs, die ich verwenden möchte, zunächst mal in einem Array zu definieren.

Wenn ich die zu abfragenden IDs in einem Array definiere...

$id_abfragen=array(2,5,6,14,34);

...wie muss ich dann den oben stehenden Code verändern, damit genau diese 5 Datensätze ausgegeben werden? Ich stehe momentan total auf der Leitung und bin dankbar für jede Hilfe!

MfG

Hugo Egon Balder

  1. Hello,

    So weit, so gut.

    erstmal kein Kommentar :-)

    Was mache ich jetzt aber, wenn ich mehrere Datensätze Anhand verschiedener IDs ausgeben möchte?

    dann kannst Du in() benutzen
    http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html
    http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in

    Meine Google Suchen ergaben, dass ich hier offensichtlich mit einem "foreach" arbeiten muss.

    Trenne Datenbeschaffung, -aufbereitung und -visulisierung sauber voneinander.
    Solange der Arbeitsspeicher aussreicht, also die Ergebnismengen klein bleiben, vermeide es, diese drei Punkte miteinander zu vermischen.

    Du wirst vielleicht sogar drei Mal foreach() benötigen, um alle Aufgaben sauber getrennt voneinander erledigen zu können.

    1. für die Überführung der beschafften Daten in ein Array mit den Datensätzen
    2. für die Überführung des Datensatzarrays in ein für die Anzeige aufbereitetes Array
    3. für das Verbinden des Templates mit den Daten aus dem aufbereiteten Array

    Das mag im ersten Moment umständlich und unwirtschaftlich klingen, stellt sich aber später meistens als ideale Vorgehensweise dar, je größer das System wird. Wenn dann "nur mal eben" die HTML-Semantik geändert werden soll, muss man nicht mehr an der Datenbeschaffung herumhantieren. Man kann das HTML (und CSS) sogar vollständig in die Hände von Leuten legen (Front-User), die auf die Daten keinen eigenen Zugriffskanal haben sollen und aufs PHP (oder sonstige API) auch nicht.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://restaurant-zur-kleinen-kapelle.de
    1. Hallo Tom!

      Zunächst mal vielen Dank für Deine ausführliche Antwort!

      So weit, so gut.
      erstmal kein Kommentar :-)

      Ich hoffe, das war nicht sarkastisch gemeint, weil Du etwas gefunden hast, was Dir so nicht gefällt?!

      Was mache ich jetzt aber, wenn ich mehrere Datensätze Anhand verschiedener IDs ausgeben möchte?
      dann kannst Du in() benutzen
      http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html
      http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in

      Super! Vielen Dank! Genau nach sowas habe ich gesucht. Das hätte ich ohne Deinem Hinweis nie entdeckt. Ich habe es gerade ausprobiert und es funktioniert perfekt. Ich habe auch schon das Handbuch gelesen und den wichtigen Hinweis verstanden, dass man bei den einzelnen Argumenten Strings in Anführungszeichen und Zahlen ohne Anführungszeichen nicht mischen darf.

      Mein Problem ist hiermit beseitigt und die Frage beantwortet!

      Trenne Datenbeschaffung, -aufbereitung und -visulisierung sauber voneinander.
      Solange der Arbeitsspeicher aussreicht, also die Ergebnismengen klein bleiben, vermeide es, diese drei Punkte miteinander zu vermischen.
      Du wirst vielleicht sogar drei Mal foreach() benötigen, um alle Aufgaben sauber getrennt voneinander erledigen zu können.

      1. für die Überführung der beschafften Daten in ein Array mit den Datensätzen
      2. für die Überführung des Datensatzarrays in ein für die Anzeige aufbereitetes Array
      3. für das Verbinden des Templates mit den Daten aus dem aufbereiteten Array

      Das klingt wichtig und interessant, ich verstehe nur nicht ganz, wie Du das genau meinst. Also _falls_ Du Zeit und Lust hast ... könntest Du das an Hand eines konkreten Beispiels erläutern?

      Mfg

      Hugo Egon Balder

      Das mag im ersten Moment umständlich und unwirtschaftlich klingen, stellt sich aber später meistens als ideale Vorgehensweise dar, je größer das System wird. Wenn dann "nur mal eben" die HTML-Semantik geändert werden soll, muss man nicht mehr an der Datenbeschaffung herumhantieren. Man kann das HTML (und CSS) sogar vollständig in die Hände von Leuten legen (Front-User), die auf die Daten keinen eigenen Zugriffskanal haben sollen und aufs PHP (oder sonstige API) auch nicht.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      1. Hello,

        Trenne Datenbeschaffung, -aufbereitung und -visulisierung sauber voneinander.
        Solange der Arbeitsspeicher aussreicht, also die Ergebnismengen klein bleiben, vermeide es, diese drei Punkte miteinander zu vermischen.
        Du wirst vielleicht sogar drei Mal foreach() benötigen, um alle Aufgaben sauber getrennt voneinander erledigen zu können.

        1. für die Überführung der beschafften Daten in ein Array mit den Datensätzen
        2. für die Überführung des Datensatzarrays in ein für die Anzeige aufbereitetes Array
        3. für das Verbinden des Templates mit den Daten aus dem aufbereiteten Array

        Das klingt wichtig und interessant, ich verstehe nur nicht ganz, wie Du das genau meinst. Also _falls_ Du Zeit und Lust hast ... könntest Du das an Hand eines konkreten Beispiels erläutern?

        Das lässt sich in fünf Minuten nicht ausführlich genug darlegen. Aber soviel vorab:

        Fehlerkontrolle pro Funktion / Modul nicht vergessen

        Includes ggf. immer als "include_once()" ausführen lassen und/oder prüfen, ob das Include bereits ausgeführt wurde, also z.B. eine Konstante setzen im Include-File.

        Denk mal darüber nach, was passiert, wenn Dir während der von Dir ausgeführten Ausgabeschleife die Datenbankverbindung abschmiert. Kommt dann noch eine valide Webseite dabei heraus mit einer verständlichen Anweisung für den User und einer Fehlermeldung für den Operator?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://restaurant-zur-kleinen-kapelle.de
        1. Moin!

          Includes ggf. immer als "include_once()" ausführen lassen und/oder prüfen, ob das Include bereits ausgeführt wurde, also z.B. eine Konstante setzen im Include-File.

          Wenn man will, dass include-Fehler bemerkt werden, verwendet man require_once() - das bricht die Programmausführung ab, wenn es nicht funktioniert, anstatt dass man es selbst tun muss. Finde ich nämlich überflüssig, sich dafür eine eigene Lösung zu überlegen, die sonst keinem Standard gehorcht.

          Denk mal darüber nach, was passiert, wenn Dir während der von Dir ausgeführten Ausgabeschleife die Datenbankverbindung abschmiert. Kommt dann noch eine valide Webseite dabei heraus mit einer verständlichen Anweisung für den User und einer Fehlermeldung für den Operator?

          Obwohl nicht auszuschließen, wird es in der Realität extrem selten sein, und im Zweifel auch nur ganz wenige Requests betreffen. Wenn das ein Problem darstellt, wird man in Hochverfügbarkeit investiert haben, um das Problem zu verhindern.

          Was passiert, wenn die Connection zwischen Browser und Server während der Seitenübermittlung abschmiert? Wird dann noch eine valide Webseite dabei herauskommen?

          - Sven Rautenberg

          1. Hello,

            Includes ggf. immer als "include_once()" ausführen lassen und/oder prüfen, ob das Include bereits ausgeführt wurde, also z.B. eine Konstante setzen im Include-File.

            Wenn man will, dass include-Fehler bemerkt werden, verwendet man require_once() - das bricht die Programmausführung ab, wenn es nicht funktioniert, anstatt dass man es selbst tun muss. Finde ich nämlich überflüssig, sich dafür eine eigene Lösung zu überlegen, die sonst keinem Standard gehorcht.

            Aber nicht jedes Include ist ein Require :-)

            Denk mal darüber nach, was passiert, wenn Dir während der von Dir ausgeführten Ausgabeschleife die Datenbankverbindung abschmiert. Kommt dann noch eine valide Webseite dabei heraus mit einer verständlichen Anweisung für den User und einer Fehlermeldung für den Operator?

            Obwohl nicht auszuschließen, wird es in der Realität extrem selten sein, und im Zweifel auch nur ganz wenige Requests betreffen. Wenn das ein Problem darstellt, wird man in Hochverfügbarkeit investiert haben, um das Problem zu verhindern.

            ... oder, wenn die Abfrage nicht das gewünschte Ergebnis liefert / liefern kann, z. B. wegen konkurrierender Zugriffe.

            Was passiert, wenn die Connection zwischen Browser und Server während der Seitenübermittlung abschmiert? Wird dann noch eine valide Webseite dabei herauskommen?

            Das ist eher nicht so wichtig, aber danke für den Hinweis. Die Frage muss lauten: "Was passiert mit dem Datenbestand, wenn während der Abarbeitung eines SQL-Statements oder einer Serie die Verbindung zwischen Client (Browser) und Server abbricht?"

            Da sollte man oft schon Vorsorge treffen, dass die (datenverändernden) Statements zuende abgearbeitet werden oder (...).

            (...) Transaktionsverarbeitung ist dann erst der nächste Schwierigkeitsgrad für Technik und Programmierer.

            =====
            Leider sind die Lücken zwischen den Anwendungen nicht lang genug, um längere Traktate zu verfassen.

            Liebe Grüße aus Bad Driburg

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://restaurant-zur-kleinen-kapelle.de