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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

927閲覧

登録フォームからデータベースへの登録

Atsku

総合スコア3

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2021/12/20 03:26

前提・実現したいこと

PHPを用いて登録フォームから情報を入力し、あらかじめ用意しておいたデータベースのテーブルにデータを登録するというものを、下記サイトを参考にして作成しています。
参考サイト https://develog.hatenablog.com/entry/2016/12/21/084007
登録フォーム、確認フォーム、実際にデータベースに登録する3つのPHPを用いるものになっています。

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

登録フォーム、確認フォームまでは、正しく動作しているのですが、最後のデータベースに登録するPHPファイルのみが下記のエラーが表示されます。

Parse error: syntax error, unexpected identifier "INTO" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 23

該当のソースコード

登録フォーム、確認フォームともソースコードは質問する際の文字数の関係で入れることができませんでした。

データベース登録用

php

1<?php 2 3 session_start(); 4 5 $damage_type=htmlspecialchars($_POST['damage_type'], ENT_QUOTES, 'UTF-8'); 6 $damage_layer=htmlspecialchars($_POST['damage_type'], ENT_QUOTES, 'UTF-8'); 7 $year=$_POST['year']; 8 $latitude=htmlspecialchars($_POST['latitude'], ENT_QUOTES, 'UTF-8'); 9 $longitude=htmlspecialchars($_POST['longitude'], ENT_QUOTES, 'UTF-8'); 10 $address=htmlspecialchars($_POST['address'], ENT_QUOTES, 'UTF-8'); 11 $size=htmlspecialchars($_POST['size'], ENT_QUOTES, 'UTF-8'); 12 $view=htmlspecialchars($_POST['view'], ENT_QUOTES, 'UTF-8'); 13 $repair=htmlspecialchars($_POST['repair'], ENT_QUOTES, 'UTF-8'); 14 $image=htmlspecialchars($_POST['image'], ENT_QUOTES, 'UTF-8'); 15 $potree=htmlspecialchars($_POST['potree'], ENT_QUOTES, 'UTF-8'); 16 17 $dsn = 'mysql:dbname=Damage;host=localhost'; 18 $user = 'root'; 19 $password = ''; 20 21 $conn = new PDO($dsn, $user, $password); 22 23 $sql = INSERT INTO data(Year, Damage_Type, ,Damage_Layer, Damage_Address, Damage_Latitude, Damage_Longitude, Damage_Size, Damage_View, Repair_Record, Image_URL, Potree_URL) 24 VALUES("'.$year.'","'.$damage_type.'","'.$damage_layer.'","'.$address.'","'.$latitude.'","'.$longitude.'","'.$size.'","'.$view.'","'.$repair.'","'.$image.'","'.$potree.'"); 25 26 $stmt = $conn -> prepare($sql); 27 $stmt -> execute(); 28?> 29<!DOCTYPE HTML> 30<html lang="ja"> 31<head> 32 <meta charset="utf-8"> 33 <title>ユーザー登録フォーム・登録ページ</title> 34 <style> 35 p { 36 margin-left: 50px; 37 } 38 </style> 39</head> 40 41<body> 42 <p>登録完了</p> 43 <p><a href="input.php">入力画面に戻る</a></p> 44</body> 45</html> 46 47 48

試したこと

データベース登録用phpファイルの23,24行目の”、’などを消してみたりしたのですが、変わらずでした。

PHP

1 $sql = INSERT INTO data(Year, Damage_Type, ,Damage_Layer, Damage_Address, Damage_Latitude, Damage_Longitude, Damage_Size, Damage_View, Repair_Record, Image_URL, Potree_URL) 2 VALUES("'.$year.'","'.$damage_type.'","'.$damage_layer.'","'.$address.'","'.$latitude.'","'.$longitude.'","'.$size.'","'.$view.'","'.$repair.'","'.$image.'","'.$potree.'");

補足情報(FW/ツールのバージョンなど)

質問内容が多くなってしまい申し訳ありません。不足するところがあれば追加させていただきます。

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

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

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

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

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

guest

回答2

0

自己解決

php

1 $damage_type=htmlspecialchars($_POST['damage_type'], ENT_QUOTES, 'UTF-8'); 2 $damage_layer=htmlspecialchars($_POST['damage_type'], ENT_QUOTES, 'UTF-8'); 3 $year=$_POST['year']; 4 $latitude=htmlspecialchars($_POST['latitude'], ENT_QUOTES, 'UTF-8'); 5 $longitude=htmlspecialchars($_POST['longitude'], ENT_QUOTES, 'UTF-8'); 6 $address=htmlspecialchars($_POST['address'], ENT_QUOTES, 'UTF-8'); 7 $size=htmlspecialchars($_POST['size'], ENT_QUOTES, 'UTF-8'); 8 $view=htmlspecialchars($_POST['view'], ENT_QUOTES, 'UTF-8'); 9 $repair=htmlspecialchars($_POST['repair'], ENT_QUOTES, 'UTF-8'); 10 $image=htmlspecialchars($_POST['image'], ENT_QUOTES, 'UTF-8'); 11 $potree=htmlspecialchars($_POST['potree'], ENT_QUOTES, 'UTF-8');

