3

登録・ログインシステムを作ろうとしています。ユーザー名と電子メール アドレスが使用されていないかどうかを確認するには、次を使用します。

$username = $_POST['uLogin'];
    $usernameLC = strtolower($username);
    $query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin=':login';");
    $query1->bindValue(":login", $usernameLC, PDO::PARAM_STR);

しかし、うまくいきません。同じユーザー名で好きなだけユーザーを作成できます。ひいては、値などをバインドしないため、Web サイトに接続することもできません。したがって、ユーザー名を DB 内のユーザー名と比較することはできません。

このように使用したときにユーザー名が取得されていないかどうかを確認する

$username = $_POST['uLogin'];
    $usernameLC = strtolower($username);
    $query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin='$usernameLC';");

しかし、それは適切な方法ではありません:/

誰でも助けることができますか?:)

4

2 に答える 2

7

バインドされた値に引用符が含まれているため、機能していません。それらを削除します。

userLogin=':login'

なので

userLogin=:login

「このように使用したときに、ユーザー名が取得されていないかどうかの確認が機能しました」

WHERE userLogin='$usernameLC'
  • 上で既に述べたように、バインド内の引用符を削除する必要があります。また、以下に示すように、接続に PDO を使用していることを確認してください。その場合

を使用setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)すると、構文エラーが通知されます。

準備して実行するために、PDO で準備済みステートメントを使用する方法を読んでください。


洞察:

ベースではなく PDO 接続を実際に使用していることを確認してくださいmysqli(不明です)。OPmysqli_がPDOに接続してクエリを実行するために使用する、これらのタイプの質問をよく見かけます。

これらの異なる MySQL API は互いに混在しません。

接続に使用している場合mysqli_:


ファイルの先頭にエラー レポートを追加します。これは、POST 配列に関するエラーやその他のエラーの可能性がある場合に、そのエラーを見つけるのに役立ちます。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

補足:エラー報告はステージングでのみ行うべきであり、本番環境では決して行うべきではありません。


編集:

「ありがとう、うまくいきました。しかし、ログインするときに、送信されたパスワードを DB のパスワードと比較すると、false が返されます。受信したパスワードを $_SESSION['test'] に保存して、何が得られるかを確認すると、print_r($_SESSION); が返されます。 me this : Array ( [test] => Array ( [userPwd] => test12 [0] => test12 ) ) (test12 はパスワード、userPwd はデータベースのパスワード フィールド)

パスワードの使用についてあなたが残したコメントに関して。

パスワードをハッシュではなくプレーンテキストで保存しているようです。これは、セッションに保存されるだけでなく、非常に推奨されません。非常に悪い考えです。

ハッシュされたパスワードのスタックに関するこの Q&A を参照してください。

PHPのpassword_hash()関数とpassword_verify()関数を使用します。

PHP < 5.5 の場合は、password_hash() compatibility pack.


ハッシュされたパスワードを保存するときの列のタイプと長さに関する注意。

  • パスワード列はVARCHAR.
  • また、ハッシュを格納するのに十分な長さである必要があります。
  • 使うVARCHAR(255)のが一番です。
于 2015-04-16T14:05:47.917 に答える
5

まず、名前付きプレースホルダーで引用符を準備、使用->prepare()、および削除する場合、それらは必要ありません。

$query1 = $db0->prepare("SELECT userLogin FROM tbuser WHERE userLogin= :login");

次に$query1->execute()、バインディングの後の準備済みステートメントなので、全体として次のようになります。

$username = $_POST['uLogin'];
$usernameLC = strtolower($username);
$query1 = $db0->prepare('SELECT userLogin FROM tbuser WHERE userLogin = :login'); // prepare
$query1->bindValue(':login', $usernameLC, PDO::PARAM_STR); // bind
$query1->execute(); // execute
于 2015-04-16T14:05:15.783 に答える