web-dev-qa-db-ja.com

ユーザー名がすでに使用されているかどうかの確認

私は自分のウェブサイト用にいくつかのスクリプトを書いており、現在、ユーザー名がすでに使用されているかどうかの確認に重点を置いています。データフィールドが選択され、POSTされたデータが一致するかどうかを確認するSELECTスクリプトを記述してみました。

これが私のコードです:

$username = $_POST["username"];
$password = $_POST["password"];

{ // Check if account already exists

        $Select_Account = "SELECT ";
        $Select_Account .= "Username ";
        $Select_Account .= "FROM UserData ";
        $Select_Account .= "WHERE UserData.Username ";
        $Select_Account .= "= '$username'";

        $Select_Account_Query = mysql_query($Select_Account);

        if ($Select_Account_Query) {
            echo "Account Exists";
        } else {
            echo "Account does not exist";
        }

    }

入力した値がテーブル内にない場合、コードが "アカウントが存在しません"と表示されない問題を理解できません。

PHPとMySQLを書くのは初めてなので、まだすべてのクエリと構文を完全にスクラッチするまでには至っていません。すべてのヘルプに感謝します。

2
Ryan

mysql_query()は、クエリに問題があり、実行に失敗した場合にのみfalseを返します。それ以外の場合、戻り値は成功と評価されるリソースです。つまり、コードは常に「アカウントの存在」をエコーし​​ます。 SELECTステートメントがフェッチした行数を確認して、ユーザーが存在するかどうかを判別します。

コードも安全ではありません。 SQLインジェクションに対して脆弱です。 PHP関数のmysql_ *ファミリを使用しないことを強くお勧めします。これらはPHP 5.5.0の時点で廃止予定であり、将来のリリースで削除される予定です。切り替えを検討してください。 mysqli_ *ファミリーの関数に移行するか、PDOでパラメーター化されたクエリを使用してください。

PDO:

$conn = new PDO('mysql:Host='.$dbhost.';dbname='.$dbname,
                 $dbusername,
                 $dbpassword);

$username = $_POST["username"];
$password = $_POST["password"];


//Query statement with placeholder
$query = "SELECT Username 
          FROM Userdata 
          WHERE Userdata.Username = ?";

//Put the parameters in an array
$params = array($username);

//Execute it
try {
    $stmt = $conn->prepare($query);
    $result = $stmt->execute($params);
} catch(PDOException $ex) {
    echo $ex->getMessage());
}

//Now Check for the row count
if($stmt->rowCount === 1) {
    echo "Account Exists";
} else {
    echo "Account does not exist";
}
4
gtux

結果セットの行数を確認する必要があります。

if (mysql_num_rows($Select_Account_Query) > 0) {
        echo "Account Exists";
    } else {
        echo "Account does not exist";
    }
3
akuzminsky