php ログイン機能

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
2314

php ログイン機能

#1

投稿記事 by 2314 » 10年前

phpとsqlを使って新規会員登録をするシステムは作ることができたんですが
ログインするシステムの作り方がよくわかりません
どのようにすればよいのでしょうか?
具体的にコードを貼っていただけると助かります
どたなかお願いします

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: php ログイン機能

#2

投稿記事 by h2so5 » 10年前

「PHP ログインシステム」とかで検索すればサンプルが出てきますよ。

2314

Re: php ログイン機能

#3

投稿記事 by 2314 » 10年前

サンプルが出てくるんですがPHPのみが多くすこしわかりにくいです
sqlのデータを読み取り、入力されたID・PASSと比較する方法がわかりません

rascal
記事: 27
登録日時: 10年前

Re: php ログイン機能

#4

投稿記事 by rascal » 10年前

こんばんは
SQLの種類がわからないと返答できません


私はMYSQLを使用しています
MYSQLに限れば
[login.php]

コード:


<?php

session_start();

	#データベース取得

	require("db.php");



  // エラーメッセージ

  $errorMessage = "";

  // 画面に表示するため特殊文字をエスケープする

  $viewUserId = htmlspecialchars($_POST["userid"], ENT_QUOTES);



  // ログインボタンが押された場合      

  if (isset($_POST["login"])) {



    // 認証成功

		$sql = "SELECT * FROM ****** "; //******は自分のデータべーズにあうように変更してください。

		$sql.= "WHERE ID = '" . $_POST["userid"] . "'";

		$sql.= "AND PASS ='" . $_POST["password"] . "'";

		$result = executeQuery($sql);

		$is_login = 0;



		if( $row = mysql_fetch_array( $result ) ) 

		{



      // セッションIDを新規に発行する

      session_regenerate_id(TRUE);

      $_SESSION["USERID"] = $_POST["userid"]; //追記 ここの2行は消してもらっていいです ユーザーIDと

      $_SESSION["USERNAME"] = $row["HANDLE"]; //データベースからHANDLEというテーブルからデータを取得しUSERNAMEに代入しています

      header("Location: ../main.php"); // 転送先 ログインした後表示されるWEBページです

      exit;

    }

    else {

      $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";

    }

    		mysql_free_result($result);

	

  }



?>

<!doctype html>

<html>

  <head>

    <meta charset=utf-8>

    <title>ログインフォーム</title>

  </head>

  <body>

  <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">

  <fieldset>

  <legend>ログインフォーム</legend>

  <div><?php echo $errorMessage ?></div>

  <label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value="<?php echo $viewUserId ?>">

  <br>

  <label for="password">パスワード</label><input type="password" id="password" name="password" value="">

  <br>

  <label></label><input type="submit" id="login" name="login" value="ログイン">  

  <a href=./index.html>ホームへ戻る</a>

  </fieldset>

  </form>

  </body>

</html>
[db.php]

コード:

<?php

	function executeQuery($sql){

	#----- ↓変更して下さい↓ ------#

	$url = "localhost";  #MySqlサーバー名

	$user = "***********";  #Myqlユーザー名

	$pass = "************";  #Mysqlパスワード

	$db = "**************";  #データベース名

	#------ ↑変更ここまで↑ -------#



	# MySQLへ接続する

	$link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。");



	# データベースを選択する

	$sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。");



	#キャラクタセット

	mysql_query("set names utf8");



	# クエリを送信する

	$result = mysql_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql);



	# MySQLへの接続を閉じる

	mysql_close($link) or die("MySQL切断に失敗しました。");



	#戻り値

	return($result);

	}

?>
で ログイン処理が可能です
わからない場所があれば聞いてください。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: php ログイン機能

#5

投稿記事 by YuO » 10年前

2314 さんが書きました:サンプルが出てくるんですがPHPのみが多くすこしわかりにくいです
sqlのデータを読み取り、入力されたID・PASSと比較する方法がわかりません
とのことなので,認証とPHPとRDBMSが関わる基本的な部分について。
まず,ユーザーテーブルの例。サンプルなので非常にシンプルな構成にしておきます。

コード:

