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

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

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

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

phpMyAdmin

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

PHP

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

Q&A

解決済

2回答

742閲覧

DEFAULTのCURRENT_TIMESTAMPが作動しない

kalon

総合スコア198

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

1クリップ

投稿2018/04/17 15:03

編集2018/04/18 00:40

いつもお世話になっております。

実行環境は以下の通りです:
PHP:7.2.1
phpMyAdmin:4.7.7
MySQL:5.6.38

このようなテーブルを作成しました。
イメージ説明

名前limit_startのデフォルト値をCURRENT_TIMESTAMPにしているのですが、postすると以下のように
0000-00-00 00:00:00という値が挿入されてしまいます。どうしたらpostした時間が自動挿入されるでしょうか?

イメージ説明

post側のコード

PHP

1function insertSQL($post1, $post2) { 2 $user = "root"; 3 $pass = "root"; 4 $dbh = new PDO('mysql:host=localhost;dbname=hozon;charset=utf8', $user, $pass); 5 $stmt = $dbh->prepare("insert into hozon values ('', :prod_name, '', :limit_end)"); 6 $stmt->bindParam(':prod_name', $post1, PDO::PARAM_STR); 7 $stmt->bindParam(':limit_end', $post2, PDO::PARAM_STR); 8 $stmt-> execute(); 9 $stmt = NULL; 10} 11 12if (isset($_POST["submit"])){ 13 insertSQL($_POST["prod_name"], $_POST["limit_end"]); 14}

postするform

HTML

1<form action="index.php" method="post"> 2 <input type="hidden" name="id" class=""> 3 <input type="text" name="prod_name" placeholder="商品名"> 4 <input type="hidden" name="limit_start"> 5 <input type="text" name="limit_end" placeholder="期限">日 6 <input type="submit" name="submit" value="登録"> 7</form>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/17 15:17

NULL を故意的にインサートしたからじゃないかな
kalon

2018/04/17 15:22 編集

コメントありがとうございます。何をインサートすれば良いのでしょうか?
kalon

2018/04/17 21:41

試しに、「$stmt = $dbh->prepare("insert into hozon values ('', :prod_name, '2001-02-16 20:38:40', :limit_end)");」と入力したところ、limit_startカラムに日付が入りました。
kalon

2018/04/17 22:02

DEFAULT CURRENT_TIMESTAMPとしているので、NULLが入っても自動的に日付が入るのではないでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/17 22:04

INSERT SQL から除外されたときに設定されるのです。
kalon

2018/04/17 22:08

お返事ありがとうございます。「除外されたとき」とは具体的にどんな時でしょうか?
m.ts10806

2018/04/18 00:16

MySQL,phpMyAdminもタグに追加しておいてください。あとできればそれぞれのバージョンも質問に追記してください。
kalon

2018/04/18 00:22

ご指摘ありがとうございます。追記しました。
m.ts10806

2018/04/18 00:56

実際に実行されたINSERT文は拾えますか?
guest

回答2

0

ベストアンサー

default の動作サンプル

サンプル

CREATE TABLE TEST ( ID INT, TEST1 DATETIME DEFAULT '0000-00-00 00:00:00', TEST2 DATETIME DEFAULT CURRENT_TIMESTAMP ); INSERT INTO TEST (ID, TEST1, TEST2) VALUES (1, NULL, NULL); INSERT INTO TEST (ID, TEST1, TEST2) VALUES (2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); INSERT INTO TEST (ID, TEST1, TEST2) VALUES (3, '0000-00-00 00:00:00', '0000-00-00 00:00:00'); INSERT INTO TEST (ID, TEST1, TEST2) VALUES (4, '2000-01-01 00:00:00', '2000-01-01 00:00:00'); INSERT INTO TEST (ID ) VALUES (5); SELECT ID, DATE_FORMAT(TEST1, '%Y-%m-%d') AS TEST1, DATE_FORMAT(TEST2, '%Y-%m-%d') AS TEST2 FROM TEST

結果

IDTEST1TEST2SQL
1(null)(null)~VALUES (1, NULL, NULL);
22018-04-182018-04-18~VALUES (2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
30000-00-000000-00-00~VALUES (3, '0000-00-00 00:00:00', '0000-00-00 00:00:00');
42000-01-012000-01-01~VALUES (4, '2000-01-01 00:00:00', '2000-01-01 00:00:00');
50000-00-002018-04-18~VALUES (5);

投稿2018/04/18 01:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kalon

2018/04/18 02:11

サンプルコードまで書いてくださって感謝です。お陰様でDEFAULTの振る舞いが分かりました。ありがとうございます。
guest

0

このような問題が発生した場合、バインドされた後のSQL(つまり実行可能なSQLの形式)を出力する方法があると思いますので、
まずそれを調べて確認することをおすすめします。

投稿2018/04/17 16:24

py4s-tnk

総合スコア201

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

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

kalon

2018/04/18 14:12

実行可能なSQLの形式を出力する方法を探してみましたが、見当たりませんでした。お手数をおかけしますがその方法について記載のあるウェブサイトか、具体的な方法を教えて頂けませんか?よろしくお願いします。
py4s-tnk

2018/04/18 14:22

自分の勘違いでした。プリペアードステートメントの場合はできないようですね。 他の方法としては、mysqlの設定を追加し、general logを出力する方法があります。 my.cnfやgeneral_logとかでググってもらえれば設定方法でてくるかと思います。 general logには、2つSQLが出力(バインド前、バインド後)されるはずです。
kalon

2018/04/18 14:23

お返事ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問