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

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

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

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

PHP

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

Q&A

解決済

2回答

240閲覧

ユーザー登録機能の追加

Taka787

総合スコア23

MySQL

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

PHP

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

0グッド

1クリップ

投稿2019/02/13 05:49

(1)ユーザー登録機能を追加する
登録フォームを用意する。項目はIDとパスワード。
IDとパスワードをユーザー情報としてデータベースに保存する
保存したユーザー情報をブラウザ表示する

以上のものを作りたいと思ってコードを書き、実行してみましたが、testテーブルの中身が表示されると思ったのに何もブラウザには表示されませんでした。
原因を探りましたが見つからず困っております。
ご指摘いただけたら幸いです。

PHP

1<!DOCTYPE HTML> 2<html lang="ja"> 3 4<head> 5</head> 6 7<body> 8 <form method="post" action="DB.php"> 9 <input type="text" name="id" value=""><br> 10 <input type="text" name="name" value=""> 11 <input type="submit" name="regist" value="Post"> 12 </form> 13</body> 14 15 16<?php 17 18 $host = '*******'; 19 $dbname = '********'; 20 $dbuser = '********'; 21 $dbpassword = '*********'; 22 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 23 24 #データベースへの登録 25 if( isset($_POST['regist']) ){ 26 $name = $_POST['id']; 27 $comment = $_POST['name']; 28 $sql = "INSERT INTO test (id, name) VALUES ('$name', '$comment')"; 29 $res = $pdo->query($sql); 30 } 31 32 #テーブル内容の表示 33 $sql = "SELECT * FROM test ORDER BY id DESC"; 34 $stmt = $pdo->query($sql); 35 foreach ($stmt as $row) { 36 echo $row['id'].' '.$row['name']; 37 echo '<br>'; 38 } 39 #リロード時の二重投稿を防止 40 if($_SERVER['REQUEST_METHOD'] === 'POST') { 41 header('Location:DB.php', true, 303); 42 } 43 #終了 44 $stmt = null; 45 $pdo = null; 46?> 47 48</html>

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

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

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

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

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

m.ts10806

2019/02/13 05:54

INSERT文を確認してみますと idに$name nameに$comment が入ってますが、これは間違いでは? idの定義は何でしょうか?(AUTO INCREMENTとかテーブル定義の件です)
guest

回答2

0

根本的にデータすら入ってない状況ならば、上の人の言う通り型が合っていない可能性がありますね。

また、文字列に変数を埋め込む場合は{$data}${data}と括っておいた方が可読性が上がります。SQL文も文字列ですので。

投稿2019/02/13 07:07

編集2019/02/13 07:43
FKM

総合スコア3608

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

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

Taka787

2019/02/13 07:28

適切なアドバイスありがとうございました。今後は読みやすいコードの記述を心掛けたいと思います。
guest

0

ベストアンサー

たぶんINSERT文でエラーになっているはずです。

INSERT INTO test (id, name) VALUES ('$name', '$comment')

idって大体は数値型なので。そこに文字列型が入っているのでエラーになるはずですね。
でも質問者さんのコードはDBのエラーを捕捉するように作られていません。
また、コードも結構組み方が雑になっているように思います。

ひとまず原因の1つとして。

と思ったら違いましたね。
変数名がかなり紛らわしい・・。
そこでごっちゃになっている可能性はあります。

--

先に現在のコードに対する指摘
// mts10806でコード内検索してください。

php

