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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

MAMP

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

Q&A

2回答

3441閲覧

index.htmlで入力したアンケートデータがphpMyAdminのテーブルに保存されない(出典:「いきなりはじめるPHP」)

kaoru-drosera

総合スコア23

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

MAMP

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

0グッド

1クリップ

投稿2019/01/29 06:24

編集2019/01/30 01:10

前提・実現したいこと

今回は「いきなりはじめるPHP ワクワク・ドキドキの入門教室」からの質問です。

単刀直入に言うと、本書のp122~125「アンケート自動保存機能を追加しよう!」で詰まっています。

具体的には、入力したアンケートデータがphpMyAdminのテーブルに来ないのです。
本書で言えばp125のように「解答を入力して、サンクスページまで進む」→「アンケートデータが(phpMyAdminのテーブル「anketo」内)に保存される」のようにしたいのですが、現在「解答を入力してサンクスページまで進めることはできるが、アンケートデータば保存されない」といった状態です。

現在の状況

最初に、「thanks.php」のコードを置いておきます。
SQL起動のコードは、以下のホームページより、「パスワードも入力しないとphpMyAdminに接続できない」という意見を参考にしています。
https://royal-fummy.com/blog/php-startup-with-mamp/

php

1<!DOCTYPE html> 2<html lang="ja"> 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>PHP基礎</title> 8</head> 9<body> 10 11<?php 12 13 // phpMyAdminに接続する 14 15 $dsn='mysql:dbname=phpkiso;host=localhost;charset=utf8'; 16 $user='root'; 17 $password='root'; 18 $dbh=new PDO($dsn, $user, $password); 19 20 ini_set('error_reporting', E_ALL); 21 22 $postNN = $_POST['nickname']; 23 $postEMAIL = $_POST['email']; 24 $postCOMMENT = $_POST['comment']; 25 26 $postNN = htmlspecialchars($postNN); 27 $postEMAIL = htmlspecialchars($postEMAIL); 28 $postCOMMENT = htmlspecialchars($postCOMMENT); 29 30 echo $postNN; 31 echo 'さん'.'<br>'; 32 echo 'ご意見ありがとうございました!'; 33 echo '<br>'; 34 echo '頂いたご意見『'; 35 echo $postCOMMENT; 36 echo '』'; 37 echo '<br>'; 38 echo $postEMAIL.'にメールをお送りしたのでご確認ください。'; 39 40 $mail_sub = 'アンケートを受け付けました。'; 41 $mail_body = $postNN."様へ/nアンケートご協力ありがとうございました。"; 42 $mail_body = html_entity_decode($mail_body,ENT_QUOTES,"UTF-8"); 43 $mail_head = 'From: xxx@xxx.co.jp'; 44 mb_language('Japanese'); 45 mb_internal_encoding("UTF-8"); 46 mb_send_mail($postCOMMENT,$mail_sub,$mail_body,$mail_head); 47 48 $sql='INSERT INTO anketo(nickname,email,comment) VALUES("'.$postNN.'","'.$postEMAIL.'","'.$postCOMMENT.'")'; 49 $stmt=$dbh->prepare($sql); 50 $stmt->execute(); 51 52 $dbh=null; 53 54 ?> 55 56</body> 57</html>

次に、ファイルの構成です。
このファイル内で、それぞれ「check_2.php」が「index.html」、「ifset.php」が「check.php」にあたります。「thanks.php」は本書と同じです。

git

1input -----------$ ls 2check_2.php ifset.php input.php thanks.php

phpMyAdmin
イメージ説明

データベース名は「phpkiso」、テーブル名は「anketo」です。

試したこと

基本的に本書の通りにコードは入力したので、スペルやクォーテーションのチェックを行いました。
ただし、クォーテーションは変えてしまうとサンクスページ自体表示できなくなってしまいます。
google検索も試しましたが、本書でつまずいた内容が乗っていることは少なく、目当ての情報も見つかりませんでした。

###最終目標
冒頭でもあげた通り、解答を入力してサンクスページまで進んだ後、サンクスページにまで来たデータを「code」2番目のデータとしてテーブルに追加されるようにすることです。
要は、「アンケート回答者がフォームから送ってきた解答をphpMyAdminで管理できるようにする」ことが最終目標です。

