There are a couple of concise coding techniques you can utilize to clean that up a bit. Here's the first:
Use [man]sprintf/man to form strings like SQL queries:
$sql = sprintf(
"INSERT INTO entries(cat_id, dateposted, subject, summary, body, author)
VALUES(%d , NOW() , %s , %s , %s , %s )",
$cat_id,
"'" . mysql_real_escape_string($subject) . "'",
"'" . mysql_real_escape_string($summary) . "'",
"'" . mysql_real_escape_string($body) . "'",
"'" . mysql_real_escape_string($author) . "'"
);
And the second would be to use the ternary operator:
$cat_id = isset($_POST['cat_id']) ? (int)$_POST['cat_id'] : NULL);
$subject = isset($_POST['subject']) ? strip_tags($_POST['subject']) : NULL);
$body = isset($_POST['body']) ? nl2br($_POST['body']) : NULL);
This is not only concise but also has two benefits: you can do some general filtering/type-casting/etc. when storing the POST'ed value in the new variable, and if the data wasn't POST'ed you'll still define the variable but with a default value (e.g. NULL) instead.
Also note that a benefit of using more localized variables (e.g. $body instead of $POST['body']) is that you don't lose data integrity. Quick example, say my name is "Brian O'Connor" which you'll then receive as "Brian O\'Connor" since you overwrote the original copy of my data with the mysql_real_escape()'ed version of it. Now say you try to greet me to your site:
echo "Welcome, $_POST[name]!";
The output would then be:
Welcome, Brian O\'Connor!
which just looks broken.