1<!DOCTYPE HTML> 2<html lang="ja"> 3 4<head> 5</head> 6 7<body> 8 <form method="post" action="DB.php"> 9 <input type="text" name="id" value=""><br> 10 <input type="text" name="name" value=""> 11 <input type="submit" name="regist" value="Post"> 12 </form> 13</body> <!-- // mts10806 bodyしめた後にHTML出力書くのは文法的にNG(でるのはでるが、だからっていいわけではない) --> 14 15 16<?php 17//mts10806 要件は[IDとパスワードをユーザー情報としてデータベースに保存する] 18//なのにidとnameでは整合性が取れない 19 $host = '*******'; 20 $dbname = '********'; 21 $dbuser = '********'; 22 $dbpassword = '*********'; 23 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 24 // mts10806 変数しかないなら別に""で囲う必要なし。 25 //逆に変数以外の文字列があるなら{}で囲うかいったん切って文字列連結するか工夫すべき $nameという変数を定義して"$namea"と書いてあると$nameという変数として認識されません。 26 27 #データベースへの登録 28 if( isset($_POST['regist']) ){// mts10806 POSTされたときしか登録処理いかないんだったらこうではなく最後の方に書いてあるREQUEST_METHODの判断でいい 29 $name = $_POST['id'];// mts10806 idを取り出すのに$name? 30 $comment = $_POST['name'];;// mts10806 idを取り出すのに$comment? 紛らわしいのできちんと意味が合ったネーミングをしましょう 31 // mts10806 DBの型とか文字数決まっているのだったらここできちんと入力チェック(バリデーション)行っておかないと容赦なくDBエラーになりますし後述の通りDBエラーになってもそのエラーが拾えません。 32 $sql = "INSERT INTO test (id, name) VALUES ('$name', '$comment')"; //pdo使っているならプリペアドステートメント使ってSQLインジェクション対策まですべき 33 $res = $pdo->query($sql);// mts10806 拾った$resを使ってない。queryが絶対成功する前提で作っているので成功したかどうかわからない。 34 // mts10806 「DBに何か異常が起きたとき」の対策でトランザクション→コミットorロールバック は入れるべき 35 // mts10806 というかIDとパスワードじゃないの? 36 } 37 38 #テーブル内容の表示 39 $sql = "SELECT * FROM test ORDER BY id DESC"; 40 $stmt = $pdo->query($sql); // mts10806 個人的にはfetchAllのPDO::FETCH_COLUMNでざっと取ったほうが直感的 41 foreach ($stmt as $row) { 42 echo $row['id'].' '.$row['name'];// mts10806 HTMLエスケープ入れましょう 43 echo '<br>'; 44 } 45 #リロード時の二重投稿を防止 46 if($_SERVER['REQUEST_METHOD'] === 'POST') {// mts10806 「二重投稿」の対応と言うのなら投稿処理も中に入れましょう。「表示処理」とは区画が違います。 47 header('Location:DB.php', true, 303); 48 } 49 #終了 50 $stmt = null; 51 $pdo = null; 52?> 53 54</html> 55

投稿2019/02/13 05:58

編集2019/02/13 07:27
m.ts10806

総合スコア80765

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

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

m.ts10806

2019/02/13 07:04

完全に要件変わってませんか。・・ testというテーブルの話ではなかったのでしょうか。実態はどうなってますか? 質問本文修正してください。
m.ts10806

2019/02/13 07:05

userテーブル作っておいてtestテーブルに対してinsertしてるのなら存在しないテーブルのinsertできないのは当然ですし。
m.ts10806

2019/02/13 07:08

かなり紛らわしいですね。やりたいことと実態が伴っていないので混乱のもとになっています。サンプルコードはやめにします(質問者のためにならないので) 現在のコードに対する指摘コメントつけたコードのみ置きます。
Taka787

2019/02/13 07:13

大変申し訳ございませんでした。一度質問本文を訂正します。サンプルコードまで準備していただいたのに申し訳ございませんでした。
m.ts10806

2019/02/13 07:16

サンプルコードについてはまだ作っていません(調整はしていましたが、要件かわったっぽいので) まず「準備したテーブルとコードで利用しているテーブルが違う」という現状があるので、そこはそろえたほうがいいですね。
Taka787

2019/02/13 07:19

承知いたしました。そろえてみます。
Taka787

2019/02/13 07:26

そろえてみたら無事表示されました。適切なアドバイスありがとうございました。 そして質問内容が紛らわしく申し訳ございませんでした。以後気をつけます。
m.ts10806

2019/02/13 07:30

解決されたようで何よりです。 用意したものをきちんと使わないといけませんね。 ただ、コメントでたくさん追記したように作りが非常によろしくないです。 「必ず正常に通るのが前提のプログラム」はかなり危険です。 入力する人が何を入力するかはプログラム側は知らないわけですから、 悪意なくてもDBに入らない情報を入力してしまったらどうなるでしょう? 悪意がある人がDBを削除するようなコードを入力した場合、どうなるでしょう? そこも加味した作りを心がけてください。 参考になる記事:https://qiita.com/mpyw/items/b00b72c5c95aac573b71
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問