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

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

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

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

Q&A

3回答

335閲覧

ユーザー登録機能の実装

Taka787

総合スコア23

PHP

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

0グッド

2クリップ

投稿2019/02/14 03:34

ユーザー登録の際、idとpasswordを入力してもらい、それをkeijibanテーブルに保存して、保存したものをSELECTで表示させる機能の実装を行っておりますが、結果は表示されず困っております。
度々申し訳ございませんが、対処法をご教授いただければ幸いです。

php

1 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>簡易掲示板</title> 9</head> 10 11 12<body> 13 14 <h1>ユーザー登録</h1> 15 <form method="post" action="DB.php"> 16 Id:<input type="text" name="ID" value=""><br> 17 Password:<input type="text" name="NAME" value=""> 18 <input type="submit" name="regist" value="Post"> 19 </form> 20 21 <?php 22 $host = '*******'; 23 $dbname = '***********'; 24 $dbuser = '*************'; 25 $dbpassword = '*************'; 26 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8","$dbuser","$dbpassword"); 27 28 #データベースへの登録 29 if( isset($_POST['regist']) ){ 30 $id = $_POST['ID']; 31 $name = $_POST['NAME']; 32 $sql = "INSERT INTO keijiban (id, name) VALUES ('$id', '$name')"; 33 $res = $pdo->query($sql); 34 35 #テーブル内容の表示 36 $sql = "SELECT * FROM keijiban ORDER BY id DESC"; 37 $stmt = $pdo->query($sql); 38 foreach ($stmt as $row) { 39 echo $row['ID'].' '.$row['NAME']; 40 echo '<br>'; 41 } 42} 43 44 #リロード時の二重投稿を防止 45 if($_SERVER['REQUEST_METHOD'] === 'POST') { 46 header('Location:DB.php', true, 303); 47 } 48 #終了 49 $stmt = null; 50 $pdo = null; 51?> 52</body> 53</html> 54

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

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

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

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

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

m.ts10806

2019/02/14 03:48

これだと「前の質問の回答見直して一通り対応してきてください」だけの回答になりますけど…。
Taka787

2019/02/14 03:53

すみません、項目を増やしたテーブルを新規に作り、そちらにデータを入れようとしたら、うまくいかなくなってしまいました。
m.ts10806

2019/02/14 03:59

追加したり変更したなら整合性をとればいいだけの話と思います。 その話ではなく、PHPのコードの組み方の問題です。 前の質問とコードの作り方が変わってません。「解決済み」としたいならなるべく回答内容をきちんと理解した上でしていただきたいです。 私もPHPならある程度、アドバイスできるところも多いかなと思って回答には力を入れてはいますが、 あまり理解されないまま次々と質問されてしまうと「分かってないのに解決済みにしたの?」と不信感もつのります(たぶん見ている人は同じようなことを感じています) 分からないのでしたらその場で聞いてください。解決済みとしてしまっては見返すことはほとんどなくなりますよ。
yoorwm

2019/02/14 04:03

以前、掲示板で質問しまくっていた人に、10年経っても同じ質問しているような人が居ましたがそんな感じですね。 学習の仕方から考え直した方がいいですよ。
Taka787

2019/02/14 04:04

ご指摘ありがとうございます。何度もスミマセン。しっかり解決したうえで解決済みボタンを押させていただきます。今、他の方からもいただいた意見を一つずつ検証している最中でございます。また、不明な点があった場合には質問させていただきます。宜しくお願い致します。
m.ts10806

2019/02/14 05:08

「解決」は「質問の解決」となってしまうと「理解した」という意味にはなりません。 私のように「今後直面しうる問題も含めた上でのアドバイス」を蛇足的に書く回答者も少なくないです。 となると「質問・問題の解決」だけではなく「回答内容をきちんと理解できたか」を「解決基準」としないと せっかく(ある程度の労力や時間をかけて)書かれたコメントが全て無駄になります。 回答者であるという立場から、今後おきうるであろう問題も経験してきているわけですから、 そこをきちんと避けられるようなアドバイスが書かれているのであれば、理解しようと努めてください。 本来は 理解した=解決した なので。 https://teratail.com/help/question-tips#questionTips4-2 >多くの回答ユーザーが、~~ のところを参照。
cerfweb