補足情報(FW/ツールのバージョンなど)

OS:mac
ブラウザ:chrome(最新のバージョン)
テキストエディタ:atom(ver:1.32.2)
サーバー:MAMP(free)5.2
以下、MAMP内の情報
PHP:7,1.12
mySQL:5.7.23

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

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

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

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

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

m.ts10806

2019/01/29 06:25

phpMyAdminはツールであってDBそのものでありません。表現修正してください
退会済みユーザー

退会済みユーザー

2019/01/29 07:06 編集

2011年の本かぁ。なんでそんなPHP7対応していない古い本を頼るのか。
kaoru-drosera

2019/01/30 01:11

遅くなって申し訳ありません。 表現を修正いたしました。 この本を選んだのは「phpの教材は何か」をネットで調べた結果です。 ご指摘ありがとうございました。
m.ts10806

2019/01/30 01:11

>phpMyAdminで管理できるようにする いや、一般利用者は見れませんし、あくまで「データベースで管理」は合ってますよ。
m.ts10806

2019/01/30 01:12

DBを可視化(GUI化といったほうがいいか)するためだけに使うので、 日常的に使うものでもありません。
m.ts10806

2019/01/30 01:14

> この本を選んだのは「phpの教材は何か」をネットで調べた結果です。 発売日は見たほうがいいです。そしてPHPに限らずプログラミングを学びたいのでしたら現行の最新バージョンが何かは調べた上でそれに対応した書籍や情報を利用するようにしないと何の役にも立ちません。
kaoru-drosera

2019/01/30 01:18

丁寧なご指摘、本当に感謝します。
kaoru-drosera

2019/01/30 01:30

今からでも他の本に変えたほうが無難でしょうか?
m.ts10806

2019/01/30 01:36

はい。回答にも書きましたが、書籍のPHPのバージョンと実際にご自身が動かされているPHPのバージョンは違うはずです。ということは書籍のPHPのバージョンで動いているはずの機能が動かない可能性があります。 非推奨になったり削除になったりしている機能を使っている可能性もあります。 最低でもPHP7以上対応の書籍にした方が良いです。 当該書籍購入の際にネットで参考にしたのがどのような記事かは存じ上げませんが、PHP7対応の書籍を紹介しているとは限らない(あくまで「入門書の紹介」レベル)ので、実際に本屋さんに赴いた方が良いようには思います。 「PHP7対応 書籍」で検索するとそれなりに出てきます。ただネット上やamazonなどでは項目までしか分からないのでできれば中身を立ち読みできそうな場所に赴いてみたほうがいいですね・・
kaoru-drosera

2019/01/30 01:43

ありがとうございます。 私の無学をどうかお許しください…。
m.ts10806

2019/01/30 01:49

いえ、誰も入門時はわけわからない状態かと思います。こういった技術は日進月歩なので最新の情報が良いのは当然で、書籍が悪いとは言いませんが、書籍が出た時点では既に古い情報になっている可能性も高いです。 最初から全て対応するのは難しいにしろ、セキュリティ対策への言及がきちんとしてある書籍を選ぶか、Qiitaなどで新しい記事、評価の高い記事を参考にするようにされた方がいいかもしれません。 あとphpであればphpマニュアル(マニュアルと名はついてますがWebサイトです)は必読です。 辞書がわりにもなりますし、私も回答に散りばめているようにteratailでの回答の根拠資料にも頻繁に使われます。
guest

回答2

0

この本、ダメだわ。

1.htmlspecialchars()でHTML出力用に加工した文字列をデータベース保存に使ってるのは悪手。
POSTされた文字列を書き換えずにhtml表示のところだけ使えばいいのに。

2.INSERT文を文字列連結で作ってるので、SQLインジェクションされても笑えない。
prepare()→bindValue()→execute()の3段階踏むやり方のサンプルを探して直したほうがいい。

3.mb_send_mail()を使ってのメール送信は送信できるようにするまで
様々な点検項目があって簡単にはいかない(phpからのメール送信ネタをteratailで見ない日がない)から
メール送信にこだわらないのなら棚上げすることを推奨。


進展がないようなので、基本的なところから。

