Auf die schnelle erkenne ich da keinen Fehler, aber gibt dir doch mal $sql aus und versuche mit einem Abfrageprogramm (phpMyAdmin oder den QueryBrowser, falls es den noch gibt [MySQL-Software]) den Fehler zu finden.
Mit Syntax-Highlighting sollte das einfacher sein als mit einer formatierten PHP-Codeausgabe.
INSERT ... SET? Das ist nicht sehr häufig zu sehen und ich würde von dem Konstrukt abraten, weil es von MySQL eher schlecht dokumentiert wurde. (Nebenbei habe ich es auch nicht zum Laufen gebracht, wenn mehr als ein Parameter übergeben wurde.) Die meisten Leute verwenden INSERT ... VALUES:
Nebenbei, PHP ersetzt Variablen in Strings mit doppeltem Anführungszeichen. Statt......kanst du auch folgendes schreiben:Wenn dein Variablenname direkt von weiteren Buchstaben oder Zahlen gefolgt wird (oder ein Array-Index ist), solltest du geschweifte Klammern verwenden:Diese Ersetzung funktioniert nicht mit Funktionen und dergleichen. In Strings mit einfachen Anführungszeichen findet keine Ersetzung statt.
Ich rate lieber zu mysql_real_escape_string, da hier auch die aktuelle Zeichenkodierung berücksichtigt wird. Das ist vor allem dann nett, wenn man mit PHP 5.2.3+ arbeiten kann, da dann auch mysql_set_charset zur Verfügung steht.
Wenn wir von idealen Funktionen sprechen würde ich eh zu mysqli->real_escape_string raten. Die mysqli-Erweiterung ist der alten mysql-Erweiterung voraus; man muß nur sicherstellen, daß der Hoster sie auch unterstützt.
Mit mysqli kriegst du auch lustige Funktionen wie mysqli->prepare/mysqli->stmt_bind_param, mit denen du Typsicherheit in deine Abfrage kriegst. Und Unterstützung für Transaktionen und Rollbacks. Und allgemein Unterstützung für MySQL-Features, die neuer sind als Oktober 2004.