First off, as weak as sha1 alone is its better than plaintext stored passwords. ANY encryption, hashing or other obfuscation is far better than plaintext!
The problem with sha1 is that its fast, so its fast to generate hashes to crack against. Salting helps a lot, but if your server is compromised and you have your salt hash stored as a string somewhere, there goes that advantage...
If you don't want to use mcrypt or another encryption method, you can mixup your sha1 hash a bit like this:
$my_super_sha1_hash =
sha1(
sha1(
substr(
sha1($username)
, 0
, strlen($password)
)
)
.sha1(
substr(
sha1($password)
, 0
, 40-strlen($password)
)
)
);
By mixing together the username and password, and using the length of the (unknown) password to determine what bits of each are used in the sting that then gets hashed again, each salt is unique but not random, so the result is consistent across all users and A LOT more difficult to crack since have to factor in the string length of the password and the username.