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

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

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

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

PHP

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

Q&A

解決済

1回答

472閲覧

phpから送信された投稿内容がMYSQLに保存されるようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

PHP

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

0グッド

0クリップ

投稿2019/08/17 10:00

編集2019/08/19 09:06

前提・実現したいこと

投稿をmysqlに保存したい

ここに質問の内容を詳しく書いてください。
現在phpで投稿機能の付いたサイトを作っています。投稿された投稿がmysqlに保存され、トップページに出力されるようにしたいです。しかし投稿内容が出力はされるのですがMYSQLのテーブルには保存されません。
テーブルのカラムの内容をphpで出力できるのでデータベースとphpの接続は出来ていると思います。

該当のソースコード

postphp

1<form action="a.php" method=post> 2 <p>今回のテーマ</p> 3 <textarea name="theme"></textarea> 4 <p>結論</p> 5 <textarea name="conclusion"></textarea> 6 <p>何故その結論に至ったのか</p> 7 <textarea name="body"></textarea> 8 <input type="submit" value="投稿"> 9 </form>

topphp

1<?php 2 try { 3 $dsn = "mysql:dbname=post;host=localhost"; 4 $user = "xxx"; 5 $password = "xxx"; 6 7 $dbh = new PDO($dsn, $user, $password); 8 9 $theme = $_POST["theme"]; 10 $conclusion = $_POST["conclusion"]; 11 $body = $_POST["body"]; 12 13 14 $sql = "INSERT INTO toukou (theme, conclusion, body) VALUES (:theme, :conclusion, :body)"; 15 $stmt = $dbh->prepare($sql); 16 $params = array(":theme" => "$theme", ":conclusion" => "$conclusion", ":body" => "$body"); 17 $stmt->execute($params); 18 19 echo "<p>theme: ".$theme."</p>"; 20 echo "<p>conclusion: ".$conclusion."</p>"; 21 echo "<p>body: ".$body."</p>"; 22 echo "<p>で登録しました。</p>"; 23 } catch (PDOException $e) { 24 exit("データベースに接続できませんでした。" . $e->getMessage()); 25 } 26 27 ?>

よろしくお願いします。

イメージ説明
primary keyはpost_idに設定

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

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

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

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

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

guest

回答1

0

ベストアンサー

※あくまで現状の質問内容からのみで言えることを回答にしています
以下で解決しない場合、DBの情報(テーブルのCREATE TABLE文)を追記してください

投稿内容が表示されるのはPOST送信されたものをそのまま出しているからですね。

  • シングルクォーテーション内では変数は展開されません。
  • カラム名全角だと'``'で囲う必要があると思います
  • プリペアドステートメントの名前キーワードに全角って使えたかな・・・。いずれにしても:bodyに対応するものがないですよ。しいてなら:本文ですが、それでもできなければキーワードは半角に統一してください

あと、SQLはいきなりPHPプログラムからではなくMySQLに直接実行して動作するか確認してから実行してください(つまり直接実行して動作するものを採用してください)

投稿2019/08/17 10:15

編集2019/08/17 11:00
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/08/17 13:16 編集

回答ありがとうございます。すべての「'」に「"」、テーブルのカラム名をすべて英語に、top.phpの中身もすべて英語に(テーマ→theme等)しましたが解決しませんでした。 おっしゃった、「DBの情報(テーブルのCREATE TABLE文)」というものがよくわかりませんでしたので、テーブルがどのようになっているのかがわかる画像を追加しました。 質問文にあるphpの内容も変更後のものに編集しました。
m.ts10806

2019/08/17 13:44

テーブルを作成するときにはCREATE TABLEというSQLが実行されます。 それはそのまま「テーブル定義」となり、実行するだけでこちらの手元に同じテーブルができあがるので再現確認ができるようになります。 post_idの定義(オートインクリメントかどうか)はどうなっているのでしょうか。 ただ、現在のコードではDB上にエラーがあっても拾うようにはできていませんので(何かあってもExceptionキャッチできない)下記のような記事を参考に、オプションをつけたうえで実行してください。 これで起きている問題もわかります。 https://qiita.com/mpyw/items/b00b72c5c95aac573b71#driver_options ※特に問題というわけではありませんが、変数しかセットしないのであればクォーテーションでくくる意味はほとんどありません。
退会済みユーザー

退会済みユーザー

2019/08/18 07:23

m.ts10806さんのおかげで投稿されたデータがテーブルに記載されるようになりました。ありがとうございます。しかし追加するデータが日本語の時にテーブル上で文字化けしてしまいます。 文字コードを確認するとcharacter_set_clientやcharacter_set_connection などにばらばらの文字コードが設定されていましたので文字コードとしてuft8を設定しました。その後、mysqlのサービスを再起動させようとすると「ローカルコンピューター上のmysql57サービスは起動して停止しました。サービスの中には、ほかのサービスやプログラムで使用されていない場合は自動的に停止するものがあります」というエラーメッセージが表示されてしまいました。その後はworkbenchでサーバーを起動することもmysql5.7 conmmand line clientに接続することもできなくなりました。
m.ts10806

2019/08/18 07:33

それは試す前に教えてもらいたかった。問題としては別なので一度解決ずみとし、現在の定義一式を確認して別質問としてください。 ※ただ「文字化けで登録された」のか「コマンドライン表示上文字化けしてただけ」なのかで対応が違ってきます。 前者であれば登録されたデータを救うことはできませんのでそこだけご 認識を。
退会済みユーザー

退会済みユーザー

2019/08/18 07:37

すべてを頼りきりでなく、自分で解決できそうなところは自分で直したほうがいいと思い手を付けてしまいました。すみません。 文字化けで登録されていました。しかし試しで登録してみただけなので大丈夫です。 サービスの再起動の件を別の質問として投稿します。 もう少し長くなってしまうかもしれませんが、よろしくお願いします。
m.ts10806

2019/08/18 07:42

その心がけは大変良いことだと思います。 ただ、設定回りはアプリケーションに直に影響するところなので、なにかを誤ってしまって戻せなくなる人も少なくないです。 元の設定状態とデータのバックアップは取っておきたいところですね。 「試しで」とのことで、もし他に持っておきたいものがないのであれば、MySQL再構築のほうが早いかもしれません。 今はプログラミングの学習期だとしたら設定とか環境とかで時間とられるのは少々勿体ない気もしますので。 どこをどう修正したかにもよりますが、エラーからすると設定ファイルの構文ミスかなあとか、思ってます。一度自身の操作を振り返ってみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問