質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.22%

PHP : 新規登録の際にフォームからデータを受け取り、データベースに保存したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,402
退会済みユーザー

退会済みユーザー

signup.php

<?php
  session_start();
  $name=$email=$username=$password='';
  if (isset($_SESSION['users'])){
    $name=$_SESSION['users']['name'];
    $email=$_SESSION['users']['email'];
    $username=$_SESSION['users']['username'];
    $password=$_SESSION['users']['password'];
  }
  $pdo=new PDO('mysql:host=localhost;dbname=admin;charset=utf8','root');
    echo '<form class="singup" action="signup-out.php" method="post">';
      echo '<p>名前</p>';
      echo '<input type="text" name="name" value="'.$name.'"><br>';
      echo '<p>ユーザー名</p>';
      echo '<input type="text" name="username" value="'.$username.'"><br>';
      echo '<p>メールアドレス</p>';
      echo '<input type="text" name="email" value="'.$email.'"><br>';
      echo '<p>パスワード</p>';
      echo '<input type="password" name="password" value="'.$password.'"><br>';
     foreach ($pdo->query('select * from college') as $row) {
      echo '<p>学校名</p>';
      echo '<select name="college">';
      echo '<option value="0">学校名を選択してください</option>';
      echo '<option value="'.$row['college_id'].'">'.$row['name'].'</option>';
      echo '</select>';
     }
      echo '<br>';
      echo '<input type="submit" value="SingUp">';
    echo '</form>';
   ?>
echo '<select name="college">';
      echo '<option value="0">学校名を選択してください</option>';
//ここでは、データベースのcollegeから大学名を取り出しています。//
     echo '<option value="'.$row['college_id'].'">'.$row['name'].'</option>';
      echo '</select>';


Database
college table 

college_id    name
1   ○○○○○○○○大学
2   ○○○○○○○○大学
3   ○○○○○○○○大学
4   ○○○○○○○○大学
    Create table college(
       college_id int auto_increment primary key,
       name varchar(100) not null
    );

signup-out.php

session_start();
$pdo=new PDO('mysql:host=localhost;dbname=admin;charset=utf8','root');
if (isset($_SESSION['users'])){
  $user_id=$_SESSION['users']['user_id'];
  $sql=$pdo->prepare('select * from users where user_id!=? and username=?');
  $sql->execute([$user_id,$_REQUEST['username']]);
}else{
  $sql=$pdo->prepare('select * from users where username=?');
  $sql->execute([$_REQUEST['username']]);
}
if (empty($sql->fetchAll())) {
  if (isset($_SESSION['users'])){
    $sql=$pdo->prepare('update users set name=?, email=?,
    username=?, password=? college_name=? where user_id=?');
    $sql->execute([
      $_REQUEST['name'], $_REQUEST['email'],
      $_REQUEST['username'],$_REQUEST['password'],$_REQUEST['college'], $user_id]);
    $_SESSION['users']=[
      'user_id'=>$user_id, 'name'=>$_REQUEST['name'],
      'email'=>$_REQUEST['email'],'username'=>$_REQUEST['username'],
      'password'=>$_REQUEST['password'],'college_name'=>$_REQUEST['college']
    ];
    echo '<p>アカウントを更新しました。</p>';
  }else {
  $sql=$pdo->prepare('insert into users valuse(null,?,?,?,?,?)');
  $sql->execute([
    $_REQUEST['name'],$_REQUEST['email'],$_REQUEST['username'],
//ここの$row['college_id'],$row['name']で、signup.phpの学校名をデータベースに保存したいのですが、その方法が分かりません。//
    $_REQUEST['password'],$row['college_id'],$row['name']]);
  echo '<p>アカウントを登録しました。</p>';
  }
}else {
  echo '<p>ログイン名がすでに使われていますので、変更してください。</p>';
}
 ?>


Database
users table

user_id name username email password college_id college_name
1 admin admin admin@gamil.com ******* 1 ○○○○○○○○大学
     Create table users (
     user_id int auto_increment primary key,
     name varchar(50) not null,
     username varchar(30) not null unique,
     email varchar(35) not null,
     password varchar(50) not null,
     college_id int not null,
     college_name text not null
 );

という形で、保存をしたいのですが、その方法が分かりません。

したいこと

・新規登録の際に、大学名と大学idをユーザーテーブルに保存をしたい。

どうぞご教授の方よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Kosuke_Shibuya

    2017/06/24 21:02

    collage, users のテーブル定義をcreate 文で提示してください。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/06/24 21:52

    Databaseの下に追加いたしました。よろしくお願いします。

    キャンセル

  • Kosuke_Shibuya

    2017/06/24 21:54

    create 文で提示してください。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/06/24 22:09

    申し訳ございません。今度こそ追加いたしました。

    キャンセル

回答 1

checkベストアンサー

+6

<?php
// エラー表示
ini_set('display_errors', true);
error_reporting(E_ALL);

require_once 'mysql.php';

function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'utf-8');
}

