0

だから私は自分のウェブサイトにphp登録スクリプトを持っています.mysqlは今日誰かが同じユーザー名で登録されていることに気づきました。私はそれを自分でやろうとしましたが、ifステートメントは私を止めますが、彼らがそれを乗り越えた方法があるので、phpで==と===の違いが何であるかを尋ねる必要があるだけです。 ===正確になります。

// here we check to see if the username is all ready in the db
    $sql2 = "SELECT `username` FROM `users` WHERE `username` = '" . $user2. "'";
    $result2 = mysql_query($sql2) or die(mysql_error());

    if (mysql_num_rows($result2)==1) { 
        echo "A Account Is All Ready Here";
    } else {
    //
now we made the account

}

私はpdoに移行する必要があることを知っています。おそらくこれで修正されると思います

// here we check to see if the username is all ready in the db
    $sql2 = "SELECT `username` FROM `users` WHERE `username` = '" . $user2. "'";
    $result2 = mysql_query($sql2) or die(mysql_error());

    if (mysql_num_rows($result2)===1) { 
        echo "A Account Is All Ready Here";
    } else {


}

問題は、あるユーザーが abc を登録し、別のユーザーが abc <- の後にスペースを付けて登録し、ユーザー名が使用されていないことを示し、ユーザー名 ti の後にスペースを使用してログインすると、通常のユーザー名にログインすることです。 abc 1...

4

5 に答える 5

0

まず、比較の違い (PHP):

1 == true(true になります)

1 === true(偽になります)

==等しい値 ( 1 == truetrue を返す) をチェックするだけでなく===、型 ( 1 === trueis false(Integer vs Boolean))もチェックします。

2番目:空白の問題:

MYSQL を使用している=場合、値が 100% 等しくなければならないという意味ではありません。

SELECT 'abc ' = 'abc'1ist threaded equal であるため、単一のフィールドが返されます。Like代わりに比較を使用してください:がSELECT 'abc ' LIKE 'abc'返されます0

理由:=末尾の空白を気にしません。LIKEしましょう。

SQL 標準に従って、LIKE は文字単位で照合を実行するため、= 比較演算子とは異なる結果が生成される可能性があります。

特に、末尾のスペースは重要です。これは、= 演算子で実行される CHAR または VARCHAR の比較には当てはまりません ...

Sitenode では=、SQL で特定の照合順序とともに使用すると便利です。特殊文字がある場合、feSELECT 'Mass' = 'Maß' Collate utf8_unicode_ciは true を返しますが、SELECT 'Mass' LIKE 'Maß' Collate utf8_unicode_ci文字列の長さが異なるため false を返します。

于 2013-08-07T22:08:12.543 に答える
0

==値を比較します

===値と型を比較しますが、通常はphpではそうで'1'はありません1

UNIQUEまた、データベース テーブルの列に制約を追加して、usernameデータベースの重複を回避します。

于 2013-08-07T21:54:50.607 に答える
0

== 演算子は、左右の値が等しいかどうかを確認するだけです。ただし、=== 演算子 (余分な「=」に注意してください) は、実際には左と右の値が等しいかどうかを確認し、それらが同じ変数型であるかどうかも確認します。

于 2013-08-07T21:55:02.343 に答える