2019/02/18 13:20

ご質問自体には関係ありませんが、パスワードは<input type="text" ...>ではなく<input type="password" ...>とした方がいいでしょう。また、データベースにパスワードを保存する場合は、必ずpassword_hash()などでハッシュ処理をしてからにしましょう。そうでないと、データベースが攻撃を受けたときにパスワードが盗まれてしまうなど、セキュリティ上大変危険です。
guest

回答3

0

header('Location:DB.php', true, 303);
と移動しているので結果は表示されません
また

foreach ($stmt as $row) { echo $row['ID'].' '.$row['NAME']; echo '<br>'; }

とID NAMEとしているようですが実際のテーブル構造は
id, name
なので表示されません

投稿2019/02/14 03:56

date

総合スコア1820

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

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

m.ts10806

2019/02/14 05:20

あとheader()あるのにその前でechoで画面出力してるところもNGですね。
Taka787

2019/02/14 14:15

修正してみたところ、正常に動作しました。ありがとうございます。
guest

0

直接的な原因は既に回答にあるとおり。
「POSTのときにしかSELECT実行していない」から。
そのPOSTのときにリダイレクト入れてるのでSELECTは永遠に実行されません。
インデントきちんとそろえると分かりやすいですね。(前の質問の回答にヒントとなるキーワードはたくさんあったはずですが)

Eclipseのコードフォーマット機能使った結果

php

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6<meta http-equiv="X-UA-Compatible" content="ie=edge"> 7<title>簡易掲示板</title> 8</head> 9 10 11<body> 12 13 <h1>ユーザー登録</h1> 14 <form method="post" action="DB.php"> 15 Id:<input type="text" name="ID" value=""><br> Password:<input 16 type="text" name="NAME" value=""> <input type="submit" name="regist" 17 value="Post"> 18 </form> 19 20 <?php 21 $host = '*******'; 22 $dbname = '***********'; 23 $dbuser = '*************'; 24 $dbpassword = '*************'; 25 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", "$dbuser", "$dbpassword"); 26 27 // データベースへの登録 28 if (isset($_POST['regist'])) { 29 $id = $_POST['ID']; 30 $name = $_POST['NAME']; 31 $sql = "INSERT INTO keijiban (id, name) VALUES ('$id', '$name')"; 32 $res = $pdo->query($sql); 33 34 // テーブル内容の表示 35 // mts10806 ここでSELECT実行してるということはいつ実行される? 36 $sql = "SELECT * FROM keijiban ORDER BY id DESC"; 37 $stmt = $pdo->query($sql); 38 foreach ($stmt as $row) { 39 echo $row['ID'] . ' ' . $row['NAME']; 40 echo '<br>'; 41 } 42 } 43 44 // リロード時の二重投稿を防止 45 // mts10806 POSTだったらリダイレクト。SELECT結果は意味ない。というかheader()の前に出力があることになるのでNG 46 // http://php.net/manual/ja/function.header.php 47 // > 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。 48 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 49 header('Location:DB.php', true, 303); 50 } 51 // 終了 52 $stmt = null; 53 $pdo = null; 54 ?> 55</body> 56</html>

項目を増やしたテーブルを新規に作り

項目の設定を加味して整合性をとれば良いです。
Not Nullにしてるならそこは「必須である」なのでinsertに含まれてなかったらエラーになります。
エラーを捕捉するよな仕組みになってないのでそこに気づけません。
前の前の質問の回答参照


登録処理と表示処理を一緒の画面にしたい場合、登録処理と取得処理を同じ中でやっているのはNG
あと、「POST送信する」ということは送信された内容を以て最初からプログラムを読み出すことになるので、
順序的にはPHPを先に書くべき。

php

