[....]

Così riesci a beccare solo id perchè la categoria la visualizza soltanto.
Se ho ben capito i valori da mandare si trovano nella stessa tabella.
Se così fosse non resta altro che aggiungere alla option l'altro valore interessato, separandolo con qualcosa (vedi esempio), per poi inserirli.

[php]echo "<select name="categoria">";

while($row = mysql_fetch_array( $result )) {
// così i valori sono congiunti da un _ underscore
echo "<option value=" . $row['id'] . "_" . $row['categoria'] . "> ";
echo $row['categoria'];
echo "</option>";
}
echo "</select>";[/php]

Quando il valore giunge all'altra tabella bisogna separarlo prima di inserirlo.
La clausula explode ci aiuta a fare questo.

Se la variabile che arriva si chiamasse $VAR
$EXPLODE = explode('_', $VAR, 2);
$VAR_1 = $EXPLODE[0]; // ID
$VAR_1 = $EXPLODE[1]; // CATEGORIA

Il gioca è fatto.
Spero sia stato di aiuto.
Alla prossima.