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

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

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

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

PHP

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

Q&A

解決済

3回答

10649閲覧

mysqlでNOT NULLを設定していて、実際に値が入力されない(NULLを受け取った)場合

pegy

総合スコア243

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/10/02 10:43

編集2018/10/02 10:44

下記の様に$piyoと$hogeをそれぞれmysqlのpiyoとhogeのカラム
に格納する上で、NULLを受け付けないために
phpmyadminのnullチェックマークをチェックしNOT NULLの設定をいたしました。参考記事
phpmyadmin上、NULLにチェックすると構造上、デフォルト値がNULLとなり、NULLがはいとなります。
MYSQL上だけではなく、それ以前にPHPでももちろんissetのチェックはしているのですが念のために
データベース上でも受け付けない様にしております。

しかしながら、実際にpiyoのみを入力した場合でもmysqlはこれを処理してhogeのところは
MYSQL上NULLとなっております。

  1. NOT NULLの設定はNULLデータを受け取った場合エラーを返すものはないのでしょうか?それとも

phpmyadmin上の構造の設定に問題がるのでしょうか?
2) 仮にMYSQLがエラーを返す場合(NULL値を受け付けないのにNULLを受け取った場合)にはどの様な
処理を実行しようとするのでしょうか?1)の状態になってしまっているので、これがあるべき処理なのか
設定に誤りがあるのが判断ができないという状況です。

初心者の質問であり、誠に申し訳ございませんが
よろしくお願い申し上げます。

MYSQL:
Server type: MySQL
サーバのバージョン: 5.6.23-log - MySQL Community Server (GPL)
プロトコルバージョン: 10
PHP
7.1

PHP

1 try{ 2 $stmt = $pdo->prepare('INSERT INTO posting_data (piyo,hoge) VALUES(:piyo,:hoge)'); 3 $stmt->bindParam(':piyo',$piyo,PDO::PARAM_STR); 4 $stmt->bindParam(':hoge',$hoge,PDO::PARAM_STR); 5 $stmt->execute(); 6 }catch(PDOException $e){ 7 exit('データベース接続失敗。'.$e->getMessage()); 8 }

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

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

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

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

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

m.ts10806

2018/10/02 12:07

テーブル定義のCREATE文を提示されたほうが良いのではないでしょうか。エクスポート機能から出力できるはずです。
guest

回答3

0

ベストアンサー

phpmyadminのnullチェックマークをチェックしNOT NULLの設定をいたしました。参考記事

phpmyadmin上、NULLにチェックすると構造上、デフォルト値がNULLとなり、NULLがはいとなります。

nullチェックマークにチェックを入れるとNOT NULLではなく、NULL可の意味だったと思いますが。
その参考記事、古かったりすると現状の動作と異なる可能性があるのでなるべく最新の記事を見たほうが良いですよ。

また、NULLがデータとしてきた場合は基本にエラーを出すはずですが、
デフォルト値が設定されていればそちらの値が設定されるはずです。

投稿2018/10/02 10:56

dice142

総合スコア5158

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

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

pegy

2018/10/02 11:06

コメントありがとうございます。 phpmyadmin上はNULLのチェックマークがあり、 チェックすると NULLの列は「はい」デフォルト値の列は「NULL」 チェックしないと NULLの列は「いいえ」デフォルト値の列は「なし」 になります。何れにしても、NULLを受け付けないという私が解釈していたNOT NULLの設定とは相違しておりました。 下記のコメントにも残したのですが、DBとして、万が一全体入力がない値がある場合のINSERT INTOをはじくためにNOT NULLに着目していたのですが、それ自体が間違いなのかもしれませんが。。
dice142

2018/10/02 11:16

「NULL」が「はい」は「NULL可」の意味で、NOT NULLではありません。 データベースでは入力制限はなるべくすべきです。 プログラムの実装に任せるのは漏れが出る可能性があり、危険です。
pegy

2018/10/02 11:27

ありがとうございます。 後者のNULLの列は「いいえ」デフォルト値の列は「なし」でも 何も入力されなかったuserからのデータを受け取ってしまうのですが、これは""(空)であり、NULLではないからということでしょうか? ともすれば、NOT NULLは入力漏れをデータベースで制限するという役割を果たさず他の方法によるべきということになるのでしょうか。 重ねて誠に申し訳ございませんが、よろしくお願い申し上げます。
dice142

2018/10/02 11:32

受け取ってしまうというのはデータベースにデータが格納されるということでしょうか?
pegy

2018/10/02 11:44

はい、その通りでございます。 現在、並行していろいろ試しているのですが、 NULLの列は「いいえ」デフォルト値の列は「なし」 $hoge=null; として、処理を実行すると確かに データベース接続失敗。SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'hoge' cannot be null のエラーが返されることが確認できたため、おっしゃる通り、NULLのチェックを外すことが「NULL不許可」の意味であり、返されるエラーはこの通りSQLから投げられエラーが表示され、MYSQL上の処理が実行されないことを意味するものであると思います。 また、一方で $hoge="null"等文字列で入力されることは許可することがわかりました。 また、他方で $hoge=""は許可されることから、元々の目的でuserから入力されるべき値が入力されていないことをデータベースでチェックするということは意味しないのではと考えておりますがいかがでしょうか? 例えば、開発者視点からすると(hoge,piyo) VALUE(:hoge)など構文間違いでNULLが生じるので意味があるのですが、ユーザー視点(入力チェックという点で)でもNOT NULLが設定されることがあるのでしょうか?
dice142

