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

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

ただいまの
回答率

91.35%

  • PHP

    15175questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    4387questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHPとMySQLを用いたフォーム作成

解決済

回答 3

投稿 2017/11/23 02:19

  • 評価
  • クリップ 1
  • VIEW 131

metamonsan

score 3

前提・実現したいこと

PHPとMySQLを用いて簡易的な新規登録フォームを作成しています。
名前・パスワードの入力

データベース内テーブルへ保存、その際にユニークIDを生成

表示(パスワード部分はマスキングする)
という流れを実現しようとしています。

発生している問題・エラーメッセージ

まず、投稿内容がデーターベースに書き込まれません。
また、そのためか、取得内容が表示されません。

該当のソースコード

◎テーブルの作成…usersというテーブルを作りました。

$sql='CREATE TABLE users(

        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

        name VARCHAR(255),

        pass VARCHAR(50),

        userid VARCHAR(50)

        )';

$result=$pdo->query($sql);


◎フォームのプログラム

//php内部の部分のみ記載しています

$pdo=new PDO($dsn,$user,$password);

$sql="INSERT INTO users(name,pass,userid) VALUES(:name,:pass,uniqid())";

    $stmt=$pdo->prepare($sql);

    $stmt->bindParam(":name",$name,PDO::PARAM_STR);
    $stmt->bindParam(":pass",$pass,PDO::PARAM_STR);

    $name=$_POST["name"];
    $pass=$_POST["pass"];

    $stmt->execute();

$sql="SELECT*FROM users order by id disc limit 1";

$result=$pdo->query($sql);

//以下html部分

<!DOCTYPE html>
<html>
<head>

<meta charset="UTF-8">

</head>
<body>

<hr style="border:2px groove #000000;">

新規登録はこちらから!<br>
<form method="post" action="このファイル">
名前:<input type="text" name="name"><br>
パスワード(半角英数字8文字以上16文字以下):<input type="password" name="pass" size="16" minlength="8" maxlength="16"><br>
<input type="submit" name="register" value="新規登録">

</form>

<?php

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

    echo "新規登録が完了しました!";
    echo "<br>";
    echo "ユーザーID:".$result["userid"]."<br>";
    echo "名前:".$result["name"]."<br>";
    echo "パスワード:".substr_replase($result["pass"],"*",0);

}else{

}

?>

</body>
</html>

よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+4

まずはエラーを表示しないとどうにもならないので

全てのPHPの最初に

ini_set('display_errors', "On");
ini_set('error_reporting', E_ALL);


と追記してください。

そのうえで、

PHP・PDO、SQL実行時のエラーをExceptionで捕捉する

を参考にして、SQLに問題があった場合は例外を発生させ、補足してエラー内容を取得します。

今回のケースではこれでエラー内容がわかると思うので、対応できると思います。

あとは、一気にいろいろとしようとするのではなく、
INSERTするだけ
PDOでINSERTする(PHPでMySQLにデータ挿入)

SELECTするだけ(INSERTするデータが確実にある状態で)
PHPマニュアル
をそれぞれ別のスクリプトとして作って、動作が確認出来たところで合体させるという形で一つづつ進めるのが近道です。

投稿 2017/11/23 03:34

編集 2017/11/23 03:47

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 19:43

    一応php部分を
    try{

    }catch (PDOException $e){
    print('接続失敗:'.$e->getMessage());
    die();
    }
    で囲ってはいるのですが、データベース接続自体には問題がないらしく、特にエラーを吐かれることもないまま先に進んでしまいます。
    INSERT、SELECTのそれぞれは単品で以前作ったので、それを組み合わせてみたのですが…

    キャンセル

  • 2017/11/23 19:58

    接続以外にも例外が発生するタイミングはあるので、SQLを実行する部分全てをtry catchしてください。

    select文はm6uさんの回答にもありますが、タイプミスがあり確実にエラーが発生する状態なので、過去に作ったものがきちんと動くか、きちんと動くなら正確にコピー出来てるか再度確認してみてください

    キャンセル

  • 2017/11/23 20:28

    select文のdisc→descというところでしょうか…?他にもいくつか誤字があったので修正してみました。

    エラー内容を出してみようと思ったのですが、
    新規登録ボタンを押す前→変数が格納されていない(当たり前だと思いますが…)
    押した後→エラーなし
    でした。やはりINSERTできていないということなのだと思うのですが…

    キャンセル

  • 2017/11/23 20:51

    正しく動くか分からないパーツの実行結果をもって他の結果の推測をしても無駄が大きいです。


    繰り返しになってしまいますが、まずはinsertするだけ、selectして表示するだけの処理が確実に動くようにしてみてください。
    (それでもうまく動かなければ、それぞれの部品を追記してみてください)

    キャンセル

  • 2017/11/24 09:58

    別々に試してみることが大事なのですね。
    再度動作しているものを利用して、確認していきます。

    キャンセル

