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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

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回答

1854閲覧

PHP DBへのデータ追加

Chandler_Bing

総合スコア673

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

PHP

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

1グッド

0クリップ

投稿2018/12/23 08:30

PHP

1$staff_name = $_POST['name']; 2 $staff_pass = $_POST['pass']; 3 4 $staff_name = htmlspecialchars($staff_name, ENT_QUOTES, 'UTF-8'); 5 $staff_pass = htmlspecialchars($staff_pass, ENT_QUOTES, 'UTF-8'); 6 7 $dsn = 'mysql:host=localhost:8889;dbname=shop;charest=utf8'; 8 $user = 'tennisuser'; 9 $password = 'password'; 10 11 $db = new PDO($dsn, $user, $password); 12 $db ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 13 $db ->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 14 15 $sql = 'INSERT INTO mst_staff(name, password) VALUES(?, ?)'; 16 $stmt = $db ->prepare($sql); 17 $stmt ->bindParam(1, $staff_name, PDO::PARAM_STR); 18 $stmt ->bindParam(2, $staff_pass, PDO::PARAM_STR); 19 $stmt ->execute($data); 20 $db = null; 21 22 print $staff_name; 23 print 'さんを追加しました<br />';

PHP

1$staff_name = $_POST['name']; 2 $staff_pass = $_POST['pass']; 3 4 $staff_name = htmlspecialchars($staff_name, ENT_QUOTES, 'UTF-8'); 5 $staff_pass = htmlspecialchars($staff_pass, ENT_QUOTES, 'UTF-8'); 6 7 $dsn = 'mysql:host=localhost:8889;dbname=shop;charest=utf8'; 8 $user = 'tennisuser'; 9 $password = 'password'; 10 11 $db = new PDO($dsn, $user, $password); 12 $db ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 13 $db ->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 14 15 $sql = 'INSERT INTO mst_staff(name, password) VALUES(?, ?)'; 16 $stmt = $db ->prepare($sql); 17 $data[] = $staff_name; 18 $data[] = $satff_pass; 19 $stmt ->execute($data); 20 21 22 $db = null; 23 24 print $staff_name; 25 print 'さんを追加しました<br />';

両方ともtry文の中です。上は問題なく機能するのですが下のように配列を使って挿入しようとすると
NULLは挿入できないという旨のエラーが出ます。原因はなんでしょうか。MYSQLとマンプを使用しています。

bochan2👍を押しています

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

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

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

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

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

m.ts10806

2018/12/23 08:34

エラーは要約したりせず原則そのまま提示してくださいね
退会済みユーザー

退会済みユーザー

2018/12/24 01:07

データベースにhtmlspecialchars()で加工した文字列を保存するとハマるよ。htmlとしてデータベースに保存してある文字列を正しく表示するための関数がhtmlspecialchars()なのであって。使い方が逆。
guest

回答2

0

NULLは挿入できない

$data[] = $satff_pass;

typoあり。

それと、
htmlspecialchars()の使い所がおかしいです。
htmlコード上に正しく文字列を表示するためにエスケープするための関数ですので、
データベースに記録する際はエスケープしたものではなく
正しいデータを記録します。
(もちろん、データベース登録用にエスケープする処理も必要になるのですが、
それはhtml用とは別の考えです。)

以下、机上のみ。

php

1 function h($s) { 2 return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 3 } 4 5 $staff_name = filter_input(INPUT_POST, 'name'); 6 $staff_pass = filter_input(INPUT_POST, 'pass'); 7 8 //$staff_name = htmlspecialchars($staff_name, ENT_QUOTES, 'UTF-8'); 9 //$staff_pass = htmlspecialchars($staff_pass, ENT_QUOTES, 'UTF-8'); 10 11 $dsn = 'mysql:host=localhost:8889;dbname=shop;charest=utf8'; 12 $user = 'tennisuser'; 13 $password = 'password'; 14 15 $db = new PDO($dsn, $user, $password); 16 $db ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 17 $db ->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 18 19 // SQL実行前に、POSTデータの検証処理を実行しておく必要がある 20 // 少なくとも、未入力かどうか、文字数、変な記号くらいはチェック。 21 $err_msgs = array(); 22 if ($staff_name === '') { 23 $err_msgs[] = 'nameの入力がない。'; 24 } 25 if ($staff_pass === '') { 26 $err_msgs[] = 'passwordの入力がない。'; 27 } 28 if (strlen($staff_pass) < 8) { 29 $err_msgs[] = 'passwordの文字数が少ない。'; 30 } 31 if (strpos($staff_pass, ' ;!"$&()?') !== FALSE) { 32 $err_msgs[] = 'passwordに使用できない文字を含んでいる。'; 33 } 34 35 if (count($err_msgs) == 0) { 36 $sql = 'INSERT INTO mst_staff(name, password) VALUES(?, ?)'; 37 $stmt = $db ->prepare($sql); 38 $data = array($staff_name, $staff_pass); 39 $stmt ->execute($data); 40 41 echo h($staff_name) . 'さんを追加しました<br />'; 42 } 43 else { 44 echo implode('<br />', $err_msgs); 45 } 46

とか。

投稿2018/12/24 02:36

編集2018/12/24 02:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/12/24 03:26 編集

入力可能な文字種の判定は絶対やること。 その理由は、「SQLインジェクション」攻撃のことを調べて見つけてね。 それと、実業務で使う前提なら、二重登録チェック(おなじnameがすでに登録されていたら拒否)や同じアドレスからの大量登録への防御なども検討するべき。
guest

0

ベストアンサー

質問者さんが下の配列を使って記述されたPHPはPOSTで受けたパラメータが
バインドされていませんので当然NULLになります。
ユーザー名・パスワード・DB名は当方のものになりますので
適宜変更してください。

php

1function h($str) { 2 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 3} 4 5 $staff_name = h($_POST['name']); 6 $staff_pass = h($_POST['pass']); 7 8 $dsn = 'mysql:host=localhost:8889;dbname=testphp;charest=utf8'; 9 $user = 'root'; 10 $password = 'root'; 11 12 $db = new PDO($dsn, $user, $password); 13 $db ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 14 $db ->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 15 $sql = 'INSERT INTO shop(name, pass) VALUES(?, ?)'; 16 17 $stmt = $db ->prepare($sql); 18 $stmt ->bindParam(1, $staff_name, PDO::PARAM_STR); 19 $stmt ->bindParam(2, $staff_pass, PDO::PARAM_STR); 20 21 $stmt ->execute($data); 22 $db = null; 23 24 print $staff_name; 25 print 'さんを追加しました<br />'; 26

投稿2018/12/23 12:47

編集2018/12/24 01:56
bellsmarket

総合スコア62

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

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

Chandler_Bing

2018/12/23 13:16

ありがとうございます。やはりそうですよね 配列で入れる方法なんてのは存在するのですか。
bellsmarket

2018/12/23 13:54 編集

カラム数が増えてくると、1行づつ記述するのは、骨が折れますので、 foreachで$sqlに使用するパラメータ名やbindParamメソッドを ループさせて処理すれば可能です。
退会済みユーザー

退会済みユーザー

2018/12/24 01:29

しつもん、INSERT INTO文の実行のあとに、なぜにfetch()? SELECT文でもないのに。
bellsmarket

2018/12/24 01:55

失礼しました。テスト環境で値を取得が出来たか確認した時の消し忘れです。修正いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問