🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

3回答

3037閲覧

PHP: INSERT INTO の行でエラーが出ていて解決できません。

y-sasaki

総合スコア54

SQL

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

1クリップ

投稿2021/01/03 18:52

34行目の  INSERT INTO の部分でエラーメッセージがあるのですが、分かりません。
他の箇所がおかしいのかもです。

エラーメッセージ
Parse error: syntax error, unexpected variable "$sql" in C:\xampp\htdocs\php\chat2\index.php on line 34

ソースは

PHP

1<html lang="ja"> 2<head> 3 <meta charset="utf-8"> 4 <title>入力フォーム</title> 5</head> 6<body> 7<form method="POST" action=""> 8 名前 <input name="name" type="text"> 9 出身 <input name="text" type="text"> 10 <input type="submit" value="送信"> 11</form> 12 13<?php 14 15$dsn = 'mysql:dbname=chatlog;host=localhost'; 16$user = 'testuser'; 17$password = 'yasushi'; 18 19try { 20 $dbh = new PDO($dsn, $user, $password); 21 echo "接続成功\n"; 22} 23 24 25catch (PDOException $e) { 26 echo "接続失敗: " . $e->getMessage() . "\n"; 27 exit(); 28} 29 30 $name = $_POST['name']; 31$log = $_POST['text'] 32 33 // SQL作成 34 $sql = "INSERT INTO chatlog (id, name, log) VALUES (null, '$name', '$log')"; 35 36 // SQL実行 37 $res = $dbh->query($sql); 38 39 40 $data = "SELECT * from chatlog"; 41 42 $stmt = $dbh->query($data); 43 $result = $stmt->fetchAll(); 44 45 46 $stmt = $dbh->query($data); 47$log_result = $stmt->fetchAll(); 48 49 50 51$i = 0; 52while($i <30){ 53$i++; 54 echo('名前:'); 55print_r ($result[$i][1]); 56 57 echo('会話:'); 58 print_r($log_result[$i][2]); 59echo '<br>'; 60} 61 62 63 64 $dbh = null; 65 66 67 ?> 68 69 70</body> 71</html> 72

34行目は
$sql = "INSERT INTO chatlog (id, name, log) VALUES (null, '$name', '$log')"; の部分です。

よろしくお願いします。

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

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

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

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

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

m.ts10806

2021/01/03 21:14

前の質問の回答読んでください。 だから起きてます。
m.ts10806

2021/01/03 21:22 編集

というか、まだ、自身がやりたいことをできるほどの技量に達してないように見受けられます。 コードは書いたとおりにしか動かないので、基礎を飛ばしていてはいつまでもまともに動くようにはならないので、インジェクション対策の前に、文字列操作、配列操作あたりをきっちりおさえておく必要があります。 エラーを読む、デバッグをする、PHPマニュアルを活用する この3点なしにはずっと初心者を抜け出せません
y-sasaki

2021/01/04 01:59

叩かれるのは、承知で書きますが、 そのようなお説教はいりません。 ここで、求めてるのは、質問に対する答えだけです。 始めたばかりなので、技量がないのは承知です。 ただ、アウトプットの方が勉強になると思い、作ってるだけです。 目標物は、あまり明確に決めてはいません。小さなプログラムで始めて大きく育てています。最初は「入力フォームから得られたデータを表示する」というだけものでした。それにDBなどを追加していき現在に至ります。確実に動くものを作っていってるだけです。つまづいたら、ここで、質問しています。 では、失礼します。
m.ts10806

2021/01/04 02:52 編集

いずれにしても折角ついた回答を読まないままというのは如何なものでしょうか。指摘しているのはそこ。ご自身の回答についた指摘にも反応なし。 説教ではなく、知見を得る気はないのか?と問うています。 具体的に言うと、私が例えば5年かけて習得したことを数カ月で習得できるチャンスを自ら捨てているのではという話です。 きちんと回答を吸収できていれば起きていなかった問題が、自分だけのやり方で進めてしまったために出てしまい、ご自身が質問して回答を得る時間含めて同じ指摘を別の人がするという無駄が発生してしまっている事態に何も感じませんか? スタンスにとやかく言うわけではないですが、己の道だけを貫きたいなら他者を巻き込むのは迷惑行為に近しいということを認識してもらいたいわけです。 同じようなやり方続けていたらアドバイスをする人も減るし、あなたがやりたいことも進まないし、デメリットしかないと思います。
退会済みユーザー