PHP

1 $year=$_SESSION['year']; 2 $damage_type=htmlspecialchars($_SESSION['damage_type'], ENT_QUOTES, 'UTF-8'); 3 $damage_layer=htmlspecialchars($_SESSION['damage_type'], ENT_QUOTES, 'UTF-8'); 4 $latitude=htmlspecialchars($_SESSION['latitude'], ENT_QUOTES, 'UTF-8'); 5 $longitude=htmlspecialchars($_SESSION['longitude'], ENT_QUOTES, 'UTF-8'); 6 $address=htmlspecialchars($_SESSION['address'], ENT_QUOTES, 'UTF-8'); 7 $size=htmlspecialchars($_SESSION['size'], ENT_QUOTES, 'UTF-8'); 8 $view=htmlspecialchars($_SESSION['view'], ENT_QUOTES, 'UTF-8'); 9 $repair=htmlspecialchars($_SESSION['repair'], ENT_QUOTES, 'UTF-8'); 10 $image=htmlspecialchars($_SESSION['image'], ENT_QUOTES, 'UTF-8'); 11 $potree=htmlspecialchars($_SESSION['potree'], ENT_QUOTES, 'UTF-8');

に変更することでエラーが解消されました。

投稿2021/12/21 06:01

Atsku

総合スコア3

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

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

0

SQLもPHPにとってはそういう文字列の集合体に過ぎないので、文字列として扱ってください。

ただ、現状だと最低でも2点マズイ実装があります。

  • DBにSQLエスケープせず値を入れようとしている

→SQLインジェクション対策

  • DBにhtmlエスケープした(加工した)値を入れようとしている

→htmlエスケープは画面表示時に行うもの(XSS対策)

もう一点

→処理が必ず想定通り完了するわけでもないのに「登録完了」を固定で出してるのも実装としては問題あり

投稿2021/12/20 04:30

編集2021/12/20 04:54
m.ts10806

総合スコア80875

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

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

Atsku

2021/12/20 04:41

$sql=の部分を'で囲み文字列として、再度実行してみると下記のようなエラーが出ました Warning: Undefined array key "damage_type" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 5 Warning: Undefined array key "damage_type" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 6 Warning: Undefined array key "year" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 7 Warning: Undefined array key "latitude" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 8 Warning: Undefined array key "longitude" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 9 Warning: Undefined array key "address" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 10 Warning: Undefined array key "size" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 11 Warning: Undefined array key "view" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 12 Warning: Undefined array key "repair" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 13 Warning: Undefined array key "image" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 14 Warning: Undefined array key "potree" in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 15 Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'Damage_Layer, Damage_Address, Damage_Latitude, Damage_Longitude, Damage_Size,...' at line 1 in E:\Atsushi\XAMPP\htdocs\Map\submit.php:27 Stack trace: #0 E:\Atsushi\XAMPP\htdocs\Map\submit.php(27): PDOStatement->execute() #1 {main} thrown in E:\Atsushi\XAMPP\htdocs\Map\submit.php on line 27 これはおっしゃっている2点のマズイ実装が影響しているのでしょうか? PHPは最近触り始めたので、分からないことが多く申し訳ありません。
m.ts10806

2021/12/20 04:52

>2点のマズイ実装が影響しているのでしょうか? いいえ。全く関係ないです。 列挙した2点は「例え想定通りに動いたとしても」という前提のもと「セキュリティ的に問題のある実装」です。 Undefined array key自体は全く珍しくないものなので、調べたほうが早いくらいです。
Atsku

2021/12/21 05:59

いろいろ試行錯誤していて、返信が遅くなってしまい申し訳ございません。 S_POSTのところの記述が間違っていて、正しく値が受け取れていないことが原因でした。 >いいえ。全く関係ないです。 列挙した2点は「例え想定通りに動いたとしても」という前提のもと「セキュリティ的に問題のある実装」です 自分だけで使用するなら、この2点については気にしなくてよいということでしょうか?
m.ts10806

2021/12/21 06:25

>S_POST $_POSTです。 細かいところですが、雑な理解や解釈をしているとプログラム動きません。 >自分だけで使用するなら、この2点については気にしなくてよいということでしょうか? なにかの課題なら方針は出題者やカリキュラム次第になりますが、知らないと損しかないので「気にしなくてよい」というのは違うと思います。
Atsku

2021/12/21 07:54

>$_POSTです。 細かいところですが、雑な理解や解釈をしているとプログラム動きません。 打ち間違えていました。申し訳ありません。 >なにかの課題なら方針は出題者やカリキュラム次第になりますが、知らないと損しかないので「気にしなくてよい」というのは違うと思います。 ありがとうございます。 まだまだ知らないことばかりなので、勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問