PDO: Ein Array mit assotiativem Feld versehen

Hallo,

ich habe mit PDO angefangen, allerdings liegt es mir noch nicht so sehr und komme nicht so gut klar wie mit der alten Methode.

Ich habe zwei Tabellen, die ich "zusammenfüge" in meiner Datenbank. Ich möchte bestimmte Datensätze herausfiltern und dann auf meiner Seite als Links einbinden. PDO gibt die Arrays für mich nur als numerisches Array zurück, was ich aber haben möchte ist ein assotiatives, damit ich weiß, was sich hinter dem Link verbirgt, wenn ich in paar Jahren wieder in das Skript schaue.

Also statt:

$Arrayname[1]['Link']

soetwas:

$Arrayname['home']['Link']

Das ist für mich wichtig, da der Link in einer anderen Sprache sein kann, je nachdem welche Seite aufgerufen wird. Es gibt also eine eindeutige ID in beiden Tabellen und eine Spalte in einer Tabelle, die den Namen des Assotiativen Arrays angeben soll.

Mein Ansatz war folgender:

$QuE = $PDO->query('SELECT o.Assotiativ, c.Link, c.Linkname FROM Options o, de_Content c WHERE a.GUID = c.GUID AND a.GUID IN (1,2)');  
$L = $QuE->fetchAll(PDO::FETCH_GROUP);  
  
echo '<pre>';  
var_dump($L);  
echo '</pre>';  
echo '<br>';  
echo $L['home'][0]['Link']; // = startseite.html  
echo $L['home'][0]['Linkname']; // = Startseite  

de_Content kann sowohl ru_Content als auch en_Content etc. werden. Das mache ich später automatisch.

Zu meinem obigen Ansatz. Die erste Spalte die beim Select angegeben wird, wird über seinen Inhalt als assotiatives Array umgewandelt und speichert die nachfolgenden Spaltennamen. Wenn ich z.B. bei der Select-Anweisung c.Link vor o.Assotiativ gesetzt hätte, sähe die Ausgabe so aus:

echo $L['startseite.html'][0]['Assotiativ']; // = home  
echo $L['startseite.html'][0]['Linkname']; // = Startseite

Im Prinzip würde mir das reichen. Ich würde immer den Wert der Spalte "Assotiativ" als erstes angeben und er würde mir ein assotiatives Array aus seinem Wert basteln. Andererseits gibt es zwei Sachen, über die ich mir Gedanken mache:

Erstens, ist das überhaupt so vorgesehen oder gibt es einen anderen Weg, der besser ist.

Zweitens kann ich das [0] nicht leiden, was zwischendrin ist. Ich würde lieber sowas haben:
$L['home']['Link']

Jemand eine Idee?

  1. Moin!

    $L = $QuE->fetchAll(PDO::FETCH_GROUP);

    Ich würde lieber sowas haben:
    $L['home']['Link']

    Jemand eine Idee?

    Ja. $sth->fetchAll(PDO::FETCH_CLASS, "objektname")

    Beispiel #4 Instantiating a class for each result

    <?php  
    # objekt bauen  
    class fruit {  
        public $name;  
        public $colour;  
    }  
      
    $sth = $dbh->prepare("SELECT name, colour FROM fruit");  
    $sth->execute();  
      
    $result = $sth->fetchAll(PDO::FETCH_CLASS, "fruit");  
    var_dump($result);  
    ?>
    

    Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

    array(3) {  
      [0]=>  
      object(fruit)#1 (2) {  
        ["name"]=> string(5) "apple"  
        ["colour"]=> string(5) "green"  
      }  
      [1]=>  
      object(fruit)#2 (2) {  
        ["name"]=> string(4) "pear"  
        ["colour"]=> string(6) "yellow"  
      }  
      [2]=>  
      object(fruit)#3 (2) {  
        ["name"]=> string(10) "watermelon"  
        ["colour"]=> string(4) "pink"  
      }  
    }  
    
    

    ODER Du nimmst mysqli:

    <?php
    $L=array();
    $mysqli = new mysqli("localhost", "user", "password", "database");
    $mysqli->real_query("SELECT id, foo, bar FROM test");
    $res = $mysqli->use_result();
    while ($row = $res->fetch_assoc()) { $L[]=$row; }
    print_($L);
    ?>