Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL ausgabe in Array

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL ausgabe in Array

    Hallo PHP´ler,

    auch wenn ich schon einige Scripte mit PHP erstellt habem Stoße ich immer wieder auf Hinternisse die ich nicht zu umschiffen weiß.

    Aktuell stehe ich vor dem Problem, ich möchte eine Config-Datei in der viele Variablen in Arrays gespeichert sind auf MySQL migrieren.

    Ursprünglich sah das Script wiefolgt aus:

    PHP-Code:
    $config=array(
    array(
    "12345""01""Schlafzimmer"),
    array(
    "12345""02""Wohnzimmer"),

    Da ich nicht immer die Config anpassen will, wenn ich etwas ändere, dachte ich, ich ziehe das ganze in eine SQL Datenbank um und habe das Script so geändert:

    PHP-Code:
    $link mysql_connect('127.0.0.1''deviceuser''geheim',true);
    mysql_select_db('remote'$link);
    mysql_set_charset('utf8'$link); 
    $sqlresult mysql_query("Select * from devices;");
    $config=array(
    while (
    $daten mysql_fetch_array($sqlresultMYSQL_BOTH)) {
    array(
    "$daten[Netzwerk]""$daten[Device]""$daten[Bezeichnung]"),
    }

    Leider spuckt mein Server mir weder eine Fehlermeldung aus, noch funktioniert die config-datei mehr...

    Hat jemand einen Tip für mich?

  • #2
    Hallo und willkommen im Forum.

    Fehler: Du startest deine while-Schleife innerhalb der Definition eines Arrays.
    PHP-Code:
    $config = array();
    while(
    $row = ...){
        
    $config[] = $row;
    }
    var_dump($config);exit; 
    Hast du denn error_reporting und Fehleranzeige aktiviert? Falls nicht, in meiner Signatur siehst du wie du das machst.

    Als Empfehlung noch:
    Die mysql_* Erweiterung ist veraltet und wird in der nächsten PHP-Version entfernt.
    Durch einen Wechsel auf mysqli_* oder PDO greifst du auf die modernere API zu und hast die Möglichkeiten Prepared Statements zu benutzen die gegen Injections schützen.
    Ich persönlich bevorzuge PDO, schönes Tutorial: http://www.peterkropff.de/site/php/pdo.htm


    + kleine Verbesserung und gute Angewohnheit zu deiner Abfrage mit SELECT *: http://php-de.github.io/jumpto/code-smells/#select-
    Aus der Datenbanktabelle wird hier stets jedes Feld der Zeile abgefragt. Oft ist das gar nicht nötig, weil nur ein Teil der Felder verarbeitet wird. Zudem sagt das Statement nichts darüber aus, welche Werte es liefert. Kritisch wird es, wenn sich die Tabellenstruktur ändert - Folgefehler (Zugriff auf nicht mehr existente Feldnamen) oder das Auslesen von unnützen Daten (Text, Blob) kann die Folge der *-Konvention sein.
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      Hey,
      erst mal danke für deine hilfe.

      ich habe mein script jetzt so angepasst:

      PHP-Code:
      $config=array();
      while(
      $daten mysql_fetch_array($sqlresultMYSQL_BOTH)) {
      $config[] = "\"$daten[2]\",\"$daten[3]\",\"$daten[1]\""
      }
        
      var_dump($config);

      exit; 
      nun bekomme ich, wenn ich die config.php im browser aufrufe folgende ausgabe:

      Code:
      array(3) { [0]=> string(36) ""11111","03","Wohnzimmer"" [1]=> string(40) ""11111","02","Schlafzimmer"" [2]=> string(28) ""11111","04","Keller"" }
      Da die Variablen in das Array geschrieben werden, sollte ich doch normalerweise keine Ausgabe im Browser bekommen oder?

      Kommentar


      • #4
        Zitat von ik@rus Beitrag anzeigen

        Da die Variablen in das Array geschrieben werden, sollte ich doch normalerweise keine Ausgabe im Browser bekommen oder?
        Naja...
        PHP-Code:
        var_dump($config); 
        Doch..

        PHP-Code:
        $config[] = "\"$daten[2]\",\"$daten[3]\",\"$daten[1]\""
        Wieso speicherst du das denn jetzt als String in deinem config Array?
        Ursprünglich sollte das doch aus mehreren Arrays bestehen und mysql_fetch_array() gibt schon ein fertiges Array zurück.

        Edit: Wobei ich zugeben muss, ich hab vergessen, ob ein MySql-Array dafür sinnvoll aufgebaut ist. Aber schon allein wegen dem MYSQL_BOTH vermute ich mal, dass es das nicht ist.
        Nun denn, dann eben:
        PHP-Code:
        $config[] = array($daten['Netzwerk'], $daten['Device'], $daten['Bezeichnung']); 
        Das MYSQL_BOTH macht eigentlich keinen Sinn, ich würde hier eher ein assoziatives Array nehmen. Das kann man sich aber auch mit mysql_fetch_assoc(), bzw. mysqli_fetch_assoc() holen.
        Die mysql_* Erweiterung ist veraltet!
        Besser: mysqli_* oder (noch besser) PDO

        Kommentar


        • #5
          Die älteste der drei mysql-Erweiterungen ist veraltet (mysql_*-Funktionen, nicht die MySQL-Datenbank) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
          Choosing an API
          Warum man mysql* generell nicht (mehr) nutzen sollte.
          Wie man von mysql* auf PDO umsteigt
          Wissenswertes zum Thema SQL-Injection

          Die Verwendung von "*" in SQL-Abfragen wird im Allgemeinen als schlechter Stil angesehen. "*" kann entweder alle Felder aus einer Tabelle, oder (wenn mehrere Tabellen mit einbezogen werden) aus allen Tabellen ziehen.

          Zwei Gründe sprechen dagegen: Wenn du dein Tabellenschema anpasst, wird die Abfrage weiterhin funktionieren. Die Abfrage wird in deinem Code aber Variablen (bzw. Array-Keys) erzeugen, die von deinem Programm so nicht erwartet werden. Das kann (je nachdem, wie deine Applikation aufgebaut ist) zu schwer nachvollziehbaren Problemen führen. Würdest du die Spaltennamen direkt in deiner SQL-Abfrage angeben, würde die SQL-Abfrage direkt lautstark fehlschlagen. Dann kannst du möglicherweise einen Alias für umbenannte Tabellenspalten angeben, ohne dass du deinen Applikationscode anpassen musst.

          Außerdem kann man durch eine explizite Angabe die Reihenfolge und die Anzahl der Tabellenspalten begrenzen. Die Reihenfolge kann je nach Applikation eine Rollen spielen und je weniger Felder man einbezieht, desto schneller wird das Ergebnis zum abfragenden Client übertragen.

          Kommentar

          Lädt...
          X