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

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

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

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

SQL

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

Q&A

解決済

2回答

2424閲覧

Mysqlのdatetime型が登録した時間になりません。(PDOでのやり方)

dog57

総合スコア131

MySQL

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

SQL

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

0グッド

1クリップ

投稿2017/12/02 02:19

編集2017/12/02 04:38

Mysqlのdatetime型が登録した時間になりません。
PDOではどのようにしたらようのでしょうか?

イメージ説明

イメージ説明

登録完了画面

php

1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', TRUE); 4error_reporting(E_ALL); 5 6session_start(); 7 8header("Content-type: text/html; charset=utf-8"); 9 10require_once(__DIR__. '/db.php'); 11//配列を文字列に変換する(DBに登録した配列を使う時は、逆にデコードをする) 12$hobbyData = $_SESSION["hobby"]; 13$_SESSION["hobby"] = serialize($hobbyData); 14 15 16 17 18 19try { 20 21 $dbh = new PDO($dsn, $user, $password); 22 $statement = $dbh->prepare("INSERT INTO users (name, email, password, tel, prefectures, hobby, gender, contact, creation_time) VALUES (:name, :email, :password, :tel, :prefectures, :hobby, :gender, :contact, creation_time)"); 23 24 if ($statement) { 25 26 $date = date_default_timezone_set('Asia/Tokyo'); 27 $date = new DateTime(); 28 $date = $date->format('Y-m-d H:i:s'); 29 30 // プレースホルダへ実際の値を設定する 31 $statement->bindValue(':name', $_SESSION["name"], PDO::PARAM_STR); 32 $statement->bindValue(':email', $_SESSION["email"], PDO::PARAM_STR); 33 $statement->bindValue(':password', $_SESSION["password"], PDO::PARAM_STR); 34 $statement->bindValue(':tel', $_SESSION["tel"], PDO::PARAM_STR); 35 $statement->bindValue(':prefectures', $_SESSION["prefectures"], PDO::PARAM_STR); 36 $statement->bindValue(':hobby', $_SESSION["hobby"], PDO::PARAM_STR); 37 $statement->bindValue(':gender', $_SESSION["gender"], PDO::PARAM_STR); 38 $statement->bindValue(':contact', $_SESSION["contact"], PDO::PARAM_STR); 39 $statement->bindValue(':creation_time', $date, PDO::PARAM_STR); 40 41 42 43 // 実行する 44 if (!$statement->execute()) { 45 $errors['error'] = "登録失敗しました。 "; 46 } 47 48 //データベース切断 49 $dbh = null; 50 51 52 } 53 54 55} catch (PDOException $e) { 56 print('Error:'.$e->getMessage()); 57 $errors['error'] = "データベース接続失敗しました。"; 58} 59 60 61 62 ?> 63 64 65 <!DOCTYPE html> 66 <html> 67 <head> 68 <meta charset="utf-8"> 69 <title>登録完了</title> 70 </head> 71 <body> 72 73登録完了! 74 75 76 77<a href="http://192.168.33.15"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a> 78 79 80 81 </body> 82 </html> 83

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

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

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

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

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

crowmt

2017/12/02 03:33

datetime型はこちらから指定しないと時間が入らないと思うのですが、timestamp型の動きを求めてる感じですか?
crowmt

2017/12/02 03:35

あ、timestamp型で宣言してましたね。INSERT文がみたいですね。
guest

回答2

0

ベストアンサー

php

1 $statement = $dbh->prepare("INSERT INTO users (name, email, password, tel, prefectures, hobby, gender, contact, creation_time) VALUES (:name, :email, :password, :tel, :prefectures, :hobby, :gender, :contact, creation_time)");

php

1 $statement = $dbh->prepare("INSERT INTO users (name, email, password, tel, prefectures, hobby, gender, contact, creation_time) VALUES (:name, :email, :password, :tel, :prefectures, :hobby, :gender, :contact, :creation_time)");

このようにオプションをつけていれば気づけます。

php

1 $option = [ 2 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 3 ]; 4 $dbh = new PDO($dsn, $user, $password, $option);

投稿2017/12/02 04:40

編集2017/12/02 04:44
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

PruneMazui

2017/12/02 04:53

エラー飛ばす場合 sql_mode に `NO_ZERO_DATE` 必要そうですね
退会済みユーザー

退会済みユーザー

2017/12/02 04:59 編集

それは、MySQLでDatetime関連のエラーを捕捉する場合ですね。回答はPHP側(PDO)の機能として、例外を表示します。今回のミスについてはプレースホルダの指定に間違いがあるので、PDOのエラーと言えるのではないでしょうか。
PruneMazui

2017/12/02 05:14

なるほど、バインド変数が使われてないようなエラーを期待ってことですね。 横から失礼しましたー
guest

0

timestamp型の場合、DEFAULT CURRENT_TIMESTAMPを列定義に追加すれば、INSERT時に時間が入ります。

なお、MySQL 5.6.5以上ではdatetimeについてもDEFAULT CURRENT_TIMESTAMPが適用可能です(リファレンス)。

投稿2017/12/02 04:33

maisumakun

総合スコア145121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問