Yanlış anlamayın ama kodlarınız çok düzensiz ve neyin nerde olduğunuz yazan kişinin bile bir süre sonra kaybedeceği bir yapıda çıkmışsınız. Sorun eğer anlattıklarınızdan yanlış anlamadıysam ,

$kategori_guncelle = mysql_query("UPDATE urunler SET kat_id='$kat_id' WHERE id='$id'");

satırında kategori idsini güncellemek istediğinizde İD almasından kaynaklanıyor. Burda siz veritbanaından dönen değişkeni güncelleme komutu içerisine almışsınız fakat posttan gelen veriyi almak için

$kategori=str_replace("'", "'", $_POST['kategori']);

Şurdaki değişkeni yukarıdaki satıra göre $kategoriyi dahil edip işlem yapmanız lazımki düzenlenen kategori geldiğinde kategoriniz güncellensin.

Kod yapısında düzenli çalışmak ilk başlarda size külfet gibi gelsede projeniz büyüdükçe bu tarz küçük hataları bulmak çok daha büyük külfetlere neden olacaktır. + olarak sadece ' temizleme ile sql injection önüne geçemezsiniz. Yazdığınız betir açıklarla dolu...