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

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

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

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

データベース

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

Q&A

解決済

2回答

3298閲覧

PHP: フォームから入力されたデータをインサートした後に、データベースの情報を表示させたい。

y-sasaki

総合スコア54

PHP

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

データベース

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

0グッド

1クリップ

投稿2021/01/03 08:15

フォームから入力されたデータをインサートした後に、データベースの情報を表示させたいです。
SQL文のあたりが怪しいのですが、分からなくて困っています。

エラーメッセージは
Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column '佐々木 康' in 'field list' in C:\xampp\htdocs\php\chat\chat.php:31 Stack trace: #0 C:\xampp\htdocs\php\chat\chat.php(31): PDO->query('INSERT INTO cha...') #1 {main} thrown in C:\xampp\htdocs\php\chat\chat.php on line 31


という感じです。

phpのソースは

<?php $dsn = 'mysql:dbname=chatlog;host=localhost'; $user = 'testuser'; $password = 'yasushi'; try { $dbh = new PDO($dsn, $user, $password); echo "接続成功\n"; } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage() . "\n"; exit(); } $name = $_POST['name']; $log = $_POST['text']; //echo $name; echo $log; // SQL作成 $sql = "INSERT INTO chatlog (id, name, log) VALUES ('', $name, $log)"; // SQL実行 $res = $dbh->query($sql); $data = "SELECT * from chatlog"; $stmt = $dbh->query($data); $result = $stmt->fetchAll(); print_r($result); // 接続を閉じる $dbh = null; ?>

よろしくお願いします。

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

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

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

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

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

m.ts10806

2021/01/03 09:38

コードは要約してませんか? 提示したコードが書かれているファイルとエラーが起きているファイルは同じですか? どこまで想定どおりに通ってますか?
y-sasaki

2021/01/03 10:02 編集

PHPのソースですが、 上部の <html lang="ja"> <head> <meta charset="utf-8"> <title>チャット</title> </head> <body> と下部の </body> </html>  は略してます。 本来はhtmlもあります。 htmlで入力フォームを書き、入力されたデータはphpファイルに渡してます。 試しに入力されたデータを echoで表示させましたが、きちんと表示されました。エラーが起きているファイルは上記のphpファイルと思います。 31行目は $res = $dbh->query($sql); の部分です。
m.ts10806

2021/01/03 10:22

省略や要約は見ている人にあらぬ詮索を強いるので、半端にするくらいなら再現するコードを別途組み直してパスワードなどだけマスクして提示されたほうが良いですね。 エラーに書いてある行数と合わないと、それだけで回答へのヒントが消えますから。 なので「思う」ではなく確実にしてください。コードは書いたとおりにしか動きません。 いずれにしてもコードだけではなくDB側の定義もあったほうが良いです。
y-sasaki

2021/01/03 10:28

すいませんでした。 今後気を付けます。
m.ts10806

2021/01/03 10:38

質問は編集できますのでいつくるかわからない今後に後回ししないほうが良いです。だいたいの人が忘れます。
guest

回答2

0

試しにINSERTのSQLをechoで出力してコピペしてDBに対して直接実行して確かめてみると良いです。
同じようなエラーが得られるはずです。

SQLの多くは、シングルクォーテーション内を文字列とみなし、何もなければテーブル名やカラム名などの要素とみなして構文解析が行われます。

エラーはその結果です。

Column not found: 1054 Unknown column '佐々木 康' in 'field list'

なので「文字列をSQLに与えたいならシングルクォーテーションで囲う」が直接的な回答ですが、それは根本的な理解には繋がりません。

SQL自体はPHPなどの言語からすると外部の仕組みです。
PHPはSQLとして組み立てた文字列を届けているにすぎず、実行結果を受け取っているだけで、実際の処理は届けられた先で行われています。

ということは、SQL単体で実行して想定の結果を得られるかどうかを事前に確認しておくべきものということになります。
それができているかいないかで、PHP側で確認する項目が減り、アプリケーションの精度が上がります。

今回問題が起きた根本原因は、想定の結果を得られるSQLを組めていないのにいきなりPHPから実行したことです。
もちろん、動的な情報が組み込まれて送られることになるので、全く同じにはなりませんが、動的な部分は固定にしてSQL単体で動作確認すればよいですし、そのSQLとPHPで作った文字列が同じ形式となっているか確認することは可能です。

これはPHPで動的なHTMLを出力する場合のやり方にも同じです。
HTMLとして解釈するのはブラウザの仕事で、PHPはそういう文字列を出力しているにすぎないからです。

あと、1点。
入力値をそのまま突っ込むとSQLインジェクションが可能となります。セキュリティの脅威ですね。
PHPの機能に回避する機能があります。PDO利用でしたらQiita含め優良な記事はたくさんありますし、PHPマニュアルで機能確認して対応してみてください。

投稿2021/01/03 10:37

m.ts10806

総合スコア80875

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

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

0

自己解決

調べましたら、解決できました

リンク内容
こちらを参考に
VALUES ('', $name, $log)"; の $name, $log  をシングルクォーテーションで囲んだらできました。
('', '$name', '$log')"; のように直しました。

投稿2021/01/03 10:23

y-sasaki

総合スコア54

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

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

m.ts10806

2021/01/03 10:37

根本解決にならないので(別の問題がまだ残っている)、私の回答を読んでおいてください。
退会済みユーザー

退会済みユーザー

2021/01/03 10:43

回答ではありませんが、SQLインジェクション対策としてプリペアードステートメントの使用をおすすめします。
退会済みユーザー

退会済みユーザー

2021/01/03 10:44

あ、下記の回答で指摘されてましたね・・・。
退会済みユーザー

退会済みユーザー

2021/01/04 06:01

それで動くかもしれないが、SQLインジェクションの事例をここに書き出したら、プリペアドステートメントの重要性に気づいてくれるかな?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問