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

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

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

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

PHP

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

Q&A

解決済

2回答

970閲覧

データベースに情報が入力されない

freemac

総合スコア29

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/02/24 04:56

編集2020/02/24 06:10

正常に情報をデータベースに入力したい

phpファイルでの作業中に、データベースのテーブルの中のレコードが作られないという状況になりました。
表記法の誤った点をご指摘いただきたいです。

該当のソースコード

check.php

PHP

1<?php 2session_start(); 3require('dbconnect.php'); 4if(!isset($_SESSION['join'])){ 5header('Location: index.php'); 6exit(); 7} 8if(!empty($_POST)){ 9 10 $statement = $db->prepare('INSERT INTO members SET name=?, email 11 =?, password = ?, picture=?, created=NOW()'); 12 $statement->execute(array 13 ($_SESSION['join']['name'], 14 $_SESSION['join']['email'], 15 sha1($_SESSION['join']['password']), 16 $_SESSION['join']['image'] 17)); 18 19 header('Location: thanks.php'); 20 exit(); 21} 22?> 23<!DOCTYPE html> 24<html lang="ja"> 25<head> 26 <meta charset="UTF-8"> 27 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 28 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 29 <title>会員登録</title> 30 31 <link rel="stylesheet" href="../style.css" /> 32</head> 33<body> 34<div id="wrap"> 35<div id="head"> 36<h1>会員登録</h1> 37</div> 38 39<div id="content"> 40<p>記入した内容を確認して、「登録する」ボタンをクリックしてください</p> 41<form action="" method="post"> 42 <input type="hidden" name="action" value="submit" /> 43 <dl> 44 <dt>ニックネーム</dt> 45 <dd> 46 <?php print(htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES));?> 47 </dd> 48 <dt>メールアドレス</dt> 49 <dd> 50 <?php print(htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES));?> 51 </dd> 52 <dt>パスワード</dt> 53 <dd> 54 【表示されません】 55 </dd> 56 <dt>写真など</dt> 57 <dd>] 58 <?php if($_SESSION['join']['image'] !== ''):?> 59 <img src = "../member_picture/<?php print(htmlspecialchars($_SESSION['join']['image'],ENT_QUOTES)); ?>" 60 <?php endif;?> 61 </dd> 62 </dl> 63 <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div> 64</form> 65</div> 66 67</div> 68</body> 69</html>

index.php

php