退会済みユーザー

2021/01/04 04:31

無償で貢献している人たちの努力を踏みにじるような考え方なら、このサイトの利用をしないでいただきたいと個人的にお願い申し上げます。回答する人たちもロボットじゃなく感情を持つ人間ですよ。単にスコアを稼ぎたいだけじゃない、そこを越えた考えを持つから回答をつけるのをやってるのであって、反省も学習も向上心もない質問者につきあうほど暇じゃありませんよ。
phper.k

2021/01/04 04:34

「ここで、求めてるのは、質問に対する答えだけです。」 ↑これはないわ〜
退会済みユーザー

退会済みユーザー

2021/01/04 04:35

ちなみに今回のエラーなんて、例えばVScodeでPHP開発環境を立ち上げさえすれば、簡単に見つかるようなものだし、3v4l https://3v4l.org/ ってサイトにかけてもすぐ見つかる単純なものなの。自力で解決させる努力すらしないで、「つまづいたら、ここで、質問しています」ではそのうち誰も付き合ってくれなくなるよ。
y-sasaki

2021/01/04 08:27

回答もコメントも、ちゃんと読んでますよ。 とりあえず、動くものを作りたかったので、 セキュリティ的なところ?? その他細かい点は 後回しにしてただけです。 あとは、皆さんのおっしゃる通りだと思います。 争っても、無駄なので、 この辺で失礼いたします。
m.ts10806

2021/01/04 09:56

争うつもりはないですよ。 ただ、DBに入りたいならPHPの構文エラー程度で他人を頼らないようになってからにしてください。 作りたいものだけを追い求めても、作りたいものは出来上がりません。 王道はないので基礎もできてない状態で外部システムであるDBを扱うのは早すぎます。
tanat

2021/01/04 10:34

>叩かれるのは、承知で書きますが、 そのようなお説教はいりません。 ここで、求めてるのは、質問に対する答えだけです。 始めたばかりなので、技量がないのは承知です。 ただ、アウトプットの方が勉強になると思い、作ってるだけです。 次回以降はこの旨を質問の最初に明記して頂けると認識のすれ違いが無くなって良いかと思いますよ。
guest

回答3

0

その書き方ではSQLインジェクションの危険があるので、プリペアドステートメントとバインド変数を使う書き方に修正しましょう。
SQLインジェクション
prepare


追記
前の質問で既に指摘されていますね。
指摘を受けてプログラムを修正していればこの質問は不要だったのに。。。

投稿2021/01/03 19:15

編集2021/01/03 19:42
javahack

総合スコア1088

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

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

0

流れ的にはこんな感じで

投稿2021/01/04 01:03

yambejp

総合スコア116661

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

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

yambejp

2021/01/04 01:04 編集

$name = filter_input(INPUT_POST,'name'); $log = filter_input(INPUT_POST,'text'); $pdo = new PDO($dsn, $user,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(!empty($name) and !empty($log)){ $data=[$name,$log]; try { $sql = "INSERT INTO chatlog (id, name, log) VALUES (null,?,?)"; $stmt = $pdo->prepare($sql); $stmt->execute($data); }catch (PDOException $e) { die( "接続失敗: " . $e->getMessage() ); } } try { $sql = "SELECT * from chatlog"; $stmt = $pdo->query($sql); $result = $stmt->fetchAll(); print_r($result); }catch{ die( "接続失敗: " . $e->getMessage() ); }
guest

0

ベストアンサー

php

1$log = $_POST['text']

「;」足りないんだけど。

SQL文字列の中に変数を直接展開するやり方はやめて、
prepare→bindValue→executeの流れでやらないと、
SQLインジェクションを招きかねないです。
SQLインジェクションについて - Qiita

PHPでデータベースに接続するときのまとめ - Qiita

投稿2021/01/04 04:24

編集2021/01/04 04:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問