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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

PHP

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

Q&A

解決済

3回答

3424閲覧

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

metamonsan

総合スコア11

MySQL

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

PHP

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

0グッド

2クリップ

投稿2017/11/22 17:19

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

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

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

###発生している問題・エラーメッセージ
まず、投稿内容がデーターベースに書き込まれません。
また、そのためか、取得内容が表示されません。

###該当のソースコード
◎テーブルの作成…usersというテーブルを作りました。

PHP

1$sql='CREATE TABLE users( 2 3 id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 4 5 name VARCHAR(255), 6 7 pass VARCHAR(50), 8 9 userid VARCHAR(50) 10 11 )'; 12 13$result=$pdo->query($sql);

◎フォームのプログラム

php

1 2//php内部の部分のみ記載しています 3 4$pdo=new PDO($dsn,$user,$password); 5 6$sql="INSERT INTO users(name,pass,userid) VALUES(:name,:pass,uniqid())"; 7 8 $stmt=$pdo->prepare($sql); 9 10 $stmt->bindParam(":name",$name,PDO::PARAM_STR); 11 $stmt->bindParam(":pass",$pass,PDO::PARAM_STR); 12 13 $name=$_POST["name"]; 14 $pass=$_POST["pass"]; 15 16 $stmt->execute(); 17 18$sql="SELECT*FROM users order by id disc limit 1"; 19 20$result=$pdo->query($sql); 21 22//以下html部分 23 24<!DOCTYPE html> 25<html> 26<head> 27 28<meta charset="UTF-8"> 29 30</head> 31<body> 32 33<hr style="border:2px groove #000000;"> 34 35新規登録はこちらから!<br> 36<form method="post" action="このファイル"> 37名前:<input type="text" name="name"><br> 38パスワード(半角英数字8文字以上16文字以下):<input type="password" name="pass" size="16" minlength="8" maxlength="16"><br> 39<input type="submit" name="register" value="新規登録"> 40 41</form> 42 43<?php 44 45if(isset($_POST["register"])){ 46 47 echo "新規登録が完了しました!"; 48 echo "<br>"; 49 echo "ユーザーID:".$result["userid"]."<br>"; 50 echo "名前:".$result["name"]."<br>"; 51 echo "パスワード:".substr_replase($result["pass"],"*",0); 52 53}else{ 54 55} 56 57?> 58 59</body> 60</html> 61

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

全てのPHPの最初に

PHP

1ini_set('display_errors', "On"); 2ini_set('error_reporting', E_ALL); 3

と追記してください。

そのうえで、

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

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

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

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

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

投稿2017/11/22 18:34

編集2017/11/22 18:47
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

metamonsan

2017/11/23 10:43

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

2017/11/23 10:58

接続以外にも例外が発生するタイミングはあるので、SQLを実行する部分全てをtry catchしてください。 select文はm6uさんの回答にもありますが、タイプミスがあり確実にエラーが発生する状態なので、過去に作ったものがきちんと動くか、きちんと動くなら正確にコピー出来てるか再度確認してみてください
metamonsan

2017/11/23 11:28

select文のdisc→descというところでしょうか…?他にもいくつか誤字があったので修正してみました。 エラー内容を出してみようと思ったのですが、 新規登録ボタンを押す前→変数が格納されていない(当たり前だと思いますが…) 押した後→エラーなし でした。やはりINSERTできていないということなのだと思うのですが…
tanat

2017/11/23 11:51

正しく動くか分からないパーツの実行結果をもって他の結果の推測をしても無駄が大きいです。 繰り返しになってしまいますが、まずはinsertするだけ、selectして表示するだけの処理が確実に動くようにしてみてください。 (それでもうまく動かなければ、それぞれの部品を追記してみてください)
metamonsan

2017/11/24 00:58

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

0

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

投稿2017/11/23 11:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

metamonsan

2017/11/23 11:20

新規登録ボタンを押したら書き込み内容が変数内に入った状態でプログラムが実行されるのではないでしょうか…? そうなれば齟齬はでないはずだと思いますが…
退会済みユーザー

退会済みユーザー

2017/11/23 12:08

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

2017/11/24 00:52

$_POST[]のことを言っているつもりでした!
退会済みユーザー

退会済みユーザー

2017/11/24 01:32

$stmt->bindParam(":name",$name,PDO::PARAM_STR); $stmt->bindParam(":pass",$pass,PDO::PARAM_STR); $name=$_POST["name"]; $pass=$_POST["pass"]; ここおかしいでしょ? $name に値を代入する前に、bindParamしてしまっている。
guest

0

ベストアンサー

$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 03:54

編集2017/11/24 00:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

metamonsan

2017/11/23 10:40

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

退会済みユーザー

2017/11/24 00:32 編集

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

2017/11/24 00:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問