echo $begrüßung;
ok, wies aussieht reden wir aneinander vorbei, darum versuche ich mich nochmal auszudrücken:
$row ist die Tabelle aus der Datenbank, welche ich in der while schleife auslese.
Nein, in $row stehen die Daten eines Datensatzes der Ergebnismenge. Die kann aus einer, keiner oder mehreren Tabellen gewonnen werden, aber das ist unerheblich.
[id] ist die Spalte id, also die id Nummer.
Wenn id der Spaltenname ist, dann ist das ein String, der wie alle Strings in '' oder "" zu notieren ist. id ohne Anführungszeichen ist ein Konstantenname, der von PHP stillschweigend in einen String konvertiert wird, falls keine solche Konstante existiert. Und stillschweigend, solange man das error_reporting nicht um die für das Entwickeln wichtigen E_NOTICE-Meldungen beraubt, was aber PHPs Voreinstellung ist.
Siehe Why is $foo[bar] wrong?
Aber um das geht es ja nicht, die Nummer stimmt ja, wenn ich sie im "<form>" ausgebe, da steht dann 16, oder 17, oder was auch immer im value.
Aber sobald ich das <form> Abschicke, und wieder auslese, stimmt sie nicht mehr. (ich lese sie einfach mit $id=htmlspecialchars($_POST[id]) aus).
htmlspecialchars() ist keine Funktion zum Auslesen, also zur Eingabedatenbehandlung, sondern eine für HTML-gerechtes Ausgeben, also Ausgabedatenbehandlung. Du verwendest sie also in einem falschen Kontext.
Nochmal konkret gefragt: Wie sieht der HTML-Text für zwei solcher Datensätze aus? Wie sieht das aus, was beim Server nach dem Absenden des Formulars ankommt? $_POST ist bereits von PHP aufbereitet. Vielleicht wird dir dein Fehler deutlicher bewusst, wenn du das Formular mal mit GET absendest und dabei in die URL schaust.
echo "$verabschiedung $name";