echo $begrüßung;
$query = "SELECT * FROM
reisen
WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
if (mysql_num_rows($ergebnis) > 0) {
Die Datenbank (oder MySQL in diesem Fall ;-)) muß ALLE betroffenen Datensätze zusammensuchen, zwischenspeichern und im Worst Case auch übertragen, nur damit PHP sie anschließend wegwirft bzw. wegwerfen läßt.
Nicht nur im Worst Case. PHP holt bei gepufferten Abfragen, wie sie mysql_query() macht, generell alle Datensätze der Ergebnismenge im Hintergrund ab und lagert sie zwischen. Nur dadurch ist es möglich, dass die Funktion mysql_num_rows() ein richtiges Ergebnis liefern kann. Siehe mysql_unbuffered_query().
Dem Rest der Ausführungen kann ich nur zustimmen.
echo "$verabschiedung $name";