mehrere datensätze ausgeben

Northrog

Grünschnabel
Hallo,

ich habe das Problem, dass meine abfrage
PHP:
$selection=mysql_fetch_object(mysql:query("SELECT `poster` FROM `posts` WHERE `thread` LIKE $threadid ORDER BY `id` ASC"));
(die ich für ein forum verwende) mehere ergebnisse liefert (es existieren x ergebnisse, wobei x größer 0).
Wie kann ich nun alle diese Ergebniss ausgeben?
PHP:
echo $inhalt->poster;
Das funktioniert nicht bzw es gibt nur den post aus, der ganz oben aufgelistet ist.
Hat jemand eine Idee?
 
PHP:
$result = mysql_query("SELECT `poster` FROM `posts` WHERE `thread` LIKE $threadid ORDER BY `id` ASC")

$selection = array();
while( $selection[] = mysql_fetch_object( $result );
array_pop( $selection );

// oder
while( $row = mysql_fetch_object( $result ) {
    $selection[] = $row;
}

$result hält demzufolge eine Resourcekennung auf ein MySQL-Ergebnislink, dessen Zeiger auf dem ersten Datensatz steht. Mit jedem Aufruf von mysql_fetch_* wird nun der Datensatz, auf dem der Zeiger steht, zurückgegeben und der Zeiger um eins nach vorne geschoben. Das wird so lange gemacht, bis die Fetch-Funktion NULL zurückgibt, also kein Datensatz mehr vorhanden ist.
 
PHP:
$result = mysql_query("SELECT `poster` FROM `posts` WHERE `thread` LIKE $threadid ORDER BY `id` ASC");
$selection = array();
while($selection[] = mysql_fetch_object($result))
{
array_pop($selection);
}
Bei dieser Variante ist die Bildschirmaausgabe exakt 3 mal nichts( hatte noch ein element hinzugefügt, d.h. mysql liefert dir korrekte anzahl an Einträgen, gibt den inhalt dieser jedoch nicht aus bzw erkennt ihn nicht)

Und diese Variante
PHP:
$result = mysql_query("SELECT `poster` FROM `posts` WHERE `thread` LIKE $threadid ORDER BY `id` ASC");
$selection = array();
while($row = mysql_fetch_object($result))
{
$selection[] = $row;
echo $row;
}
liefert -auch korrekt oft- die Textausgabe "Object" (ohne die Anführungszeichen)
warum?
€:
PHP:
$result = mysql_query("SELECT `poster` FROM `posts` WHERE `thread` LIKE $threadid ORDER BY `id` ASC");
$selection = array();
while($selection[] = mysql_fetch_object($result))
{
$wert=array_pop($selection);
echo"<span class=\"hervorgehoben\">";
echo $wert;
echo"</span><p>";
}
liefert mir nun ebenfalls 3 mal "Object"....
Hab keine Ahnugn worans liegt :'-(
 
Zuletzt bearbeitet:
Normalerweise gibt man komplexe Objekte nicht als String aus (mal abgesehen von der magischen __toString Methode, die das stdObject in PHP nicht einbindet. Eine Instanz selbigen Objekts gibt nämlich [phpf]mysql_fetch_object[/phpf] zurück.
PHP versucht also zuerst bei der toString Konvertierung eines Objekts zuerst eine toString Methode zu fnden, ansonsten castet PHP automatisch auf den abstrakten Datentyp, was meist Object oder Array ist (je nach dem, was gecastet wird).

Weiter aber im Text: Die Spaltenbezeichnungen in der Datenbank sind ensprechend die Eigenschaften, die der Instanz zugewiesen werden. Das sieht dann praktisch gesehen so aus:
PHP:
echo $row->columnName1;

Achtung:
PHP:
while($selection[] = mysql_fetch_object($result))
{
array_pop($selection);
}

ist totaler Unsinn, es sei denn du willst alle Daten ohne Verarbeitung in das Array $selection schreiben und gleich wieder raushauen. Meine Vorschläge zur Lösungen bezogen sich darauf, die Datensätze erstmal zu speichern und nicht sofort ausgeben zu müssen. Ich mutmaße einfach mal, dass dir noch ein wenig das Grundvertändnis für die Datentypen und deren Organisation in PHP fehlt, denn ansonsten hättest du gesehen, dass $selection ein Array ist, welches die Datensätze aufnimmt, und eine anschließende Verarbeitung benötigt. Was deinen Vorstellungen mehr entspricht, ist dann wohl sowas hier:
PHP:
while ( $row = mysql_fetch_object( $result ) ) {
    echo $row->col1;
    echo $row->col2;
    // ...
}

Die Frage ist: Muss es überhaupt fetch_object sein? Ginge nicht auch einfach [phpf]mysql_fetch_assoc[/phpf] oder ähnliches?

Edit: In deinem oberen Beispiel hast du doch auch echo $inhalt->poster; geschrieben. Du holst dir nur nicht nur einen einzigen Datensatz aus dem Ergebnis,sondern iterierst durch die Datensätze. An der eigentlischen Struktur wird deshalb aber nix geändert.
 
Das Problem ist nur, dass ich ja eigentlich mehrereeinträge in der Tabelle audgeben möchte, d.h.
PHP:
$selection=mysql_fetch_object(mysql:query("SELECT `poster` FROM `posts` WHERE `thread` LIKE $threadid ORDER BY `id` ASC"));
liefert, sagen wir mal 3, werte für poster zurück, wobei ich logischerweise nicht
PHP:
while ( $row = mysql_fetch_object( $result ) ) {
    echo $row->col1;
    echo $row->col2;
    // ...
}
anwenden kann, da alles ja in derselben spalte steht...
es müsste irgendwie so aussehen:
PHP:
while ( $row = mysql_fetch_object( $result ) ) {
    echo $row[0]->col1;
    echo $row[1]->col1;
    // ...
}
...aber wie schaffe ich es, dass $row in diesem fall ein array ist, das noch dazu die passenden feldwerte für poster enthält?
 
Irgendwie wird das alles zu kompliziert, wie du es haben möchtest, da es doch eigentlich einfacher geht.

Vorweg nehmen wir mal das hier als gegeben an:
Code:
SELECT * FROM `posts`;
      id  |  poster  | thread  
    ------+----------+---------
        1 |    'foo' |       1 
        2 |    'bar' |       1 
        3 |    'bla' |       2 
      ... |     ...  |     ... 

SELECT `poster` FROM `posts` WHERE `thread` = 1 ORDER BY `id` ASC;
      poster  
    ----------
       'foo' 
       'bar'

Direkter Weg:
PHP:
<?php
if ( $result = mysql_query( "SELECT `poster` FROM `posts` WHERE `thread` = 1 ORDER BY `id` ASC;" ) ) {
    while ( $row = mysql_fetch_assoc( $result ) ) {
        echo ">> {$row['poster']}\n";
    }
}
ergibt:
Code:
>> foo
>> bar
Und mit mehreren Spalten:
PHP:
if ( $result = mysql_query( "SELECT `id`, `poster` FROM `posts` WHERE `thread` = 1 ORDER BY `id` ASC;" ) ) {
    while ( $row = mysql_fetch_assoc( $result ) ) {
        echo ">> {$row['id']}:";
        echo " {$row['poster']}\n";
    }
}
ergibt:
Code:
>> 1: foo
>> 2: bar

Was du möchtest, sähe dann so aus:
PHP:
<?php
if ( $result = mysql_query( "SELECT `poster` FROM `posts` WHERE `thread` = 1 ORDER BY `id` ASC;" ) ) {
    $rows = array();

    // Fetche Ergebnisse als Instanz von stdObject
    while ( $row = mysql_fetch_object( $result ) ) {
        $rows[] = $row;
    }

    // Ausgabe:
    foreach ( $rows as $row ) {
        echo $row->poster;
    }
    
    // oder
    $total = count( $rows );
    for ( $i = 0; $i < $total; ++$i ) {
        echo $rows[$i]->poster;
    }
}

[phpf]mysql_fetch_object[/phpf] gibt ein minimales Objekt zurück, dessen Eigenschaften die selektierten Spalten in der Tabelle repräsentieren, an sich ist der Rückgabewert aber kein Array. Das müsstest du dir, wie eben gezeigt, selbst konstruieren.
Deine Schleife:
PHP:
while ( $row = mysql_fetch_object( $result ) ) {
    echo $row[0]->col1;
    echo $row[1]->col1;
    // ...
}
ergibt aus diesem Grund, dass $row eben kein Array ist, keinen Sinn - Zumal du die Verarbeitung und Ausgabe in einem unlogischen Kontext zusammenbringst. Zum einen liest du nur den aktuellen Datensatz ein, gibst aber gleichzeitig auch alle anderen Datensätze aus? So, wie es da steht, wird es nicht funktionieren, aber das ist prinzipiell das, was du mit obiger Schleife erreichen würdest, würde sie so aussehen:
PHP:
while ( $row[] = mysql_fetch_object( $result ) ) {
    echo $row[0]->col1;
    echo $row[1]->col1;
    // ...
}
 
Vielen Danke für deine Hilfe^^
Das war genau das, was ich brauchte^^
Der Code sieht nun auf mein Script bezogen so aus:
PHP:
if($result = mysql_query( "SELECT * FROM `posts` WHERE `thread` = $threadid ORDER BY `id` ASC" ))
{
    while ( $row = mysql_fetch_assoc( $result ) ) 
    {
echo"<tr>";
echo"<td width=\"25%\">";
    echo"<span class=\"hervorgehoben\">";
    echo $row['poster'];
    echo"</span><p>";
    $date=explode("|", $row['date']);
    echo $date[0]." um ".$date[1];
echo"</td>";
echo"<td width=\"75%\">";
    echo $row['text'];
echo"</td>";
echo"</tr>";
    }
}
else
{
echo"Verbindungsfehler";
}
Nochmals danke ;)
 
Zurück