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

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

ただいまの
回答率

88.79%

PHP+MySQLでデータ入力プログラムを作ったが,その文字列が入らない。

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 381

mizphses

score 10

前提・実現したいこと

PHPでデータ入力プログラムを作りましたが,その文字列が入リません。

発生している問題・エラーメッセージ

入力したデータが表示されない

該当のソースコード

index.php

<!doctype HTML>
<html>
  <head>
    <title="SEP:Sharedu Examination Programme">
  </head>
  <body>
      <form action="sharedu.php" method="post">
          大問のタイトル
          <div><input type="text" name="dai"></div>
          問題の文章
          <div><textarea name="tx"></textarea></div>
          小問
          <div><textarea name="s1"></textarea></div>
          以上でよろしければ,送信ボタンを押下してください。
          <br>
          <input type="submit" value="送信">
      </form>
  </body>
</html>

sharedu.php

<!DOCTYPE html>
<html>
<head>
<meta charset="uft-8">
    <title>試験画面</title>
</head>
<body>
    <?php
        $dai=htmlspecialchars($_post["dai"], ENT_QUOTES);
        $t01=htmlspecialchars($_post["tx"], ENT_QUOTES);
        $s1=htmlspecialchars($_post["s1"], ENT_QUOTES);
        $db=new PDO("localhost;dbname=db","root","root");
        $db->query("INSERT INTO tb ('no','dai','tx','s1') VALUES (NULL,'$dai','$t01','$s1')");
        print "書き込みました。";
        print "<p><a href='index.php'>一覧表示</a></p>";
    ?>
    </body>
</html>

試したこと

VALUESの値を指定した→データは入った(はず)

補足情報

使用環境 MacBook Pro2015(Retina)・MAMP(無償版)
DBの状態(PHP MyAdmin)
https://imgur.com/a/8PHknNf

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • javahack

    2019/04/22 02:13 編集

    こちらの質問と同じ方でしょうか?
    https://teratail.com/questions/183102
    SQLが修正前のものなのでそのままではINSERTに失敗すると思います。
    もしSQL修正して動作確認されているようでしたら質問を編集して正しいSQLに修正した方が良いと思います。

    キャンセル

回答 3

+1

一覧表示ロジックが実装されていないからだと思います。

余談ですが、htmlspecialchars はSQL文のエスケープに使うための関数ではありませんよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

$_post → $_POST

変数は大文字小文字大別します。始めのうちはPHPマニュアルからコピペするくらいが良いと思います。

あとエラー表示はONに設定しておいてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

phpのデバッグ方法の再確認をしましょう。
PHPのエラー表示設定について - Qiita
phpコード冒頭に

ini_set('display_errors', "On");
ini_set('error_reporting', E_ALL);


などと挿入して、何らかのエラーが発生したときにwebブラウザに表示できるようにします。

mts10806さんの回答にもありますが、
PHP: $_POST - Manual
$_POST['dai']などとPOSTは大文字で書きます。

iwamotさんの回答にもありますが、
PHP: htmlspecialchars - Manual
htmlspecialchars()はHTML出力するさいに文字化けしないように加工するもので、
データベース保存用に加工するのは間違いです。

$db=new PDO("localhost;dbname=db","root","root");はいろいろ間違ってます。
mysqlに接続するなら
PHP: PDO_MYSQL DSN - Manual
1つ目の引数の冒頭に"mysql:"を付ける必要があります。
他に、host、dbname、port、charsetなどいろいろ指定が必要かもしれません。
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8mb4';とか。
参考:PHPでデータベースに接続するときのまとめ - Qiita

$db->query("INSERT INTO tb ('no','dai','tx','s1') VALUES (NULL,'$dai','$t01','$s1')");
こんな、$_POSTから受信したデータを直接SQL文に文字列連結するのは大変危険なので、
PHP: PDOStatement::bindParam - Manual
bindParam()を駆使して変数の値を安全にクエリーに紐づけます。
こんな感じ?

$stmt = $db->prepare("INSERT INTO tb ('no','dai','tx','s1') VALUES (NULL,:dai,:tx,:s1)");
$stmt->bindParam(':dai', $dai, PDO::PARAM_STR);
$stmt->bindParam(':tx', $t01, PDO::PARAM_STR);
$stmt->bindParam(':s1', $s1, PDO::PARAM_STR);
$stmt->execute();

その他、大前提として、
データベース接続はtry~catchブロックを駆使しつつ、
接続時から例外発生を捉えられるよう接続方法を工夫します。
理想的な形は
基本コーディング
にあるので真似してください。

データベースへの保存が成功しているかどうか、
しっかりデバッグしてください。
phpMyAdminほかデータベースを直接覗ける仕組みも一緒に組み込んでおくと楽です。
(PostgreSQLだとpgAdmin4とか。Windows上ならA5:SQL mk-IIとか。macosは詳しくないので調べて。)
組み込まれていない場合は、
index.phpとかなにかのphpでデータベースから読み出して表示する処理を設ければよいかと。
(直接の回答としては、iwamotさんの言う、データベースから読み出して表示する処理が設けられていない、となります。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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