2018/10/02 12:24

データベースでチェックできることはデータ型の違いとNULLがほとんどです。 それ以外はプログラム側で確認する必要があります。 例えば日付の範囲とか文字制限とかですね。 なにやらNULLをエラーと捉えているようですが、 NULLはあくまでも未入力の様な意味合いです。
pegy

2018/10/02 12:28

重ねてコメントをいただきありがとうございます。 「NULLはあくまでも未入力の様な意味合いです。」 とすると初心者であるため$hoge="";(ユーザー未入力)を防ぐことができると判断してしまいそうになるのですがおそらく挙動を確認するとそのお湯なことではないと思います。 MYSQL(RDB)上のNULLをもう少し勉強してみます。 大変、ご迷惑をおかけいたしました。
dice142

2018/10/02 12:33 編集

筆記テストで名前を書くのと名前を書いていない(空文字)とテスト用紙がそもそもない(NULL)ような違いです。 いろんな例なり説明を見て理解された方が良いですね。
pegy

2018/10/02 12:40

コメントありがとうございます。 承知をいたしました。一旦、気持ちを切り替えて関連するマニュアルと記事を もう一度、心機一転眺めてみようと思います。 夜分にもかかわらず、お付き合いをいただき、誠にありがとうございました。
guest

0

  1. NOT NULLの設定はNULLデータを受け取った場合エラーを返すものはないのでしょうか?それとも

phpmyadmin上の構造の設定に問題がるのでしょうか?
→参考元に誤りがあり、nullのところのチェックをつけるとnullを許容してしまう。またデフォルト値のプルダウンはチェックをつけた時点でnullになるかもしれないが、後から変更可能。参考元のおかしさをphpMyAdminの構造に帰責しないでほしい。
2. 仮にMYSQLがエラーを返す場合(NULL値を受け付けないのにNULLを受け取った場合)にはどの様な
処理を実行しようとするのでしょうか?
→エラーが返されて、insertされない

  • not nullの意味

nullは値がないことを表現しており、値がないことを許さないことには一定の意味がある。たとえ空文字("")が入ったとしても。
また、null値はプログラム側でエラーを起こしやすい、ハンドリングしにくい値なので、最低でも文字列("")になっていることが保証できることには意味がある。

  • 空文字が入ってしまうことのリスクが防げない

入力値として""が不正というのは、アプリの制約。"20"は年齢としては不正ではないかもしれないが、メールアドレスとしてなら不正。
intやdatetimeなどの型を適切に利用したり、外部参照キーを利用したり、unique制約を利用することで、不正な値を防ぐこともできるが、全てのあり得る入力をDBの既存機構だけで防ごうという想定には無理がある

投稿2018/10/02 12:05

papinianus

総合スコア12705

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

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

pegy

2018/10/02 12:38

コメントをいただきありがとうございます。 まだNULLでのプログラム側の問題に直面したことがないため、今後もしかしたら実務の中でNULLであるかNOT NULLであるのかの違いを感じることができるかもしれません。DB側で防止されるべきものとプログラム(PHP)側での役割分担を少しずつ学んでいこうと思います。 少なくとも、本件の目的のユーザー入力値において未入力を許可しない、つまりinput type="text"において、何も入力されず$hoge="";になる場合を防ぎたい場合には、DB側でこれを監視するのはあまり適切ではないことように思われます。 JSとPHPでこれを防ぐことができると思いますので、そのように実装いたします。 御礼申し上げます。
papinianus

2018/10/02 16:24

空を防ぎたいだけならhtmlでinputにrequiredの属性をつければ普通には空状態での送信ができなくなります。 ただ一般にPOSTで送信される値はどんな入力もありえると考えてチェックする必要があります
guest

0

NULLと""(空文字)は違います。それは理解されていますか?
phpmyadminでデータ表示したときにホントのNULLはイタリック体で表示されます。
もしpiyoとhogeがそれぞれnot nullの属性ならば、絶対にnullは入りません
もちろん"NULL"という文字列は入る可能性はありますが、ご提示のSQLでは
"NULL"という文字が入ることも無いでしょう

投稿2018/10/02 10:51

yambejp

総合スコア114814

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

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

pegy

2018/10/02 11:02

コメントありがとうございます。 おそらくNULLと空文字を現状正確に理解できていないと思います。これはすぐに調べてみますが、 phpmyadmonの構造上ではイタリックでNULLのデフォルト値に記載れております。 そもそも、意味を取り違えているのかもしれませんが、目的として 「hogeに何も格納されないことは許可しない(文字列としてのNULLは許可する)」ことであるとすればNOT NULLの設定自体が正しくないということなのでしょうか? さらには大前提としてこの様な値のチェックはデータベース上でやるべきことではないのでしょうか? よろしくお願い申し上げます。
pegy

2018/10/02 11:15

今、検索していたところ、SQLサーバー上 ""=NULL は等価ではないことを理解しました。この点理解ができておりませんでした。 仮にform type="text"からなんらの値も受け取らずにMYSQLにINSERTされる場合""(空)が入力されようとするのかNULLが入力されようとするのかを調べるべくINSERT INTO後の値をqueryで出力してdumpすると""(空)なのですが、これはINSERT INTOした時の状態と等しいものとみなしてよいのでしょうか? 厳密にINSERT INTOした時のMYSQL上のデータの状態をdumpする方法がわからずに現状、queryで出力後から検証しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問