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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

1回答

1303閲覧

PHPでデータのINSERTができない

nopakat

総合スコア6

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2019/09/04 14:14

編集2019/09/04 15:16

PHP初学者です。

Macを使用し、エディタはAtom、ローカル開発環境はMAMPを使用しています。

現在、たにぐちまことさん著「よくわかるPHPの教科書 PHP7対応版」で学習を進めております。

Chapter6-5で「Twitter風ひとこと掲示板を作る」の中で、ユーザー登録の際に、上手くユーザーのデータがデータベースにINSERTできません。

check.phpでの内容確認後、本来はthanks.phpで登録完了となるはずが、check.phpのページで真っ白になります。

以下、記述コードです。

データベース名:mini_bbs
テーブル名:members

テーブル構造:定義AI
idINT(11)
nameVARCHER(255)
emailVARCHER(255)
passwordVARCHER(100)
pictureVARCHER(255)
createdDATETIME
modifiedTIMESTAMP

【dbconnect.php】

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewpoint" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 6 7<!-- Bootstrap CSS --> 8<link rel="stylesheet" href="css/style.css"> 9 10<title>よくわかるPHPの教科書</title> 11</head> 12<body> 13 <header> 14 <h1 class="font-weight-normal">よくわかるPHPの教科書</h1> 15 </header> 16 17 <main> 18<?php 19try { 20 $db = new PDO('mysql:dbname=mini_bbs;host=localhost;charset=utf8', 'root', 'root'); 21} catch (PDOException $e) { 22 echo 'DB接続エラー: ' . $e->getMessage(); 23} 24 ?> 25</main> 26</body> 27</html>

【index.php】

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewpoint" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 6 7<!-- Bootstrap CSS --> 8<link rel="stylesheet" href="css/style.css"> 9 10<title>よくわかるPHPの教科書</title> 11</head> 12<body> 13 <main> 14 <?php 15 16 require('../dbconnect.php'); 17 18 session_start(); 19 20 if(!empty($_POST)) { 21 //エラー項目の確認 22 if($_POST['name'] == '') { 23 $error['name'] = 'blank'; 24 } 25 if($_POST['email'] == '') { 26 $error['email'] = 'blank'; 27 } 28 if(strlen($_POST['password']) < 4) { 29 $error['password'] = 'length'; 30 } 31 if($_POST['password'] == '') { 32 $error['password'] = 'blank'; 33 } 34 $fileName = $_FILES['image'] ['name']; 35 if(!empty($fileName)) { 36 $ext = substr($fileName, -3); 37 if($ext != 'jpg' && $ext != 'gif') { 38 $error['image'] = 'type'; 39 } 40 } 41 42 //重複アカウントのチェック 43 if(empty($error)) { 44 $member = $db->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?'); 45 $member->execute(array($_POST['email'])); 46 $record = $member->fetch(); 47 if($record['cnt'] > 0) { 48 $error['email'] = 'duplicate'; 49 } 50 } 51 52 if(empty($error)) { 53 //画像をアップロードする 54 $image = date('YmdHis') . $_FILES['image']['name']; 55 move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image); 56 57 $_SESSION['join'] = $_POST; 58 $_SESSION['join']['image'] = $image; 59 header('Location: check.php'); 60 exit(); 61 } 62 } 63 64 //書き直し 65 if($_REQUEST['action'] == 'rewrite') { 66 $_POST = $_SESSION['join']; 67 $error['rewrite'] = true; 68 } 69 ?> 70 <p>次のフォームに必要事項をご記入ください。</p> 71 <form action="" method="post" enctype="multipart/form-data"> 72 <dl> 73 <dt>ニックネーム<span class="required">必須</span></dt> 74 <dd><input type="text" name="name" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['name'], ENT_QUOTES); ?>" /> 75 <?php if($error['name'] == 'blank'): ?> 76 <p class="error">* ニックネームを入力してください</p> 77 <?php endif; ?> 78 </dd> 79 <dt>メールアドレス<span class="required">必須</span></dt> 80 <dd><input type="text" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['email'], ENT_QUOTES); ?>" /> 81 <?php if($error['email'] == 'blank'): ?> 82 <p class="error">* メールアドレスを入力してください</p> 83 <?php endif; ?> 84 <?php if($error['email'] == 'duplicate'): ?> 85 <p class="error">* 指定されたメールアドレスはすでに登録されています</p> 86 <?php endif; ?> 87 </dd> 88 <dt>パスワード<span class="required">必須</span></dt> 89 <dd><input type="password" name="password" size="10" maxlength="20" value="<?php echo htmlspecialchars($_POST['password'], ENT_QUOTES); ?>" /> 90 <?php if($error['password'] == 'blank'): ?> 91 <p class="error">* パスワードを入力してください</p> 92 <?php endif; ?> 93 <?php if($error['password'] == 'length'): ?> 94 <p class="error">* パスワードは4文字以上で入力してください</p> 95 <?php endif; ?> 96 </dd> 97 <dt>写真など</dt> 98 <dd><input type="file" name="image" size="35" /> 99 <?php if($error['image'] == 'type'): ?> 100 <p class="error">* 写真などは「.gif」または「.jpg」の画像を指定してください</p> 101 <?php endif; ?> 102 <?php if(!empty($error)): ?> 103 <p class="error">* 恐れ入りますが、画像を改めて指定してください</p> 104 <?php endif; ?> 105 106 </dd> 107 </dl> 108 <div><input type="submit" value="入力内容を確認する" /></div> 109 </form> 110 </main> 111</body> 112</html>