checkベストアンサー

+2

$sql="SELECT*FROM users order by id disc limit 1";
でなくて
$sql="SELECT * FROM users order by id desc limit 1";

もう一点、
if(isset($_POST["register"])){にて新規登録を判定しているようですが、
本来であればデータベースへのINSERT文が成功すれば新規登録完了のはずなので、
INSERT文のクエリーの結果を点検しての判断に変えるべきです。

その他実務レベルの不安点を上げたらキリがないですが、
useridの重複をチェックせずに登録するのは良いのでしょうか。
idはユニーク発番するよう工夫をこらしているようですが、
useridの重複について一考したほうが良いかと。

投稿 2017/11/23 12:54

編集 2017/11/24 09:27

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 19:40

    スペースを入れるということでしょうか?
    他に作ったプログラムでは、スペースなしでも動作したのですが…

    キャンセル

  • 2017/11/24 09:32 編集

    disc→descという大きな変化があります。tanatさんの回答にもありますが、ちゃんと動くところから確実に動く範囲を塗り広げるように仕組みを作っていくと良いと思います。SQL文一つ一つがちゃんと動くのを確認してから組み込むとか。

    キャンセル

  • 2017/11/24 09:56

    確かにひとつずつ試していくべきですね…。

    ぼく自身プログラミングにまったく触れたことがありませんので、まずは最低限「動作するもの」を進めていくことに注力しています(ユーザビリティも考えなければいけないのですが)。
    新規登録判定とIDについてはもう少し考えてみようと思います。

    キャンセル

+2

プログラムというものは上から順番に実行されます。
この大原則が守られていません。

投稿 2017/11/23 20:16

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 20:20

    新規登録ボタンを押したら書き込み内容が変数内に入った状態でプログラムが実行されるのではないでしょうか…?

    そうなれば齟齬はでないはずだと思いますが…

    キャンセル

  • 2017/11/23 21:08

    「書き込み内容が変数内に入った状態で」←どの変数のことを言いっているのでしょうか?

    キャンセル

  • 2017/11/24 09:52

    $_POST[]のことを言っているつもりでした!

    キャンセル

  • 2017/11/24 10:32

    $stmt->bindParam(":name",$name,PDO::PARAM_STR);
    $stmt->bindParam(":pass",$pass,PDO::PARAM_STR);

    $name=$_POST["name"];
    $pass=$_POST["pass"];

    ここおかしいでしょ?
    $name に値を代入する前に、bindParamしてしまっている。

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    会員制サイト:メールアドレスでログイン

    前提・実現したいこと Qiita:PHPとMySQLで新規登録とログインを実装する(PDO使用)を参考に、PHPで会員制サイトを作っています。 このサイトで作れるものでは、ID

  • 解決済

    MYSQLにバイナリで保存した画像を表示する方法

    お世話になります。 現在、ユーザーからinput="file"で取得したデータをMYSQLにバイナリで保存し、このデータを出力するコードを作成しています。MYSQLにはバイナリデ

  • 受付中

    PHPのFatal errorについて

    気づけばプロ並みPHP という書籍で勉強しているのですが Fatal error: Uncaught exception 'PDOException' with message

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    MySQLへの登録ができない

    フォームに入力したデータをデーバベースに登録したいのですが、「登録が完了しました」というメッセージが表示されているのですが、なぜかデータベースには登録されていません。もしかしたら、

  • 解決済

    会員登録ページの性別箇所がデータベースに登録されない

    性別以外の ユーザー名、パスワード等は、データベースに登録されるのですが、 性別のみ登録されません。 原因がわかりません。 ちなみに、 phpmyadminでカラムs

  • 解決済

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

    signup.php <?php session_start(); $name=$email=$username=$password=''; if (isset($

  • 解決済

    PHP MySQL の連携

    PHPのWEBサイトで名前、年齢を登録ボタンを押すとMYSQLのテーブルに格納させる設定方法を教えて下さい。(レンタルサーバで各ソフトはインストールしています。)  PHPとMYS

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

  • PHP

    15175questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    4387questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。