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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

922閲覧

PHPを利用したアンケートの作成について(PHP→MySQLに情報が送信されません。)

teturousan

総合スコア4

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2021/03/10 03:12

編集2021/03/10 03:13

phpのアンケートフォームに入力した内容がMysqlに反映されません。

作成したphpはthanks.phpになります。

エラー内容;
Parse error: syntax error, unexpected '$sql' (T_VARIABLE) in C:\xampp\htdocs\phpkiso\thanks.php on line 41

該当するエラーの行は次の部分になります。
$sql='INSERT INTO anketo(nickname,goiken,email)VALUES("'.$nickname'","'.$goiken'","'.$email'")';

・確かめたこと
1.構文の入力ミスの確認
2.データベース名がanketoになっているかの確認

以上を確認したしたが、上記のエラーが継続しております。構文のエラーがどの部分に発生しているのか不明です。ヒントだけでもいただけないでしょうか?

thanks.php

<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> <body> <?php $dsn='mysql:dbname=phpkiso;host=localhost'; $user='root'; $password=''; $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_head='From:xxx@xxx.co.jp'; mb_language('Japanese'); mb_internal_encoding("UTF-8"); mb_send_mail($email,$mail_sub,$mail_body,$mail_head);S $sql='INSERT INTO anketo(nickname,goiken,email)VALUES("'.$nickname'","'.$goiken'","'.$email'")'; $stmt = $dbh->prepare($sql); $stmt ->execute(); $dbh = null; ?> </body> </html>

・MySQLの内容について
イメージ説明

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

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

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

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

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

m.ts10806

2021/03/10 03:39

また、htmlを含めた実装がかなり古く、SQLインジェクションも可能な実装になっています。早急に参考元の変更をすすめます。
guest

回答2

0

「SET NAMES utf8」は使わずにDSN文字列で指定します。
PHPでデータベースに接続するときのまとめ - Qiita
$dsn='mysql:dbname=phpkiso;host=localhost;charset=utf8';

htmlspecialchars()による加工はHTML出力直前に表示目的だけで使用するべきで、
データベースへの保存やメール送信においては加工前の素の文字列を使いましょう。
変数の中身を直接加工して保持してはいけません。
試しに、nicknameなどに半角の&や<など入れてみればわかります。

php

1function h($str) 2{ 3 echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 4}

などとして h($nickname);などとすればいいわけです。

処理の後段で出現するこの箇所:

mb_language('Japanese'); mb_internal_encoding("UTF-8");

はphpの動作を変更するものなのでphpコードの冒頭に記述するか、
php.iniで設定しておくべきものなので、
ここには記述するべきではないです。
(変数に保持している文字列のエンコーディングを保証できなくなる。)

$sql='INSERT INTO anketo(nickname,goiken,email)VALUES("'.$nickname'","'.$goiken'","'.$email'")';
SQLインジェクション攻撃の標的になるので、
bindValue()など使いましょう。

php

1$sql = 'INSERT INTO anketo(nickname, goiken, email) VALUES (:nickname, :goiken, :email)'; 2try { 3 $dbh->beginTransaction(); 4 $stmt = $dbh->prepare($sql); 5 $stmt->bindValue(':nickname', $nickname, PDO::PARAM_STR); 6 $stmt->bindValue(':goiken', $goiken, PDO::PARAM_STR); 7 $stmt->bindValue(':email', $email, PDO::PARAM_STR); 8 $stmt->execute(); 9 $dbh->commit(); 10} 11catch (PDOException $e) { 12 // なにかエラーのリカバリー処理を置くならここ 13 $dbh->rollBack(); 14 throw $e; 15}

たかだかこんなINSERT INTO文でトランザクション処理しなくてもいいかもしれないけれども。

投稿2021/03/10 05:12

編集2021/03/10 05:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

PHP

1mb_send_mail($email,$mail_sub,$mail_body,$mail_head);S

PHP

1mb_send_mail($email,$mail_sub,$mail_body,$mail_head);

投稿2021/03/10 03:16

tanat

総合スコア18709

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

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

teturousan

2021/03/10 05:14

本当にありがとうございます!ご指摘の点で解決しました。 お粗末な質問にも関わらずご回答いただき、大変ありがとうございます。 文字が一文字が入っているだけで機能しない点に驚きを感じました。
tanat

2021/03/10 05:33

解決したようでよかったです。 > 文字が一文字が入っているだけで機能しない点に驚きを感じました。 これはプログラム言語なら大体はそうなので、開発環境の補助を受けながら開発するのがお勧めです。(例えば、文法エラーがあればマークを出してくれます) `PHP 開発環境`とか`PHP VSCode 設定`などで検索して、使いやすい環境を作ってみて下さい。 また、他の方から指摘が入っていますが、教材がかなり古い様に見受けられ、セキュリティ上問題のある記法も多くみられますので、学習されるのであれば、最近の教材(例えば https://prog-8.com/languages/php や 書籍であればどんなに古くても2-3年以内に出版されているものを探してみて下さい) 書籍の場合は実際に書店で読んでみるのがベストですが、書籍名をteratailで検索してみて「質問が多いもの」は避けるのが無難です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問