【check.php】

php

1<?php 2session_start(); 3require('../dbconnect.php'); 4 5if(!isset($_SESSION['join'])) { 6 header('Location: index.php'); 7 exit(); 8} 9 10if(!empty($_POST)) { 11 //登録処理をする 12 $statement = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, picture=?, created=NOW()'); 13 $ret = $statement->execute(array( 14 $_SESSION['join']['name'], 15 $_SESSION['join']['email'], 16 shal($_SESSION['join']['password']), 17 $_SESSION['join']['image'] 18 )); 19 unset($_SESSION['join']); 20 21 header('Location: thanks.php'); 22 exit(); 23} 24 ?> 25 26<!DOCTYPE html> 27<html lang="ja"> 28<head> 29<meta charset="UTF-8"> 30<meta name="viewpoint" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 31 32<!-- Bootstrap CSS --> 33<link rel="stylesheet" href="css/style.css"> 34 35<title>よくわかるPHPの教科書</title> 36</head> 37<body> 38 <main> 39 40 41 <form action="" method="post"> 42 <input type="hidden" name="action" value="submit" /> 43 <dl> 44 <dt>ニックネーム</dt> 45 <dd> 46 <?php echo htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES); ?> 47 </dd> 48 <dt>メールアドレス</dt> 49 <dd> 50 <?php echo htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES); ?> 51 </dd> 52 <dt>パスワード</dt> 53 <dd> 54 【表示されません】 55 </dd> 56 <dt>写真など</dt> 57 <dd> 58 <img src="../member_picture/<?php echo htmlspecialchars($_SESSION['join']['image'], ENT_QUOTES); ?>" width="100" height="100" alt="" /> 59 </dd> 60 </dl> 61 <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div> 62 </form> 63 </main> 64</body> 65</html>

【thanks.php】

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewpoint" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 6 7<!-- Bootstrap CSS --> 8<link rel="stylesheet" href="css/style.css"> 9 10<title>よくわかるPHPの教科書</title> 11</head> 12<body> 13 <main> 14 <p>ユーザー登録が完了しました</p> 15 <p><a href="../"> ログインする</a></p> 16 17 </main> 18</body> 19</html>

全てのコードの記述も確認しましたが、データベースへの接続もできており、ミスしている箇所が見つけられません。

先人のお力をお借りしたく、質問させていただきます。

何卒宜しくお願い申し上げます。

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

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

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

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

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

Orlofsky

2019/09/04 14:18

テーブルの定義情報は、できれば CREATE TABLE に修正できると適切なコメントが付きやすいです。
nopakat

2019/09/04 14:27

Orlofsky様 上記の件、ご指摘頂きまして、誠にありがとうございます。 訂正させて頂きます。
guest

回答1

0

ベストアンサー

require('../dbconnect.php');ではエラーが出ていない前提での回答です。

check.php の以下部分をファイルの先頭に移動し、★部分のechoを削除してください。
レスポンスヘッダーの出力(header('Location: check.php');)は、レスポンスボディを一文字でも出力すると機能しません。

(php.net) header

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

PHP

1<?php 2 session_start(); 3 require('../dbconnect.php'); 4 5 if(!isset($_SESSION['join'])) { 6 header('Location: index.php'); 7 exit(); 8 } 9 10 if(!empty($_POST)) { 11 //登録処理をする 12 $statement = $db->prepare('INSERT INTO members SET name=?, email=?, password=?, picture=?, created=NOW()'); 13 //★echo $ret = $statement->execute(array( 14 $ret = $statement->execute(array( 15 $_SESSION['join']['name'], 16 $_SESSION['join']['email'], 17 shal($_SESSION['join']['password']), 18 $_SESSION['join']['image'] 19 )); 20 unset($_SESSION['join']); 21 22 header('Location: thanks.php'); 23 exit(); 24 } 25 ?>

投稿2019/09/04 14:46

編集2019/09/04 14:51
Y.H.

総合スコア7914

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

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

nopakat

2019/09/04 14:56

Y.H.様 ご回答頂き、ありがとうございます。 require('../dbconnect.php');に関しては正常に機能しており、ご指摘の箇所のechoを削除してみましたが、結果は同様でcheck.phpで画面が真っ白になってしまいました。 ご助言頂き、ありがとうございます
Y.H.

2019/09/04 14:59

回答を編集しています。入れ違いになっていたらすみません。 「以下部分をファイルの先頭に移動してください。」も行ってください。
nopakat

2019/09/04 15:11

Y.H.様 ありがとうございます。 ご指摘の箇所もファイル先頭へ移動いたしましたが、結果は変わりませんでした、、、。 その前のindex.phpでは正常にheader('Location: check.php');が機能し、check.phpへ移動できており、他に何か要因として考えられることはありますでしょうか。 ご助力いただき、本当にありがとうございます。
Y.H.

2019/09/04 15:15

phpまたはapacheのエラーログに何か出力されてませんか?
nopakat

2019/09/04 15:35

Y.H.様 すみません、今エラーログ拾いに行き、下記の内容で確認しましたら解決致しました。 [04-Sep-2019 15:30:29 UTC] PHP Fatal error: Uncaught Error: Call to undefined function shal() in /Applications/MAMP/htdocs/post/join/check.php:16 Stack trace: × shal ↓ ○ sha1 と修正しましたら解決致しました。 ご助言いただけましたおかげで解決致しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問