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

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

ただいまの
回答率

87.49%

【PHP基礎】サンクスページに SQL でデータベースに追加ができない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 635

score 15

使用PC :mac 
OS   :Mojave ver10.14.6
MAMP   :ver5.7
ブラウザ :chrome
参考文書:いきなり はじめるPHP ワクワクドキドキの入門教室

現在『いきなりはじめるPHP』の書籍を参考に勉強しています。
アンケート自動保存機能を追加する(SQL操作)の章で、期待通りに
1、データベースに接続>SQLで指示>接続を切断し、
2、データベースにデータを追加する 
ことができません。

●php_error.logの表示

[14-May-2020 03:00:01 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function mb_internal_enooding() in /Applications/MAMP/htdocs/thanks.php:39
Stack trace:
0 {main}
  thrown in /Applications/MAMP/htdocs/thanks.php on line 39

39行目は以下のコードになります
mb_internal_enooding("UTF-8");

該当のソースコード

●index.html

<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>PHP基礎</title>
</heder>
<body>

            <form method="post" action="check.php">
                ニックネームを入力して下さい<br/>
                <input type="text" name="nickname" style="width:100px"><br/>
                メールアドレスを入力してくだい<br/>
                <input name="email" type="text" style="windth:200px"><br/>
                ご意見を一言でお聞かせください。<br/>
                <input name="goiken" type="text" style="windth:300px"><br/>

                <br/>
                <input type="submit" value="送信">
            <from>

</body>
</html>

●check.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; chapter=UTF-8">
<title>PHP基礎</title>
</heder>
<body>
      <?php
      $nickname=$_POST['nickname'];
      $email=$_POST['email'];
      $goiken=$_POST['goiken'];

      $nickname=htmlspecialchars($nickname);
      $email=htmlspecialchars($email);
      $goiken=htmlspecialchars($goiken);    

      if($nickname=='')
      {
          print'ニックネームが表示されていません。<br/>';
      }
       else
       {
          print'ようこそ';
          print $nickname;
          print '様';
          print '<br/>';
       }



       if($email=='')
       {
                print'メールアドレスが入力されていません。<br/>';
       }
       else
       {
                print'メールアドレス:';
                print $email;
                print'<br/>';
        }
       if($goiken=='')
        {
                print'ご意見が入力されていません。<br/>';
        }


        else
        {
                print'ご意見『';
                print $goiken;
                print '』<br/>';
        }

        if($nickname==''||$email==''||$goiken=='')
        {
            print'<form>';
            print'<input type="button" onclick="history.back()" value="戻る">';
            print'</form>';
        }
        else{

            print'<form method="post" action="thanks.php">';
            print'<input name="nickname" type="hidden" value="'.$nickname.'">';
            print'<input name="email" type="hidden" value="'.$email.'">';
            print'<input name="goiken" type="hidden" value="'.$goiken.'">';
            print'<input type="button" onclick="history.back()" value="戻る">';
            print'<input type="submit" value="OK">';
            print'</form>';
        }
      ?>

</body>
</html>

●thanks.php
本書では <?php
$dsn='mysql:dbname=phpkiso;host=localhost';
$user='root';
$password='';
となっていましたが
$password='root';と書き込んだところ、PWなしでは表示されなかった
アンケートを受け付けました。の画面が表示される様になりました。

<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>PHP入門</title>
</heder>
<body>

      <?php
      $dsn='mysql:dbname=phpkiso;host=localhost';
      $user='root';
      $password='root';
      $dbh=new PDO($dsn,$user,$password);
      $dbh->query('SET NAMES utf8');


      $nickname=$_POST['nickname'];
      $email=$_POST['email'];
      $goiken=$_POST['goiken']; 

      $nickname=htmlspecialchars($nickname);
      $email=htmlspecialchars($email);
      $goiken=htmlspecialchars($goiken);

      print$nickname;
      print'様</br>';
      print'ご意見ありがとうございました</br>';
      print'頂いたご意見『';
      print$goiken;
      print'』</br>';
      print$email;
      print'にメールを送りましたのでご確認ください。';

      $mail_sub='アンケートを受け付けました。';
      $mail_body=$nickname."様へ/nアンケートご協力ありがとうございました。";
      $mail_body=html_entity_decode($mail_body,ENT_QUOTES,"UTF-8");
      $mail_body='From:xxx@xxx.co.jp';
      mb_language('Japanese');
      mb_internal_enooding("UTF-8");
      mb_sent_mail($email,$mail_sub,$mail_body,$mail_head);

      $sql ='INSERT INTO anketo (nickname,email,goiken) VALUES("'.$nickname.'","'.$email.'","'.$goiken.'")';
      $stmt=$dbh->prepare($sql);
      $stmt->execute();

      $dbh=null;



      ?>
</body>
</html>

試したこと

本には、
1、データベースに接続>SQLで指示>接続を切断し、
2、データベースにデータを追加する 
ためのコードとして
PHP上部の 

$dsn='mysql:dbname=phpkiso;host=localhost';
      $user='root';
      $password='root';
      $dbh=new PDO($dsn,$user,$password);
      $dbh->query('SET NAMES utf8');

 

と下部の

$sql ='INSERT INTO anketo (nickname,email,goiken) VALUES("'.$nickname.'","'.$email.'","'.$goiken.'")';
      $stmt=$dbh->prepare($sql);
      $stmt->execute();

      $dbh=null;

が、書かれていますが、この2箇所のコードを追加する前は
問題なく動作していましたが、
この2箇所のコードを記述するとエラーが表示され、データベースには何も反映されません

データベースに以下のテーブルを作成しています。
イメージ説明

また同様の質問があり解決法でリンク内容
html_entity_decodeを削除とあったのですがどこにありますでしょうか。

解決に向けての助言等ございましたらコメントいただければ幸いでございます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2020/05/14 12:47

    phpinfo()
    の出力を提示してください。

    キャンセル

  • m.ts10806

    2020/05/14 12:53

    mb_internal_enooding

    えのーでぃんぐ

    キャンセル

回答 1

checkベストアンサー

+4

目的は書籍丸写しですか?
HTML4のコードを載せている書籍は避けないと使い物になりません。
SQLインジェクション対策すらもされていないようです。
htmlspecialcharsの使いどころもそこではない。
メール送れなくてもDBに書き込みにいっています。

PHPのバージョンも一致していないのでは。

原因はエラーの通りです。
PHPマニュアルできちんと機能を確認すれば解決できます。
写経を目的にしているからこの手のミスが頻発するのです。

書いたようにしか動かないので、
エラーを読んで
デバッグして
PHPマニュアルで機能確認して

を地道にやっていくしかありませんし、
それだけで入門時期にでくわす問題はほとんど、解決できます。

(逆にプログラミングやっていく上の基礎なので、やらない人できない人はずっと初心者です)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/14 23:21

    PHPマニュアルでコードの意味を調べ確認を行い、コードを全体的に見直してエラー文を修正することができました。その結果思う通りの表示を行うことができました。(1文字単位のスペルミスがいくつかありました。)
    コメントいただいた通り、エラーを確認後、地道にデバックとPHPマニュアルで機能確認を行い勉学に励みたいと思います。
    大変ありがとうございました。

    キャンセル

  • 2020/05/14 23:25

    解決されたようで何よりです。
    「それだけで入門時期にでくわす問題はほとんど、解決できます。 」というのは「自分で解決できます」という意味でもあります。
    自分で解決できたらそれが一番早いですからね。質問投稿する時間も実は結構手間であるはずです。できればその時間を正しい調査にあてていただきたいと常日頃から思ってます。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る