編集:完全な書き直し
これを試して:
<?php
$host = "host";
$user = "user";
$password = "password";
$database = "database";
$username = 'jack'; /* Insert $_Post [''] here with username variable you pass. You could sanitize and validate with for example filter_var (), clean (), etc */
$password_user = 'password from jack'; // same here.
$link = mysqli_connect($host, $user, $password, $database);
IF (!$link){
echo ("Unable to connect to database!");
}
ELSE{
$query = "SELECT * FROM account WHERE username ='$username' AND password = md5('$password_user')";
$result = mysqli_query($link, $query);
$num_rows = mysqli_num_rows($result);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
// COMPARE $num_rows TO SEE IF A SUCCESSFUL LOGIN, THEN DIRECT TO MEMBERS PAGE
if ($row) {
session_start();
$_SESSION['login'] = "1"; // pleae not that 1 is converted into a string value
$_SESSION['username'] = $username; // added username, just to test.
header ("Location: page1.php");
}
else {
$error_message = "Login failed. Please try again.";
echo $error_message;
}
// CLOSE CONNECTION
mysqli_close($link);
}
?>
サンプルデータ:
CREATE TABLE account (
id INT auto_increment primary key,
username VARCHAR(30),
password VARCHAR(50)
);
INSERT INTO account(username, password)
VALUES
("bob", md5('password from bob')),
("jack", md5('password from jack')),
('joe', md5('password from joe'));
SQL フィドルのデモ
サンプルページ1
<?php
session_start();
$login = $_SESSION['login'];
$username = $_SESSION['username'];
echo '<h1>It WORKS, <i>'.$username.'</i>!!!</h1>';
?>
注意すべき重要なことは、MYSQL ライブラリの代わりに MYSQLI ライブラリを使用したことです。テーブルに複数の列がある場合は、列ごとに出力を選択する必要があります。たとえば、$result['id']
.
SQLステートメントで変数をエスケープしていないことがわかりました。COMPARE $num_rows TO SEE IF A SUCCESSFUL LOGIN, THEN DIRECT TO MEMBERS の下の部分をデバッグしなかったことに注意する必要があります。自分で管理できると思います。
いくつかの作業を行う必要があるサニタイズと検証を WRT します。フォームのユーザーログインを介してデータがどのように過去に保存されているかわかりません。POST を使用するとします。その場合、最初に $_POST を使用して投稿されたすべての変数を取得することから、ページの上部から開始できます。次に、それらをフィルタリングして、コードが SQL インジェクションに対して開かれていないことを確認します。例えば $username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);