PHPのエラー表示設定について - Qiita
webブラウザ上にエラー表示できるようにしつつ、
MAMPのapache httpdが記録するエラーログもチェックする。
MAMP - Apache/MySQL/PHPのエラーログファイルの場所(フルパス) - PC設定のカルマ

phpからのデータベースアクセスが、
何らかの理由で拒否・無視されているだろうから、
エラーログを頼りに設定を変更するとかデータベースを直すとか
手を考えなきゃいけないわけで、
そういうエラーを特定しうる情報がないと
進展しないわけで。

投稿2019/01/29 07:15

編集2019/01/30 03:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2019/01/29 07:19

この手の入門書でそこまで考慮されて書かれているのを見たことないですよね。
guest

0

この内容だけだと再現確認が難しいですし、問題の切り分けも出来ません。
DBに関する処理を行うときは、言ってしまえば外部の仕組みを使うわけですから、
try-catchを利用して異常を検知するようにしてください。
基本的に、ですがPHPの構文としてまずいことがない限り外部の仕組みのエラーは
error_reportingの設定では感知できないことが殆どです。

php

1<!DOCTYPE html> 2<html lang="ja"> 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>PHP基礎</title> 8</head> 9<body> 10 11<?php 12 13// データベースに接続する 14try{ 15 16 $dsn='mysql:dbname=phpkiso;host=localhost;charset=utf8'; 17 $user='root'; 18 $password='root'; 19 $dbh=new PDO($dsn, $user, $password); 20 21 ini_set('error_reporting', E_ALL); 22 23 $postNN = $_POST['nickname']; 24 $postEMAIL = $_POST['email']; 25 $postCOMMENT = $_POST['comment']; 26 27 $postNN = htmlspecialchars($postNN); 28 $postEMAIL = htmlspecialchars($postEMAIL); 29 $postCOMMENT = htmlspecialchars($postCOMMENT); 30 31 echo $postNN; 32 echo 'さん'.'<br>'; 33 echo 'ご意見ありがとうございました!'; 34 echo '<br>'; 35 echo '頂いたご意見『'; 36 echo $postCOMMENT; 37 echo '』'; 38 echo '<br>'; 39 echo $postEMAIL.'にメールをお送りしたのでご確認ください。'; 40 41 $mail_sub = 'アンケートを受け付けました。'; 42 $mail_body = $postNN."様へ/nアンケートご協力ありがとうございました。"; 43 $mail_body = html_entity_decode($mail_body,ENT_QUOTES,"UTF-8"); 44 $mail_head = 'From: xxx@xxx.co.jp'; 45 mb_language('Japanese'); 46 mb_internal_encoding("UTF-8"); 47 mb_send_mail($postCOMMENT,$mail_sub,$mail_body,$mail_head); 48 49 $sql='INSERT INTO anketo(nickname,email,comment) VALUES("'.$postNN.'","'.$postEMAIL.'","'.$postCOMMENT.'")'; 50 $stmt=$dbh->prepare($sql); 51 $stmt->execute(); 52 $dbh=null; 53 54}catch(PDOException $e){ 55 var_dump($e); 56} 57

teratail:PHP、PDOの例外処理について

ただ、この処理内容は他にもよくないところが幾つもあります。
「必ず成功する前提」のプログラムはかなり危険です。何かで失敗することを前提で、その対策を適宜してください。

  1. mb_send_mail()より前に「メールを送りました」と文言を出している

メール送信成功するかどうか分かりませんよね。せめて返り値(bool)を確認してから画面表示しましょう。
0. ↑と同様、DB登録も成功するかどうか分かりません。正否確認をしてから画面表示しましょう。
0. pdo利用しているのに一切エスケープせずにそのままSQL文に突っ込んでいる。
SQLインジェクションの概念を学んでください。
PDOでしたらbindValueなどを活用しましょう。

蛇足:
ご提示の書籍、調べたところ2011年発売ですよね?
今PHP7.1.12でされているのでしたらPHPのバージョン合わないと思いますし、当時でているPHPのバージョンは基本的に軒並みサポート終了しているはずなので、入門とはいえ、あまりそのままで進めないほうがいいように思います。

投稿2019/01/29 06:44

編集2019/01/29 07:13
m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問