in der lesen.php könnte man noch einen query einsparen, nämlich wenn schon gelesene messages noch mal gelesen werden, wird trotzdem noch der query für gelesen=1 ausgeführt.

und in der neu.php würde ich eine etwas userfreundlichere fehlerbehandlung einbauen, also nicht per die(); sondern ungefähr so:

PHP-Code:
$error='';
if ( 
$_POST['betreff'] == '') {
$error.='Kein Betreff angegeben<br>';
}
...
if(
$error==''){
//datenbankeintrag

ansonten, wenn halt ein fehler oder mehrere vorliegen, dem user das forumlar mit den vorherigen werten wieder anzeigen, aber den fehler dazu ausgeben.

und bei der überprüfung der user id kommt es nur zum abbruch, wenn der query ungültig wäre, aber da er in deinem fall ja einfach nur nichts ausgibt, da die tabelle zwar vorhanden ist, aber einfach keine passendend aten zur abfrage, musst du da mit mysql_num_rows() arbeiten.