1

私は現在、私が書いたこのコードを持っています:

$username = $_POST['username'];
$password = $_POST['password'];
$rpassword = $_POST['rpassword'];
$usrip = $_SERVER['REMOTE_ADDR'];
$email = $_POST['email'];
$errors = array();
$checkUsername = $odb -> prepare("SELECT COUNT(*) FROM `users` WHERE `username` = :username");
$checkUsername -> execute(array(':username' => $username));
$countUsername = $checkUsername -> fetchColumn(0);
if ($checkUsername != 0)
{
$errors['Username is already taken'];
}

ただし、これは完全に無視されているようで、ユーザー名が同一 (大文字など) であっても、ユーザーは同じユーザーを 2 つ登録することができます。私のデータベースは次のようになります。

http://puu.sh/1mTcZ/9b2ff3b68f44b4cc486beacc2d2b88fd

私はこれをまったく機能させないようです。データベース構造は次のようになります: 洗練された (dbname) > ユーザー (テーブル) > ユーザー名 (行)

どんな助けでも大歓迎です。

編集:

いくつかの変更の後、これが私が持っているものですが、まだ同じ問題を抱えているようです。

$checkUsername = $odb->prepare("SELECT COUNT(*) FROM `users` WHERE LOWER(`username`) = :username");
$checkUsername -> execute(array(':username' => $username));
$countUsername = $checkUsername -> fetchColumn(0);
if ($checkUsername != 0)
{
$errors['Username is already taken'];
}

ユーザー名の行も utf8_general_ci になりました

4

2 に答える 2

2

わかりました、コメントを回答として投稿します。

IF ステートメントが間違った変数を評価しています。$checkUsername ではなく、$countUsername を評価する必要があります。

また、エラー配列を正しく初期化していないようです。試す:

if ($countUsername != 0)
{
    $errors[] = 'Username is already taken';
}

私は自分のデータベースでこれをテストしましたが、動作します。

Collation = latin1_general_cs    (cs = case sensitive)
于 2012-11-05T23:54:54.080 に答える
0

テーブル照合を「utf8_general_ci」に設定してみてください。また、SQLクエリを次のように変更できます

$checkUsername = $odb->prepare("SELECT COUNT(*) FROM `users` WHERE LOWER(`username`) = :username");
于 2012-11-05T23:41:07.403 に答える