1<?php 2session_start(); 3if(!empty($_POST)){ 4 if($_POST['name'] === '' ){ 5 $error['name'] = 'blank'; 6 } 7 if($_POST['email'] === '' ){ 8 $error['email'] = 'blank'; 9 } 10 if(strlen($_POST['password']) < 4){ 11 $error['password'] = 'length'; 12 } 13 if($_POST['password'] === '' ){ 14 $error['password'] = 'blank'; 15 } 16 $filename = $_FILES['image']['name']; 17 if(!empty($filename)){ 18 $ext = substr($filename,-3); 19 if($ext != 'png' && $ext != 'jpeg' && $ext != 'gif'){ 20 $error['image'] = 'type'; 21 } 22 } 23 if(empty($error)){ 24 // ファイル名を指定 25 $image = date('YmdHis') . $_FILES['image']['name']; 26 move_uploaded_file($_FILES['image']['tmp_name'],"../member_picture/" . $image); 27 $_SESSION['join'] = $_POST; 28 $_SESSION['join']['image'] = $image; 29 header('Location: check.php'); 30 exit(); 31 } 32} 33if($_REQUEST['action'] == 'rewrite'){ 34 $_POST = $_SESSION['join']; 35} 36?> 37<!DOCTYPE html> 38<html lang="ja"> 39<head> 40 <meta charset="UTF-8"> 41 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 42 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 43 <title>会員登録</title> 44 45 <link rel="stylesheet" href="../style.css" /> 46</head> 47<body> 48<div id="wrap"> 49<div id="head"> 50<h1>会員登録</h1> 51</div> 52 53<div id="content"> 54<p>次のフォームに必要事項をご記入ください。</p> 55<form action="" method="post" enctype="multipart/form-data"> 56<!-- foem action=""であっても自身のリンクにサーバーを介して通信している --> 57 <dl> 58 <dt>ニックネーム<span class="required">必須</span></dt> 59 <dd> 60 <input type="text" name="name" size="35" maxlength="255" value="<?php print(htmlspecialchars($_POST['name'], ENT_QUOTES));?>" /> 61 <?php if ($error['name'] === 'blank'): ?> 62 <p class= "error">ニックネームを入力してください</p> 63 <?php endif;?> 64 </dd> 65 <dt>メールアドレス<span class="required">必須</span></dt> 66 <dd> 67 <input type="text" name="email" size="35" maxlength="255" value="" /> 68 <?php if ($error['email'] === 'blank'): ?> 69 <p class= "error">メールアドレスを入力してください</p> 70 <?php endif;?> 71 </dd> 72 <dt>パスワード<span class="required">必須</span></dt> 73 <dd> 74 <input type="password" name="password" size="10" maxlength="20" value="" /> 75 <?php if ($error['password'] === 'length'): ?> 76 <p class= "error">4文字以上で入力してください</p> 77 <?php endif;?> 78 <?php if ($error['password'] === 'blank'): ?> 79 <p class= "error">パスワードを入力してください</p> 80 <?php endif;?> 81 </dd> 82 <dt>写真など</dt> 83 <dd> 84 <input type="file" name="image" size="35" value="test" /> 85 <?php if($error['image'] === 'type'):?> 86 <p class = 'error'>末尾がpng,jpeg,gifのファイルをアップロードしてください</p> 87 <?php endif;?> 88 </dd> 89 </dl> 90 <div><input type="submit" value="入力内容を確認する" /></div> 91</form> 92</div> 93</body> 94</html> 95

dbconnect.php

PHP

1<?php 2try{ 3 $db = new PDO('mysql:dbname = mini_bbs;host=127.0.0.1;charset=utf8', 'root', 'root' ); 4}catch(PDOException $e){ 5print('db接続エラー' . $e->getMessage()); 6} 7 8 9?>

試したこと

実際にthanks.phpへのページ遷移は成功、データベース接続も成功していることから、コード内に至らぬ点があると判断しています。くまなく確認していますが、依然として状況は変わらぬままです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/24 05:29

セッション変数にパスワード文字列をまさか生で置いていたりしないよね? しかもsha1()ですかーpassword_hash()じゃないのかー。
m.ts10806

2020/02/24 05:31

また「気づけばプロ並み」ですかねえ。
freemac

2020/02/24 05:38

password_hash()も次回から使ってみようと思います。生でおくと危険性がでると認識しているので、 勉強の末に何かをデプロイするときは気をつけようと思います。質問外のところまで指摘してくださりありがとうございます。
m.ts10806

2020/02/24 06:00

それぞれのコードのファイル名を明記してください。 どう見ても二つ目が使われる構造にはなってませんし、1つ目もsession_start()されてないからセッション使えるわけがないのです。 $dbもこのコードのままだと未定義ですし、本当にこのコードで全てとしたら何もかも、動くようになってないわけで。 そうでないなら他者が再現確認できるコードになっていないわけです。
freemac

2020/02/24 06:11

繰り返し申し訳ございません。追記しました。
kyoya0819

2020/02/24 07:52

まずは、インデントを整えることから始めましょう。
kyoya0819

2020/02/24 08:00

最近の書籍は「動けばよし!」的な思想が当たり前なのかなぁ?
m.ts10806

2020/02/25 01:17

動かないものありますけどね(PHP5のコードなのに作った環境がPHP7で、とか)
guest

回答2

0

$_SESSION から値を入れようとしているのに、
$_POST をチェックしている意図はなんですか?

投稿2020/02/24 05:00

編集2020/02/24 05:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kei344

2020/02/24 05:30

回答をコピー&ペースしていませんか?(いつもの teratail のバグ)
退会済みユーザー

退会済みユーザー

2020/02/24 05:32

このバグなんとかならないものですかね~
freemac

2020/02/24 05:39

すみません。追記しました。
退会済みユーザー

退会済みユーザー

2020/02/24 05:41

質問ページを表示した後、かならず再読み込みもやるとマシになるような(違ったらごめんね
退会済みユーザー

退会済みユーザー

2020/02/24 05:48

> うまく情報をデータベースに入力できなく 詳しく書いてください。 「うまくいかない」といっても、 あたいが空で入力され、レコードは作成されるけど、値が入っていない、とか、レコードがそもそも作られないなど、いかようにも解釈できます。
freemac

2020/02/24 05:50

レコードがそもそも作られない状態です。追記しておきます。
退会済みユーザー

退会済みユーザー

2020/02/24 06:11

@freemac さん > $_SESSION から値を入れようとしているのに、$_POST をチェックしている意図はなんですか? これに回答してくださいな
freemac

2020/02/24 06:21 編集

はい。$_POSTを使った経緯は登録ボタンをおす→データベースに登録の動作を完了させたかったからです。if(!empty($_POST))なしだと、check.phpに遷移した時点でデータベースにデータが入ってしまい、書き直すボタンで編集後にまた同一のデータがデータベースに記録されるという挙動を制御したかったという主旨です。
退会済みユーザー

退会済みユーザー

2020/02/24 06:22

このコードはどう言う意図で書いていますか? if(!isset($_SESSION['join'])){ header('Location: index.php'); exit(); }
freemac

2020/02/24 06:24

SESSION値が入力されていないということで、直接check.phpへアクセスしたユーザーをindex.phpに強制的に移動させる意図で書いています。
退会済みユーザー

退会済みユーザー

2020/02/24 06:26

> SESSION値が入力されていないということで、直接check.phpへアクセスしたユーザーをindex.phpに強制的に移動させる意図で書いています。 その逆の時に「書き込みしたい」んですよね?
freemac

2020/02/24 06:29

はい。index.php(入力)→check.php(確認)→thanks.php(完了)という動きです。 補足として、thanks.phpへのページ遷移は成功しています。
退会済みユーザー

退会済みユーザー

2020/02/24 06:33

じゃあ、こうなっているのは変だと思いませんか? if(!isset($_SESSION['join'])){ } if(!empty($_POST)){ ));
freemac

2020/02/24 06:39

if(!isset($_SESSION['join']))はcheck.phpに直捨アクセスを回避 if(!empty($_POST))はcheck.phpで登録ボタンを押した時にinput hiddenで値がpostされるので、$_POSTがからじゃない→ボタンを押した→データベース登録という目的です、、、
退会済みユーザー

退会済みユーザー

2020/02/24 06:43

いやいや(笑) レコードが作られていないんでしょ? と言うことはですよ、f(!empty($_POST))この条件式に間違いがあることをまず先に疑うべきじゃない? if(!empty($_POST)){ var_dump($_POST); exit(); )); こんなふうにして、ちゃんと条件式を通過しているかを確認してみるとか、こうやってデバッグしなきゃいかんでしょ?
freemac

2020/02/24 06:51 編集

アドバイスの通りにデバッグしてみようと思います。ご回答ありがとうございます。 自分としては,if(!empty($_POST)){ )); の最下部のページ遷移にまで行き届いていることからif(!empty($_POST)){の条件式が間違っていたら、 そもそも最下部までプログラムは進まない。だからその内部にミスがあるのではないかという見解の元質問させていただきました。
退会済みユーザー

退会済みユーザー

2020/02/24 06:53

推測するのは勝手だけど、ちゃんと事実を積み重ねてください。
freemac

2020/02/24 06:56

最下部までプログラムが一応は行き届いているのは事実、としては解釈されないのでしょうか。。
退会済みユーザー

退会済みユーザー

2020/02/24 07:00 編集

なりません。 なぜなら、「最下部までプログラムが一応は行き届いている」と言うコメントを立証するエビデンスがないので、回答陣に撮っては、そうかもしれないし、そうではないかもしれないなんか言ってるわーくらいの情報です。 そもそも提示されたコードと、あなたの手元のコード別物だろうし。
freemac

2020/02/24 07:00

事実の定義とは何でしょうか。
退会済みユーザー

退会済みユーザー

2020/02/24 07:01

if(!empty($_POST)){ var_dump($_POST); exit(); )); こうして実行した結果を提示してください。
退会済みユーザー

