echo $begrüßung;
Habe zwar bereits den Thread schon gefunden und wollte auch dort meine Frage reinsetzen, ging aber irgendwie nicht, weil ich den Antworte Button nicht fand, falls es überhaupt einen gibt.
Nun ja, das funktioniert hier etwas anders als in anderen Foren oder Boards. Während dort (ohne Moderatoreneingriff) immer alles aktiv ist und man auch auf hornalte Threads antworten kann, gibt es hier quasi den Lesesaal und das Archiv. Letzteres ist durchsuchbar. Aber wenn du im Archiv antworten könntest, würde es keiner hören. Ebensowenig kann jemand alle Beiträge im Archiv kennen oder findet genau den, den du meinst. Deswegen kam die Bitte, die Fundstelle zu verlinken oder wenigstens als URL zu nennen.
Ich bin der Anleitung soweit gefolgt und komme einfach nicht mehr weiter:
Da ich damals geantwortet habe und mir einbilde, dass es auch funktioniert hat, schiebe ich mal das Nichtmehrfunktionieren auf eine Änderung in PHP. Zumindest vermute ich das, anders kann ich es mir momentan nicht erklären.
Quelltext:
Schön wäre es auch gewesen, wenn du dazugeschrieben hättest, dass du mysqli verwendest, und man diese Information nicht aus den verwendeten Methodennamen erraten muss. Es gibt nämlich auch noch PDO, das sieht auf den ersten Blick ähnlich aus.
if (!$meta = $stmt->result_metadata())
{
// Fehlerbehandlung
}
Ich hoffe, die ist bei dir angemessen implementiert und nicht ebenfalls nur angedeutet :-)
Doch nun zum Thema.
while ($field = $meta->fetch_field())
$values[$field->name] = null;
Das soll bewirken, dass in $values ein Array entsteht, das genauso viele Elemente hat, wie es Spalten im Funktionsergebnis gibt. Dazu werden die Metadaten der Ergebnismenge befragt.
foreach ($values as &$reference); //nix auszuführen
Diese Schleife sollte eigentlich die Elemente in $values zu Referenzen machen, doch wenn man mal eine Kontrollausgabe in den Schleifenkörper hängt, sieht man nun (am &-Zeichen), dass die Referenz "wandert".
foreach ($values as &$reference)
var_dump();
Hier versucht mir meine Erinnerung einzureden, dass die Referenzen einzeln bestehen blieben. Wie dem auch sei, sie tun es nicht (mehr), also muss eine andere Lösung her:
while ($field = $meta->fetch_field())
$values[$field->name] =& $values[$field->name];
Und das ist auch noch kürzer als while plus foreach aus der ursprünglichen Lösung. Eigentlich erwartete ich eine Notice beim Lesezugriff auf rechts stehende $values[$field->name], denn dieses Element gibt es ja noch nicht. Doch sie bleibt aus. Stattdessen scheint mir, dass aufgrund der Referenz-Zuweisung zuerst ein neuer Wert $values[$field->name] angelegt wird und der dann erst als Referenz "an sich selbst" gebunden wird. Was da genau abläuft wird man sicher im kompilierten Bytecode sehen können. Wenn da mal jemand nachschauen könnte, der damit Erfahrung hat ...
if (!call_user_func_array(array($stmt, 'bind_result'), $values))
bind_result() will echte Variablen, Array-Elemente mag es nicht, es sei denn, es sind Referenzen. Der foreach-Trick funktioniert nicht (mehr), aber als Ergebnis bleibt eine Referenz auf dem letzten Element von $values übrig.
// ALLE FELDER BLEIBEN LEER, AUßER DAS LETZTE!!!
// DAS LETZTE FELD ERHÄLT KORREKTEN WERT
Und deshalb hat das fetch()
while ($stmt->fetch())
immer nur das letzte Feld an $values anbinden können.
// NUTZE ICH FOLGENDEN CODE ALTERNATIV, FUNKTIONIERT ES!
$stmt->bind_result($rowThreadId, $rowThreadName, $rowKatId, $rowBenutzerId,
$rowThreadStatus, $rowThreadAntworten, $rowThreadGesehen, $row);
Hier hast du "ordentliche" Variablen verwendet, für eine solche Verwendung ist das Result-Binding ausgelegt. Will man jedoch eine Abstraktionsschicht bauen, die mit einer beliebigen Spaltenanzahl in der Ergebnismenge auskommen soll, so hat man ein Problem, diese an bind_result() zu übergeben. Man könnte vielleicht mit variablen Variablen Bind-Variablen in ausreichender Menge erzeugen, doch wie bekommt man sie an bind_result() übergeben, außer mit eval()? Ich denke die call_user_func_array()-Methode ist da die bessere Lösung.
echo "$verabschiedung $name";