echo $begrüßung;
Also erstmal "verschlimmbessern" wir den Code mal ein bisschen.
Das ist dir gelungen.
while($lexikon = mysql_fetch_array(mysql_query("SELECT * FROM lexikon ORDER BY begriff"))){
Nein, so geht das nun gar nicht. Zuerst wir mysql_query ausgeführt, davon wird die erste Ergebniszeile abgeholt und $lexikon zugewiesen. Im nächsten Schleifendurchlauf wird die Query erneut ausgeführt und die erste Egebniszeile abgeholt und $lexikon zugewiesen. Im nächsten Schleifendurchlauf ... usw. usf. Beendet wird das ganze erst nach Ablauf der max_execution_time
Es ist in kaum einem Fall sinnvoll, das Egebnis eines der mysql_*-Befehle direkt einem anderen zuzuweisen. Mitunter werden Fehlerzustände durch ein false als Rückgabewert bekanntgegeben. Auf dieses false sollte man angemessen reagieren und es nicht unbeachtet weiterreichen an Funktionen, die stattdessen lieber eine Ressourcenkennung haben möchten.
if($cols % 4){
Eine Modulo-Operation liefert den Rest der bei einer Division übrigbleibt. Bei 4 als zweitem Operanden liefert es 3x etwas, das als boolsches true gewertet wird und einmal als false.
echo ('</tr><tr>');
Die Zeile sollte doch nur einmal alle 4 Spalten gewechselt werden, oder?
echo ('<td><a href="').$$lexikon[ur].('">').$lexikon[begriff].('</a></td>');}
Das doppelte $$ ist sicher nur ein Tippfehler, aber die fehlenden Stringbegrenzer um ur(l) und begriff sind definitiv kein guter Stil: Why is $foo[bar] wrong?
echo "$verabschiedung $name";