2

このcount($existuser)関数は常に 1 を返します。その名前または電子メールを持つユーザーがいない場合でも。

コードは次のとおりです。

function registerUser($username, $password, $passwordagain, $email, $mcname) {
    include $_SERVER['DOCUMENT_ROOT'] . "/config/config.php";
    $conn          = new PDO('mysql:host=' . $ip . ';dbname=' . $database, $username, $password);
    $validusername = "/^[a-z0-9]+$/";
    $validpassword = "/^[A-Za-z0-9]+$/";
    $validemail    = "/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/";
    $validmcname   = "/^[A-Za-z0-9]+$/";
    $error         = 0;

    if (strlen($username) < 4 || strlen($username) > 24) {
        $error = 1;
    }
    if (strlen($password) < 6 || strlen($password) > 24) {
        $error = 1;
    }
    if (strlen($mcname) < 4 || strlen($mcname) > 24) {
        $error = 1;
    }
    if (!preg_match($validusername, $username)) {
        $error = 1;
    }
    if (!preg_match($validpassword, $password)) {
        $error = 1;
    }
    if (!preg_match($validemail, $email)) {
        $error = 1;
    }
    if (!preg_match($validmcname, $mcname)) {
        $error = 1;
    }
    if ($password != $passwordagain) {
        $error = 1;
    }
//test
    $userquery = $conn->query('SELECT * FROM users WHERE username="' . $username . '"');
    $existuser = $userquery->fetch();
    echo count($existuser);
//test
    if (count($existuser)) {
        $error = 1;
        echo "<div class='erroralert'>Username already exists!</div>";
    }
//test
    $emailquery = $conn->query('SELECT * FROM users WHERE email="' . $email . '"');
    $existemail = $emailquery->fetch();
//test
    if (count($existemail)) {
        $error = 1;
        echo "<div class='erroralert'>E-mail already exists!</div>";
    }
    if ($error != 1) {
        $encryptedpassword = hash('sha512', $password);
        $registeruser      = $conn->query("INSERT INTO users(username, password, email, mcname) VALUES ('$username', '$encryptedpassword', '$email', '$mcname')");
        echo "<div class='successalert'>Succesfully registred</div>";
    }
}
4

3 に答える 3

1

これを行う場合、なぜPDOを使用しているのですか。

$userquery = $conn->query('SELECT * FROM users WHERE username="' . $username . '"');
$existuser = $userquery->fetch();

次のロジックが必要です。

$userquery = $conn->prepare('SELECT * FROM users WHERE username = ?');
$userquery->execute(array($username));
if ($userquery->rowCount()) {
    // found user
} else {
    // user not found
}
于 2012-12-23T16:00:49.793 に答える
0

count()ここで間違って使用しています。通常の変数の場合は1を返し、配列の場合は要素の数を返します。

重要な部分は最初のものです。行がない場合は、PDOStatement::fetch()を返しFALSEます。これは、真実である1をカウントします。

count(FALSE);      # 1
count($existuser); # 1 when there is no user, when there is a user at least 2
                   #   for default fetchmode PDO::FETCH_BOTH

つまり、何もチェックしていません。代わりに、そうではない FALSEことをテストします。

if ($existuser === FALSE) {
   // error.
}
于 2012-12-23T16:01:23.463 に答える
0

クエリの実行に失敗している可能性があり、それが常に "1" を取得している理由です。これはおそらくエラー レポートです。

あなたのコードを読んで、これを試すことをお勧めします:

次のクエリでは、ユーザー名を " で囲んでいますが、これは常にサポートされているわけではありません。代わりに、一重引用符 ' を使用し、文字列自体を " で囲んでください。したがって、次の行

$userquery = $conn->query('SELECT * FROM users WHERE username="' . $username . '"');

する必要があります

$userquery = $conn->query("SELECT * FROM users WHERE username='" . $username . "'");

同じ問題を抱えている他のクエリにも同じことを行います。

于 2012-12-23T15:20:44.290 に答える