CREATE TABLE user_table
(
    user_id INT NOT NULL,
    login_id VARCHAR(32) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    PRIMARY KEY ( user_id ),
    UNIQUE ( login_id )
)
  • user_id
    内部で使うユーザーID。主キー。login_idだと外部キーとして参照する場合に効率が悪いので,代替キーとして用意している。
    セッションに保存するIDはこのユーザーID。
    AUTO_INCREMENTやIDENTITYを使って自動採番してもよい。
  • login_id
    ユーザーがログイン時に使うID。一意。
  • password_hash
    ユーザーのパスワードのハッシュ
次に,PDOを利用してデータベースへの接続を確立して,PDOオブジェクトを返す関数。
DSNに関しては,PDOドライバの対応するRDBMSのページに記述があるので,それを参考にして書いてください。

コード:

function connect_database ()
{
/*
 * localhostにあるMySQLのtestデータベースに文字コードUTF-8で接続する場合
 */
    $dsn = 'mysql:host=localhost;dbname=test;charset=UTF8'; // DSN
    $user = 'user'; // DBへのアクセスユーザー。適宜変更
    $password = 'pass'; // DBへのアクセスパスワード。適宜変更

    return new PDO($dsn, $uesr, $password, araray ( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION )); // エラーは例外で通知
}
ユーザーのパスワードチェックには,PHPのPassword Hashing関数群を使います。
PHP 5.4またはPHP 5.3.7以上の場合は,https://github.com/ircmaxell/password_compatにあるpassword.phpをインクルードするようにします (PHP 5.5でインクルードしても問題ないです)。

コード:

/**
 * ユーザーを追加します。
 *
 * @param string $loginId 追加するユーザーのログインID
 * @param string $password 追加するユーザーのパスワード
 */
function add_user ($loginId, $password)
{
    // パスワードをハッシュ値に変換する
    $passwordHash = password_hash($password, PASSWORD_DEFAULT);

    // DBに対してINSERT文を発行する
    // PHPの変数をSQL文中に埋め込む場合はプレースホルダとPDOStatement::bindValueまたは類似機構を使うこと。
    // (定数を代入しただけなどの) 問題のないことがわかっている変数を除いて,SQL文中に文字列連結や二重引用符の変数展開を使って埋め込んではいけません
    $db = connect_database();
    $statement = $db->prepare('INSERT INTO user_table ( user_id, login_id, password_hash ) SELECT COALESCE(MAX(user_id), 0) + 1, :login_id, :password_hash FROM user_table');
    $statement->bindValue(':login_id', $loginId, PDO::PARAM_STR);
    $statement->bindValue(':password_hash', $passwordHash, PDO::PARAM_STR);
    $statement->execute();
}

/**
 * パスワードを検証し,正しければユーザーIDを返します。
 *
 * @param string $loginId 検証するユーザーのログインID
 * @param string $password 検証するユーザーのパスワード
 * @return int|NULL 正しいログインIDとパスワードの組であればユーザーID,そうでなければNULL
 */
function get_user_id ($loginId, $password)
{
    // DBからログインIDで指定された行の情報を取得する
    $db = connect_database();
    $statement = $db->prepare('SELECT user_id, password_hash FROM user_table WHERE login_id = :login_id');
    $statement->bindValue(':login_id', $loginId, PDO::PARAM_STR);
    $statement->execute();
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    // 取得行数が1行でなければ失敗。0行は指定したログインIDが存在せず,2行以上はRDBMSの制約違反 (login_idはUNIQUE制約が付いている)
    if (count($result) !== 1)
    {
        return null;
    }
    // パスワードの検証をする。
    if (!password_verify($password, $result['password_hash']))
    {
        // 検証に失敗したので情報を返さない
        return null;
    }
    // 検証に成功したのでユーザーIDを返す
    return (int)$result['user_id'];
}
なお,上記のコード群自体をインタプリタで実行したりしていないので,構文エラーやバグが存在する可能性があります。

2314

Re: php ログイン機能

#6

投稿記事 by 2314 » 10年前

お二方ともわかりやすい説明ありがとうございます
参考にし自分で色々試してみます!

閉鎖

“C言語何でも質問掲示板” へ戻る