Você está verificando se os valores de postagem estão definidos para a senha (o que sempre será, porque esse elemento de formulário sempre será enviado). Em vez de simplesmente verificar se esses valores estão definidos, certifique-se de que não estejam vazios. use empty() Além disso, ao fazer comparações, não use a palavra "AND" use o operador and "&&".
if (!empty($_POST['repeatnewpassword']) && !empty($_POST['newpassword'])) {
if ($newpassword==$repeatnewpassword)
{
$querychange = mysql_query("UPDATE login SET password='$newpassword' WHERE username='$username'");
echo "<div class='successmate'><br><br><br><br><hr>Password has been changed!</hr></div><div class='successmate'><br><hr><br><h2><p><a href='index2.php'><br><br></a></p></h2></div>";
}
else {echo "<div class='results'>new password(s) dont match</div><div class='successmate'><br><br><h2><p><a href='changepassword.php'>try again?</a></p></h2></div>";}
}
Estou olhando para o pedaço de código errado. O conselho acima é um bom conselho, mas seu problema está aqui:
Se os campos de senha estiverem vazios, eles nunca serão os mesmos, então
if ($oldpassword==$oldpassworddb)
sempre avaliará false. Tentar
if ($oldpassword==$oldpassworddb && !empty($_POST['oldpassword']))