1<?php 2$host = '*******'; 3$dbname = '***********'; 4$dbuser = '*************'; 5$dbpassword = '*************'; 6$pdo = null; 7try{ 8 $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", "$dbuser", "$dbpassword"); 9}catch(PDOException $e){ 10 var_dump($e); 11 die(); 12} 13 14// データベースへの登録 15//if (isset($_POST['regist'])) { //mts10806 だから、これは良くないコーディングですって 16if ($_SERVER['REQUEST_METHOD'] === 'POST') { 17 $id = $_POST['ID']; 18 $name = $_POST['NAME']; 19 $sql = "INSERT INTO keijiban (id, name) VALUES ('$id', '$name')"; 20 //$res = $pdo->query($sql); 21 //mts10806$res使ってない。それなら下記で。いずれにしても「絶対成功する前提」のコーディングはNG 22 if($pdo->query($sql)){ 23 header('Location:DB.php', true, 303); 24 }else{ 25 die("登録失敗");//mts10806 一応入れておく 26 } 27 /*mts10806 28 本来はこのようにすべき 29$stmt = null; 30try{ 31 $id=filter_input(INPUT_POST,'ID'); 32 $name=filter_input(INPUT_POST,'NAME'); //SQLに入れる前にバリデーションは必須。今回は省略 33 $sql = "INSERT INTO keijiban (id, name) VALUES (:id,:name)"; 34 $stmt = $pdo->prepare($sql); 35 $stmt->bindValue(":id",$id); 36 $stmt->bindValue(":name",$name); 37 $stmt->execute([$id,$name]); 38}catch(PDOException $e){ 39 var_dump($e); 40 $pdo = null; 41 die(); 42} finally { 43 $stmt = null; 44} 45 * 46 */ 47} 48// テーブル内容の表示 49$sql = "SELECT * FROM keijiban ORDER BY id DESC"; 50$stmt = $pdo->query($sql); 51$list = ""; 52foreach ($stmt as $row) { 53 $list .= $row['id'] . ' ' . $row['name']; //mts10806 添え字は大文字小文字を大別する。揃えること 54 $list .= '<br>'; 55} 56//mts10806 ここでもtry-catchあると丁寧 57// 終了 58?> 59<!DOCTYPE html> 60<html lang="en"> 61<head> 62<meta charset="UTF-8"> 63<meta name="viewport" content="width=device-width, initial-scale=1.0"> 64<meta http-equiv="X-UA-Compatible" content="ie=edge"> 65<title>簡易掲示板</title> 66</head> 67 68 69<body> 70 71 <h1>ユーザー登録</h1> 72 <form method="post" action="DB.php"> 73 Id:<input type="text" name="ID" value=""><br> Password:<input 74 type="text" name="NAME" value=""> <input type="submit" name="regist" 75 value="Post"> 76 </form> 77 <?php echo $list;?> 78</body> 79</html>

あとは前の質問の回答で書いたIDEの導入は必須。インデントも「フォーマット」機能があったりで一発でいい感じに揃う。
ある程度今回含めて書きましたが、その前の前の質問の回答で書いた簡易コードレビューの指摘コメントは熟読のこと。

投稿2019/02/14 04:58

編集2019/02/14 05:19
m.ts10806

総合スコア80850

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

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

0

テーブルの状態にもよりそうですね

SQL

1create table keijiban(id int unique,name varchar(100));

として

PHP

1<h1>ユーザー登録</h1> 2<form method="post"> 3Id:<input type="text" name="ID" value=""><br> 4Password:<input type="text" name="NAME" value=""> 5<input type="submit" name="regist" value="Post"> 6</form> 7 8<?php 9$regist=filter_input(INPUT_POST,'regist'); 10$id=filter_input(INPUT_POST,'ID'); 11$name=filter_input(INPUT_POST,'NAME'); 12if(!is_null($regist) and $id!=="" and $name!==""){ 13 try{ 14 $pdo = new PDO($dsn, $user,$password); 15 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 16 $sql = "INSERT IGNORE INTO keijiban (id, name) VALUES (?,?)"; 17 $stmt = $pdo->prepare($sql); 18 $stmt->execute([$id,$name]); 19 $sql = "SELECT * FROM keijiban ORDER BY id DESC"; 20 $stmt = $pdo->query($sql); 21 $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 22 print_r($rows); 23 }catch(PDOException $e){ 24 die($e->getMessage()); 25 } 26}

IDとNAMEという名前でuserとpasswordを管理するのは微妙です
ちなみにpasswordはきちんとハッシュして管理しないとあとで
大変なことになりますので注意してください
(テスト段階では仕方ないので平文パスワードとします)

投稿2019/02/14 03:51

yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問