// 全学校取得
$colleges = get_colleges();

// 登録
$last_insert_id = regist_data();

$new_user = get_user_one($last_insert_id);
?>
<!DOCTYPE HTML>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="" method="post">
            <?php if (!is_null($last_insert_id) && $last_insert_id > 0) : ?>
                <p>登録しました。</p>
            <?php endif; ?>
            <p>
                <input type="text" name="name" />
            </p>
            <p>
                <input type="text" name="username" />
            </p>
            <p>
                <input type="text" name="email" />
            </p>
            <p>
                <input type="text" name="password" />
            </p>
            <select name="college_id">
                <?php foreach ($colleges as $college) : ?>
                    <option value="<?= $college['college_id']; ?>"><?= $college['name']; ?></option>
                <?php endforeach; ?>
            </select>
            <button>登録する</button>
        </form>
        <div>
            <?php if (!is_null($new_user)): ?>
                <p><?= h($new_user['user_id']); ?></p>
                <p><?= h($new_user['name']); ?></p>
                <p><?= h($new_user['username']); ?></p>
                <p><?= h($new_user['email']); ?></p>
                <p><?= h($new_user['password']); ?></p>
                <p><?= h($new_user['college_id']); ?></p>
                <p><?= h($new_user['college_name']); ?></p>
            <?php endif; ?>
        </div>
    </body>
</html>
<?php

/**
 * mysql.php
 */

/**
 * 接続情報取得
 * @return \PDO
 */
function db_connect()
{
    $dsn = "mysql:host=localhost;dbname=sample;carset=utf8";
    $username = 'root';
    $password = 'password';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ];
    return new PDO($dsn, $username, $password, $options);
}

/**
 * 学校を取得する
 * @return type
 */
function get_colleges()
{
    $sql = 'SELECT * FROM college;';
    $pdo = db_connect();
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

/**
 * データを登録する
 * @return type
 */
function regist_data()
{
    if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') {
        return;
    }

    $sql = "INSERT INTO `users` (";
    $sql .= "    user_id, name, username, email, password, college_id";
    $sql .= ") VALUES (";
    $sql .= "    null, :name, :username, :email, :password, :college_id";
    $sql .= ")";

    $pdo = db_connect();
    $stmt = $pdo->prepare($sql);
    $arr = [];

    $raw_password = filter_input(INPUT_POST, 'password');
    $hash_password = password_hash($raw_password, PASSWORD_DEFAULT);

    $arr[':name'] = filter_input(INPUT_POST, 'name');
    $arr[':username'] = filter_input(INPUT_POST, 'username');
    $arr[':email'] = filter_input(INPUT_POST, 'email');
    $arr[':password'] = $hash_password;
    $arr[':college_id'] = filter_input(INPUT_POST, 'college_id');
    $stmt->execute($arr);

    return $pdo->lastInsertId();
}

/**
 *
 */
function get_user_one($id)
{
    if (is_null($id)) {
        return;
    }

    $sql = "SELECT ";
    $sql .= "`user_id`,";
    $sql .= "u.`name`,";
    $sql .= "`username`,";
    $sql .= "`email`,";
    $sql .= "`password`,";
    $sql .= "u.`college_id`,";
    $sql .= "c.`name` AS `college_name` ";
    $sql .= "FROM `users` u ";
    $sql .= "INNER JOIN `college` c ";
    $sql .= "ON u.`college_id` = c.`college_id` ";
    $sql .= "WHERE u.`user_id` = :user_id";
    $pdo = db_connect();
    $stmt = $pdo->prepare($sql);
    $arr = [];
    $arr['user_id'] = $id;
    $stmt->execute($arr);
    return $stmt->fetch();
}

結論から言うと、college_name を users に入れる必要がありません。

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `username` varchar(30) NOT NULL,
  `email` varchar(128) NOT NULL,
  `password` varchar(255) NOT NULL,
  `college_id` int(11) NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `college` (
  `college_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`college_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/24 23:28

    全て、書き直していただき、ありがとうございました。
    お陰様でうまく実行することができました。
    本当にありがとうございます。

    キャンセル

  • 2017/06/24 23:30

    ソースを提供することが目的ではありませんから、しっかり処理や記述を見て学習してください。

    キャンセル

  • 2017/06/24 23:55

    オブジェクトで、こんなに多様にできるとは分かりませんでした。もう少し勉強します。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる