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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

5123閲覧

マスタ登録でint型空欄にNULLを入れたい

kaito_fl

総合スコア38

SQL

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

PHP

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

0グッド

0クリップ

投稿2016/03/30 10:07

php

1 2$family_name = $_POST['family_name']; 3$first_name = $_POST['first_name']; 4$sex = $_POST['sex']; 5$grading = $_POST['grading']; 6$email = $_POST['email']; 7 8$sql = "insert into account("; 9$sql .= "family_name,"; 10$sql .= "first_name,"; 11$sql .= "sex,"; 12$sql .= "grading,"; 13$sql .= "email,"; 14 15 16$sql .="values(\"" 17 .$family_name."\",\"" 18 .$first_name."\"," 19 .$sex."," 20 .$grading.",\"" 21 .$email."\")"; 22

上記は現在作成中のコードの一部です。
htmlからphp経由でデータベースに値を入力したいのですが、SQL実行の際にエラーになります。

$SQLを出力すると、
insert into m_account(family_name,first_name,sex,grading,email)values("","",,,"");
と出力されます。

$sexと$gradingはint型のため""がつけられ素、そのためエラーになるようです。
なので、空欄の場合にnullもしくは空文字を入力したいと思っているのですが、わかりませんでした。

お力添えをお願いします。
足りない情報等あれば教えてください。その都度補足します。

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

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

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

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

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

guest

回答2

0

SQL インジェクション未対策で、セキュリティ的に問題ありなコードですね。

int 型に null を入れるだけなら、次のような sql で、入ります。 (num1 が、int 型とすると)

SQL

1insert into table1 ( num1 ) value ( NULL );

投稿2016/03/30 10:36

CHERRY

総合スコア25171

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

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

0

一応、次のようにすればできます。

php

1$family_name = $_POST['family_name']; 2$first_name = $_POST['first_name']; 3$sex = $_POST['sex']; 4if(empty($sex)){ 5 $sex = 'NULL'; 6} 7$grading = $_POST['grading']; 8if(empty($grading)){ 9 $grading = 'NULL'; 10} 11$email = $_POST['email']; 12 13$sql = "insert into account("; 14$sql .= "family_name,"; 15$sql .= "first_name,"; 16$sql .= "sex,"; 17$sql .= "grading,"; 18$sql .= "email,"; 19 20 21$sql .="values(\"" 22 .$family_name."\",\"" 23 .$first_name."\"," 24 .$sex."," 25 .$grading.",\"" 26 .$email."\")";

ですが、POSTされてきたものをそのままSQLに利用するのは大変危険です。
プリペアドステートメントの利用やエスケープする必要性があります。


指摘があったので修正

php

1$family_name = $_POST['family_name']; 2$first_name = $_POST['first_name']; 3$sex = $_POST['sex']; 4if(!isset($sex)){ 5 $sex = 'NULL'; 6} 7$grading = $_POST['grading']; 8if(!isset($grading)){ 9 $grading = 'NULL'; 10} 11$email = $_POST['email']; 12 13$sql = "insert into account("; 14$sql .= "family_name,"; 15$sql .= "first_name,"; 16$sql .= "sex,"; 17$sql .= "grading,"; 18$sql .= "email,"; 19 20 21$sql .="values(\"" 22 .$family_name."\",\"" 23 .$first_name."\"," 24 .$sex."," 25 .$grading.",\"" 26 .$email."\")";

もう一度修正 ついでにSQLを作成する部分にも間違いがあったので修正

php

1$family_name = $_POST['family_name']; 2$first_name = $_POST['first_name']; 3$sex = $_POST['sex']; 4if(is_null($sex) || $sex === ''){ 5 $sex = 'NULL'; 6} 7$grading = $_POST['grading']; 8if(is_null($grading) || $grading === ''){ 9 $grading = 'NULL'; 10} 11$email = $_POST['email']; 12 13$sql = "insert into account("; 14$sql .= "family_name,"; 15$sql .= "first_name,"; 16$sql .= "sex,"; 17$sql .= "grading,"; 18$sql .= "email) "; 19 20 21$sql .="values(\"" 22 .$family_name."\",\"" 23 .$first_name."\"," 24 .$sex."," 25 .$grading.",\"" 26 .$email."\")";

投稿2016/03/30 10:31

編集2016/03/30 10:53
orange0190

総合スコア1698

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

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

orange0190

2016/03/30 10:43

ああ、そうですね。 issetにするべきですね。
orange0190

2016/03/30 10:50

もしかして、issetのみだとダメかな? 念のためもう一度修正します。
KiyoshiMotoki

2016/03/30 11:05

> もしかして、issetのみだとダメかな? そうですね。 issetだと、今度は空文字列("")のときにtrueを返却してしまいますので。 > if(is_null($sex) || $sex === '') これなら、問題ないかと思います。 テストコード <?php $tests = array(   null,   '',   0,   '0',   'hoge' ); foreach ($tests as $test) {   var_dump(is_null($test) || $test === ''); } 実行結果 bool(true) bool(true) bool(false) bool(false) bool(false)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問