まず、開発中のエラーの処理が非常に重要であるため、投稿が存在するかどうかを確認し、データベースに接続しているかどうかを確認し、クエリが合格して実行に問題がないかどうかを確認し、クエリを実行し、最終的にクエリを実行します。
その後、bind_result
を使用できます 私が行ったように、クエリからフィールドを受け取る変数に名前を付けます。
私のクエリでどのように使用しているかに注意してください。これは、bind_param
を使用して定義するプリペアドステートメントです。 これはSQLインジェクションを回避するためです。現在のコードでは、変数をサニタイズしていないため、SQLインジェクションは引き続き可能です。
あなたがしていると私が信じるもう一つの間違いは、パスワードを非常に間違ったプレーンテキストとして保存することです。ユーザーとあなた自身を保護するために、常にパスワードを暗号化する必要があります。そのため、MySQLクエリにパスワードを含めません。最初にユーザーのみを使用します。ユーザーが見つかった場合は、彼が投稿したパスワードを使用して、データベースから取得したパスワードと一致させます。この場合は、bcrypt
非常に安全な暗号化ライブラリであるタスクを実行します。
パスワードが有効であることを確認した後でのみ、データをセッションに配置し、ユーザーをリダイレクトします。
回答の下部で指摘したすべてのエラーに加えて、コードの記述方法は次のとおりです。
<?php
session_start();
include_once('bcrypt.php');
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';
if (!isset($_POST['Username']))
{
echo 'Fill in the username...';
exit;
}
if (!isset($_POST['Password']))
{
echo 'Fill in your password...';
exit;
}
$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}
$sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
if (!$result = $con->prepare($sql))
{
die('Query failed: (' . $con->errno . ') ' . $con->error);
}
if (!$result->bind_param('s', $_POST['Username']))
{
die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}
if (!$result->execute())
{
die('Execute failed: (' . $result->errno . ') ' . $result->error);
}
$result->store_result();
if ($result->num_rows == 0)
{
die('No username found...');
}
$result->bind_result($db_username, $db_password);
$result->fetch();
$result->close();
$con->close();
$bcrypt = new Bcrypt(15);
if ($bcrypt->verify($password, $db_password))
{
$_SESSION['Username'] = $db_username;
header('location:login_success.php');
exit;
}
else
{
echo 'Wrong Username or Password';
}
注:上記のコードは単なる例であり、テストされていません。エラーに気付いた場合はお知らせください。
あなたが投稿したコードで私が気付いたエラーのいくつか:
終了の;
がありません ここ:
$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
また、クエリには$Members
があります ただし、$Members
はありません コード内の任意の場所で定義された変数、おそらくMembers
と言うつもりでしたか 代わりに、次のようになります:
$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
これはすべきではありません
$count = mysql_num_rows($result);
$count = mysqli_num_rows($result);
そして
$result=mysqli_query($sql);
$result=mysqli_query($sql_connection, $sql);
mysqli_query
の以下の部分にクエリはありません
if (!mysqli_query($sql_connection))