これは典型的な照合問題です。デフォルトの照合では、大文字と小文字が区別されません。比較にはバイナリ照合を使用する必要があります。
デフォルトの utf8 照合
mysql> SELECT 'password' COLLATE utf8_unicode_ci = 'PASSWORD' COLLATE utf8_unicode_ci;
+-------------------------------------------------------------------------+
| 'password' COLLATE utf8_unicode_ci = 'PASSWORD' COLLATE utf8_unicode_ci |
+-------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
utf8 バイナリ照合
mysql> SELECT 'password' COLLATE utf8_bin = 'PASSWORD' COLLATE utf8_bin;
+-----------------------------------------------------------+
| 'password' COLLATE utf8_bin = 'PASSWORD' COLLATE utf8_bin |
+-----------------------------------------------------------+
| 0 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT 'password' COLLATE utf8_unicode_ci = 'password' COLLATE utf8_unicode_ci;
+-------------------------------------------------------------------------+
| 'password' COLLATE utf8_unicode_ci = 'password' COLLATE utf8_unicode_ci |
+-------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
クエリを次のように変更します
$query = "SELECT id FROM users WHERE username = ? AND password COLLATE utf8_bin = ?";
照合の詳細については、次を参照してください。
https://dev.mysql.com/doc/refman/5.5/en/charset-general.html