Change your php code to
$qry = "update users set field1='1' where field2 = '$field2' and lname = '$lname' and (CURDATE() > enddate or CURDATE() < startdate) and (id > '$id' or id > 0) LIMIT 1";
# allows inspection of what the query really looks like
# you might also go with error_log() instead
echo $qry;
mysql_query($qry);
Also note that id > $id is superflous
"(id > '$id' or id > 0)"
Since for any given $id > 0 and id > 0, the whole clause is always true due to id being greater than 0. Also, I'm assuming id is an auto incremented primary key, which means it's always > 0, which makes even id > 0 superflous.
Furthermore, your most likely outcome of the query is to affect several rows (disregarding the limit clause), yet you limit it to updating one random record. The database table has no specific ordering unless you specify that you want one. For example
WHERE someConditional
ORDER BY start ASC
LIMIT 1
would update the record having the lowest start date (the first record among chonologically ordered records). Without the order, you might update the first, the last, or any other record that matches the where clause.
Finally, as brad pointed out, you never check for success/failure
# Read the documentation: http://se.php.net/manual/en/function.mysql-query.php
$result = mysql_query();
if (!$result)
{
# never echo in production, user error_log() instead
echo mysql_errno() . ': ' . mysql_error();
}
else
{
# success!
}