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

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

ただいまの
回答率

87.78%

データベースに登録データが反映されません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,992

score 65

webサービスのユーザー登録画面を作成中ですが、
登録フォームから各項目の入力を行ってもデータベースに反映されません。
この原因をご教示頂けませんでしょうか?
2つ目の「check.php」に原因があるように思われます。

・データベース
 phpmyadminをしております。下記添付のような状態です。
イメージ説明
コードは下記4つです。
1.index.php
コード
  <?php
session_start();

if (!empty($_POST)) {
    //エラー項目の確認
    if ($_POST['name'] == '') {
        $error['name'] = 'blank';
    }
    if ($_POST['mail'] == '') {
        $error['mail'] = 'blank';
    }
    if (strlen($_POST['pass']) < 4) {
        $error['pass'] = 'length';
    }
    if ($_POST['pass'] == '') {
        $error['pass'] = 'blank';
    }

    if (empty($error)) {
        $_SESSION['ドットインストール'] = $_POST;
        header('Location: check.php');
        exit();
    }
}
// 書き直し
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'rewrite') {
    $_POST = $_SESSION['ドットインストール'];
    $error['rewrite'] = true;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>新規会員登録</title>
    </head>
    <body>
        <p>必要事項をご記入ください</p>
        <form action="" method="post" enctype="multipart/form-data">
            <dl>
                <dt>ユーザー名<font color="red"> 必須</font></dt>
                <dd>
                    <input type="text" name="name" size="35" maxlength="255" value="<?php
                    if (isset($error['name'])) {
                        echo htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
                    }
                    ?>">
                           <?php if (isset($error['name']) && $error['name'] == 'blank'): ?>
                        <p><font color="red">* ユーザー名を入力してください</font></p>
                    <?php endif; ?>
                </dd>
                <dt>メールアドレス<font color="red"> 必須</font></dt>
                <dd>
                    <input type="text" name="mail" size="35" maxlength="255"
                           value="<?php
                           if (isset($error['mail'])) {
                               echo htmlspecialchars($_POST['mail'], ENT_QUOTES, 'UTF-8');
                           }
                           ?>">
                           <?php if (isset($error['mail']) && $error['mail'] == 'blank'): ?>
                        <p><font color="red">* メールアドレスを入力してください</font></p>
                    <?php endif; ?>
                    <?php if (isset($error['mail']) && $error['mail'] == 'duplicate'): ?>
                        <p><font color="red">* 指定されたメールアドレスは既に登録されています</font></p><?php endif; ?>
                </dd>
                <dt>パスワード<font color="red"> 必須</font></dt>
                <dd>
                    <input type="password" name="pass" size="10" maxlength="20"
                           value="<?php
                           if (isset($error['pass'])) {
                               echo htmlspecialchars($_POST['pass'], ENT_QUOTES, 'UTF-8');
                           }
                           ?>">
                           <?php if (isset($error['pass']) && $error['pass'] == 'blank'): ?>
                        <p><font color="red">* パスワードを入力してください</font></p>
                    <?php endif; ?>
                    <?php if (isset($error['pass']) && $error['pass'] == 'length'): ?>
                        <p><font color="red">* パスワードは4文字以上で入力してください</font></p>
                    <?php endif; ?>
                </dd>
            </dl>
            <div><input type="submit" value="入力内容を確認"></div>
        </form>
    </body>
</html>

2.check.php
コード
<?php
session_start();
require('dbconnect.php');

if(!isset($_SESSION['ドットインストール'])){
  header('Location: index.php');
  exit();
}

if(!empty($_POST)){
    //登録処理をする
    $sql = sprintf('INSERT INTO users SET name="", mail="%s", pass="%s"',
        mysqli_real_escape_string($db, $_SESSION['ドットインストール']['name']),
        mysqli_real_escape_string($db, $_SESSION['ドットインストール']['mail']),
        mysqli_real_escape_string($db, sha1($_SESSION['ドットインストール']['pass']))
    );
    mysqli_query($db, $sql) or die(mysqli_error($db));
    unset($_SESSION['ドットインストール']);

    header('Location: thanks.php');
    exit();
}
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>新規会員登録</title>
</head>
<body>
  <form action="" method="post">
  <dl>
  <dt>ユーザー名</dt>
  <dd>
    <?php echo htmlspecialchars($_SESSION['ドットインストール']['name'], ENT_QUOTES, 'UTF-8'); ?>
  </dd>
  <dt>メールアドレス</dt>
  <dd>
    <?php echo htmlspecialchars($_SESSION['ドットインストール']['mail'], ENT_QUOTES, 'UTF-8'); ?>
  </dd>
  <dt>パスワード</dt>
  <dd>
    【表示されません】
  </dd>
</dl>
<div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a>
<input type="submit" value="登録する"></div>
</form>
  
  
</body>
</html>

3 thanks.php
コード
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>新規会員登録</title>
</head>
<body>
  <p>ユーザー登録が完了しました</p>
  <p><a href="../">ログインする</a></p>
</body>
</html>


4 dbconnect.php
コード
<?php
    $db = mysqli_connect('localhost', 'root', '', 'Loginpage') or die(mysqli_connect_error());
    mysqli_set_charset($db, 'utf8');
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

少し厳しい意見になるかと存じますが、
デバックはされておられるでしょうか?

データベースにデータが登録されない要因は大きく2つございます。

1.パラメータの受け渡し失敗要因
check.php でINSERT のSQL文を流していますが、実際に流しているSQL文をvar_dump等で表示し確認されておられるでしょうか?

たとえばカンマが2つ連続していたり、文法エラーとなるような要素は無いでしょうか?
また、そもそもその部分まで処理が到達してるでしょうか?


2.データベースのパラメータエラー要因
データベースコネクト時、データインサート時に、MYSQLからのエラーコードを確認しておられるでしょうか?

$sts = mysqli_connet();
$sts = mysqli_query();
という風に、処理結果をとり、$sts != true の場合、何かしらのエラーが発生しています。

var_dump(mysqli_error($db));
で、エラーメッセージを表示させることができるので、何エラーが発生しているかを確認されてはいかがでしょう。


また、mysqli_select_dbまたは、mysqli_connectで、データベース名の選択がなされていないのも気になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

いろいろとおかしなところがあります。
動かしていないから詳細は分かりませんが、

① セッションがなかったら index.php に飛んでいる
そもそもセッションはどこかでセットしているかもしれませんが、上記ソースでは読み取れないです
check.php が、ユーザ登録の最初の画面でしょうか?

② だとすると、check.php のアクションが設定されていない
<form action="" method="post">  アクションが指定されていないので呼び出せません。
アクションはちゃんとセットしましょう

③ dbconnect.php でパスワードがセットされていない
構文の利用方法はあってますか?
mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

そもそもですが、、、
商品一覧の index.php は質問に不要なソースですし、
ユーザ登録する最初のページ(HTML)も記載していないです。
(HTMLならセッションがセットされてないので①に該当して、そもそも表示されないはずです)

上記ソースにはいろんな機能が詰まってます。
・フォームのデータ授受(HTML→PHP)
・データ授受の方法(リンクのGETとデータのPOST)
・文字コード変換
・DB接続
・DB登録
・外部ファイル読み込み(require)
・セッション管理

まずは「ユーザ登録」機能に絞り、HTMLからPHPへのページ遷移・データ授受と
順にソースを作成していった方が良いです。

ガムバッテください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/19 23:56

    申し訳ございません。
    「index.php」の内容が異なっておりましたので、訂正させて頂きました。
    こちらの内容では如何でしょうか?
    もしお手すきでしたら、再度ご確認頂けますと幸いです。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る