退会済みユーザー

2020/02/24 07:03

最後まで表示されたこと=INSERTが実行されたこと ではないので、最後まで表示されたからと言って条件式があっているとは言えないから。
freemac

2020/02/24 07:16

デバッグを実行して、でた結果がarray(1) { ["action"]=> string(6) "submit" } Arrayです。
退会済みユーザー

退会済みユーザー

2020/02/24 07:19

それでは、check.php に <?php ini_set('display_errors', 1); error_reporting(E_ALL); session_start(); require('dbconnect.php'); と言うように先頭に2行を編集して実行した結果どうなるかを提示してください。
freemac

2020/02/24 07:25

array(1) { ["action"]=> string(6) "submit" } Notice: Array to string conversion in /Applications/MAMP/htdocs/templates/join/check.php on line 13 Arrayと実行されました。
退会済みユーザー

退会済みユーザー

2020/02/24 07:27

$_SESSION['join']['image'] <- これが配列だと言うことですよね?
freemac

2020/02/24 07:32

その配列に何も与えられていないというエラー、、というのが現在の見解です。
退会済みユーザー

退会済みユーザー

2020/02/24 07:34 編集

それ、推測でしょ?  事実と言えるの?
freemac

2020/02/24 07:35

言えないです。
退会済みユーザー

退会済みユーザー

2020/02/24 07:38

じゃあ、その推測が正しいかどうかを確認しましょう。 確認の仕方はすでに教えました。
freemac

2020/02/24 07:39

わざわざ長い時間返信してくださりありがとうございました。 実行してみます。
退会済みユーザー

退会済みユーザー

2020/02/24 07:50

Notice を対応すると改版が大変になるからという理由で消す方法を紹介してる本だからどこまでまともに動くんだろう
退会済みユーザー

退会済みユーザー

2020/02/24 07:56

@asahina1979 まあ、某セキュリティのあの方からツッコミ入って改訂版出したくらいの本ですからねぇ… ここでも毎度おなじみだし。
退会済みユーザー

退会済みユーザー

2020/02/24 08:45

その某氏すら気の毒になるdisられぐあいっぽいね 「よくわかるPHPの教科書」が回答陣からdisられて気の毒になった #おまえが言うな たにぐちまこと著 「よくわかるPHPの教科書」、Twitter風ひとこと掲示板の登録画面... - Yahoo!知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13112631843
guest

0

自己解決

関連の質問より、errorinfo関数、dbのsetAttribute関数を使いながらエラーを辿っていくことで
問題のある箇所を特定できました。今回はスペルミスでしたが、今後はこのような機能を積極的に使用していこうと思います。

投稿2020/02/24 11:25

freemac

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問