[SOLVED] Wordpress, Array aus Datenbankfeld

    • Offizieller Beitrag

    Ok .. ich versteh schon wieder mal nur Bahnhof.


    Ich hab folgenden Code:

    Code
    $result = $wpdb->get_results( 'SELECT * FROM '.REGIMENTTABLE.' WHERE ArmyId = '.$_GET['truppe'].' ORDER BY RegimentName DESC', ARRAY_A );
    foreach ($result as $line) {
       $attribute = array($line['Attributes']);
       print_r($attribute);
    }

    Das Datenbankfeld 'Attributes' enthält folgenden Text: 'AttackDice => "3", DefenseDice => "3", Strength => "2", ...'


    Ich hab gedacht, ich kann mit array() diesen Inhalt in ein assoziatives Array umwandeln. Aber denkste!
    Wordpress spuckt mir bei print_r($attribute); folgendes aus:


    Array ( [0] => AttackDice => "3", DefenseDice => "3", Strength => "2", ... )


    jetzt frag ich mich: wo kommt das [0] => her, das mir mein ganzes Array kaputt macht?!
    Hat das mit dem foreach zu tun, weil das auch schon ein Array erzeugt? Und wenn ja, wie kann ich mein Problem lösen?

  • get_results in WordPress gibt dir je nach deiner Query mehrere Rows aus, daher der übergeordnete [0] als Index für das erste Ergebnis im Ergebnis-Set/-Array. Gäbe es mehrere assoziative Rows, ginge es weiter mit [1] etc. Da du aber eh nur einen Datensatz erwartest (?), ist vllt. get_row die bessere Wahl.

    • Offizieller Beitrag

    Hmm .. nein, ich erwarte schon mehrere Datensätze .. in diesem Beispiel ist es nur einer, aber eigentlich kommen da mehrere Zeilen in einer Tabelle. Das print_r($attribute); ist nur die vereinfachte Darstellung, weils momentan nicht klappt wie es soll :)


    Btw. hab ichs auch bei mehreren Datensätzen ausprobiert, und interessanterweise bleibt IMMER [0] => am Anfang des arrays! Egal wie viele Datensätze ich hab! Die werden nicht weiter nummeriert ...


    Beispiel, bei 3 Datensätzen:
    Array ( [0] => "AttackDice" => "5", "DefenseDice => "5", "FullDefenseDice => "2", "Strength" => "5", "Toughness" => "5", "Move" => "5", "Wounds" => "3" ) Array ( [0] => "AttackDice" => "5", "DefenseDice => "5", "FullDefenseDice => "2", "Strength" => "5", "Toughness" => "5", "Move" => "5", "Wounds" => "3" ) Array ( [0] => "AttackDice" => "99", "DefenseDice => "3", "FullDefenseDice => "2", "Strength" => "2", "Toughness" => "2", "Move" => "4", "Wounds" => "1" )


    Oh .. und falls sich wer wundert (ich glaub in diesem Forum NIE möglich :D ) - das ist für mein Miniaturenspiel www.littlecarnage.com
    Ich bin entgütlig dabei meine saumässige selbstgebastelte Homepage durch was g'scheites mit Userverwaltung und sozialen Komponenten zu ersetzen :)

  • My bad. Ich dachte, du machst ein print_r vom $result, dann hättest du die fortlaufenden Index-Nummern. Hätte ich mal ordentlich hingeschaut. :)
    Dass du die [0] hast, liegt daran, dass du die Ausgabe in ein array() packst. Das Ergebnis von get_results ist bereits ein multidimensionaler Array, d.h. du brauchst das iterierte Ergebnis nicht nochmal mit array($line['Attributes']) in ein Array wrappen.


    array('irgendwas') ergibt immer Array ( [0] => 'irgendwas' ), weil es das erste (und einzige) Element im Array ist.


    Es würde also langen, wenn dein foreach so ausschaut:

    PHP
    foreach ($result as $r) {
       $attributes = $r['Attributes'];
       print_r($attributes);
    }
  • Dass du nur ein 'A' bekommst, liegt vermutlich daran, dass du etwas machst wie ['Attributes'][0], was bedeutet, dass du nur den 1. Buchstaben willst (in diesem Falle A), aber wie gesagt nur 'ne Vermutung.


    Da ich deine DB-Struktur nicht kenne, fische ich ein wenig im Dunkeln, daher nimm mal bitte folgenden Code und paste den Output z.B. hier: http://pastebin.com/

    PHP
    foreach ($result as $r) {
       $attributes = $r;
       echo "<pre>" . print_r($attributes, true) . "</pre><hr />";
    }

    Das ist ein wenig besser zu lesen, und so sieht man besser, wie dein Array genau aufgebaut ist. Vielleicht kommst so auch selbst drauf. :)


    A wild shot in the dark: Mach aus $attributes['DefenseDice'] einfach $r['DefenseDice'] und du solltest den Wert von DefenseDice erhalten.

    • Offizieller Beitrag

    Ok .. da krieg ich was interessantes raus ..
    http://pastebin.com/uNe94aRj


    Sieht so aus, als wäre das Array von $r in diesem Fall so aufgebaut: [Element1] => wert1 [Element2] => wert2 ...
    und da funkt dann plötzlich mein eigenes assoziatives Array dazwischen .. nämlich ab [Attributes] => AttackDice => 3, DefenseDice => 3, FullDefenseDice => 2, Strength => 4, ...


    Es war meine Idee Datenbankfelder zu sparen, indem ich die ganzen Attribute in einem einzelnen DB-Feld speichere und dann als Array auslese .. aber anscheinend geht das nicht so einfach, wie sich der kleine Martin das vorgestellt hat ...

  • Sieht so aus, als wäre das Array von $r in diesem Fall so aufgebaut: [Element1] => wert1 [Element2] => wert2 ...

    Genau, vielmehr [spaltenname1_der_table] => wert1 [spaltenname2_der_table] => wert2 etc.


    Das Problem hier ist, dass dein [Attributes] Array kein Array ist, sondern als String behandelt wird. D.h. ein [Attributes][0] holt nicht das erste Element aus dem vermeintlichen Array, sondern da es ein String ist, holt es den ersten Buchstaben, also A.


    Das Problem ist auch, dass sich Arrays nicht direkt in DB-Felder schreiben lassen. Dafür müsstest du zum Speichern des Arrays serialize() und beim Auslesen des Arrays unserialize() nutzen. Ich würde aber bei dem Ansatz mit "Mehrere Werte in einem Tabellenfeld" bleiben, denn der ist Usus bei unbekannter Anzahl an Werten.

    • Offizieller Beitrag

    ich leg jetzt "I would walk 500 miles" auf ..


    aaalso: danke, das mit serialize/unserialize hab ich auch bei Herrn Google gefunden.
    Um meinen String in der Datenbank als Array nützen zu können, muss ich mit einer weiteren foreach-schleife komplett durchwalken:


    Code
    $attribute = array(); 
          foreach (explode(', ',$line['Attributes']) as $couple) {
            list($attr,$value) = explode(' => ', $couple);
            $attr = trim($attr, '"');
            $attribute[$attr] = $value;
            }

    erst muss ich jedes element + wert durch den Delimiter ',' trennen,
    dann muss ich nochmal durch das erhaltene Array (welches jetzt noch nicht assoziativ ist) durchgehen, und jeweils objekt und wert zusammenführen (diesmal mit Delimiter ' => ')


    gott sei dank hab ich das exakt so im web gefunden! selber hätt ich das nie hinbekommen...
    Danke für die Tipps, Cyber! Du bist echt jedesmal meine Rettung .. wenns nur darum geht, den richtigen Ansatz zu finden!

  • Du machst es dir aber umständlich. :) Du hast die vorhandene PHP-Funktion unserialize() ja quasi fast nachgebaut. Die kann man aber adhoc so in PHP verwenden.


    Beispiel:

    Zum Auslesen kannst du dann einfach mit unserialize() den String zurück zu einem richtigen Array machen.


    Deins mag zwar auch gehen, könnte aber sicherheitstechnische Probleme bergen oder würde schon daran scheitern, wenn ' => ' mal ohne die Leerzeichen davor und danach eingetragen ist... würde daher immer die nativen Funktionen von PHP nutzen soweit es geht.

    • Offizieller Beitrag

    Ja .. klar. d.h. ich müsste meine Daten erst in ein Array umwandeln. Aber array(Objekt1 => Wert1, Objekt2 => Wert2, Objekt 3 => Wert3) hat nicht funktioniert (obwohl es laut zig internetseiten sollte!)
    Alles was ich dann mit serialize rausbekommen hab war dann etwas in der art: "s:0:Objekt1 => Wert1, Objekt2 => Wert2, Objekt3 => Wert3"
    d.h. serialize() und/oder array() hat einfach ALLES zu EINEM array-objekt gemacht. Ich weiß zwar, dass es irgendwo mein Fehler sein muss, aber ich mag nicht suchen :D


    YESS! DENKFEHLER FOUND! SERIALIZING NOW! .......
    .................................
    FINISHED :D


    (Zur Erklärung: ich hab folgenden Code gehabt:
    $Attributes = array('AttackDice => '.$_POST['AttackDice'].', DefenseDice => '.$_POST['DefenseDice'].', FullDefenseDice => '.$_POST....');
    Und komischerweise hat der nicht funktioniert. (:o)plätscher
    Aber mit
    $Attributes = array(AttackDice => $_POST['AttackDice'], DefenseDice => $_POST['DefenseDice'], FullDefenseDice => $_POST.....);
    gehts jetzt einwandfrei! Scheiß Anführungszeichen .. ich Depp hab auch das "=>" dem Objekt zugeordnet gehabt! Und da KANN es von array() ja nicht als Delimiter erkannt werden! X/