Обычно неразумно связывать ваши вызовы функций, как у вас. Особенно с вызовами базы данных. Функции mysql _ * () ожидают передачи определенных вещей, таких как дескрипторы операторов. Но они могут возвращать логическое значение FALSE вместо дескриптора, если есть проблема. Это ЛОЖЬ передается вместо дескриптора, а затем все ломается.
Общее правило - всегда предполагать, что ваш запрос каким-то образом потерпит неудачу, и программировать с защитой:
$sql = "SELECT ....";
$result = mysql_query($sql) or die(mysql_error());
$rows = mysql_num_rows($result);
if ($row !== 0) then
die("Not unique");
}
Кроме того, ваш оператор запроса выглядит синтаксически правильным. Почему бы не посмотреть, что он возвращает?
$row = mysql_fetch_assoc($result);
var_dump($row);
и посмотрите, что именно соответствует. Может быть, у вас нет этого значения в таблице, и вы ошибаетесь, думая, что оно там.