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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

3回答

4599閲覧

PHPでSessionの値をMySQLにInsertする方法について

balls

総合スコア40

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2019/02/04 03:48

下記のコードを試したのですが、エラーが表示しデータベースにインサートできませんでしたので、

PHP

1$sql = "INSERT INTO `members` (`name`, `email`, `password`, `picture`, `created`) 2 VALUES ('$_SESSION["join"]["name"]', '$_SESSION["join"]["email"]', '$_SESSION["join"]["password"]', '$_SESSION["join"]["image"]', '$memberDate')"; 3 4 5if ($conn->query($sql) === TRUE) { 6 echo "New record created successfully"; 7} else { 8 echo "Error: " . $sql . "<br>" . $conn->error; 9}

下記のコードを試したところ、うまくいきました。
ただ、一度sessionの値を定義しないといけないので、ちょっと面倒な気がします。
上記コードのように、直接sessionの値をインサートできないでしょうか?

PHP

1$memberName = $_SESSION["join"]["name"]; 2$memberEmail = $_SESSION["join"]["email"]; 3$memberPassword = $_SESSION["join"]["password"]; 4$memberPicture = $_SESSION["join"]["image"]; 5$memberDate = date('Y-m-d H:i:s'); 6 7$sql = "INSERT INTO `members` (`name`, `email`, `password`, `picture`, `created`) 8 VALUES ('$memberName', '$memberEmail', '$memberPassword', '$memberPicture', '$memberDate')"; 9 10 11if ($conn->query($sql) === TRUE) { 12 echo "New record created successfully"; 13} else { 14 echo "Error: " . $sql . "<br>" . $conn->error; 15} 16 17$conn->close();

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

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

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

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

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

guest

回答3

0

ベストアンサー

直接の原因は単なる構文エラーです。
PHPにおいてクォーテーションは特別な意味を持ちます。「文字列である」という区切りですね。
その中で連想配列をキー指定で使いたい場合、そのキーの指定もダブルクォーテーションで使ってしまうと
プログラムは正しく解釈できなくなるわけですね。
また、単なる文字列を入れただけの変数を使いたいときももしその前後にアルファベットが続いた場合、
どこからどこまでが変数なのか分からなくなります。
ダブルクォーテーション(やヒアドキュメント)の中で変数を使いたい場合は{}で変数を囲うのを強くすすめます。

php

1$sql = "INSERT INTO `members` (`name`, `email`, `password`, `picture`, `created`) 2 VALUES ('{$_SESSION["join"]["name"]}', '{$_SESSION["join"]["email"]}', '{$_SESSION["join"]["password"]}', '{$_SESSION["join"]["image"]}', '{$memberDate}')";

ただ、.で文字列連結するのが最も明示的です。

php

1$sql = "INSERT INTO `members` (`name`, `email`, `password`, `picture`, `created`) 2 VALUES ('".$_SESSION["join"]["name"]."', '".$_SESSION["join"]["email"]."', '".$_SESSION["join"]["password"]."', '".$_SESSION["join"]["image"]."', '".$memberDate."')";

下記のような質問も参考にしてください


ただ、既に指摘があるようにそのままSQLに突っ込むのはSQLインジェクションの脅威にさらされます。
悪い人が使えばDBの情報を全て引き出したり、DBを削除するようなSQLを埋め込めたりできるものです。

PDOに切り替えるのが安全ですが、mysqliでも同等の機能はあるので、
mysqli::preparemysqli::bind_paramでの対応をご検討ください。

投稿2019/02/04 04:43

編集2019/02/04 04:45
m.ts10806

総合スコア80850

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

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

0

環境はPDOでしょうか?
とりあえずエラーが拾えるようにするのと
prepareで処理してみてください

PHP

1try{ 2 $pdo = new PDO($dsn, $user,$password); 3 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 $sql = "INSERT INTO `members` (`name`, `email`, `password`, `picture`, `created`) "; 5 $sql.= "VALUES (?,?,?,?,?)"; 6 $stmt = $pdo->prepare($sql); 7 $stmt->execute([$memberName, $memberEmail, $memberPassword, $memberPicture, $memberDate]); 8}catch(PDOException $e){ 9 die($e->getMessage()); 10}

投稿2019/02/04 03:57

yambejp

総合スコア114814

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

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

balls

2019/02/04 04:06

なるほど。 try & catchでエラー出してみるとよさそうですね。
balls

2019/02/04 04:06

環境は、PDOではなく、mysqliです。
yambejp

2019/02/04 04:12

mysqliですか・・・素人が手を出すにはあまりオススメできませんが とりあえずmysqliでもbindParamなどすればprepareで処理ができます
guest

0

ただの構文エラーだと思いますよ。
エラーをちゃんと見ると良いです。

あと、この方向性で修正すると SQL インジェクションが可能です。
合わせて修正したほうが良いです。

投稿2019/02/04 03:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

balls

2019/02/04 04:07

SQL インジェクション> そうなんですか? セキュリティのことは全然分かってないですね。。そちらも勉強必要そうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問