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

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

ただいまの
回答率

88.05%

PHP MySQLで日付フォーマットを挿入する場合

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 12K+

score 27

jQuery datepicker を使っています。フォーマットは 08/14/2014 です。

データベースにこれを挿入したところ、 0000-00-00 00 00 00 しか挿入されないというエラーが起きます。

コードは以下です
<?php
    $user_id = $_POST['id'];
    $user_name = $_POST['user_name'];
    $created = $_POST['created'];
    $sql = mysql_query( "INSERT INTO users VALUE( '', '$user_name', '$created')" ) or die ( mysql_error() );

自分では間違っていないと思うんですが。。。
回答お願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

MySQL は DATE を以下のフォーマットで認識します。

・'YYYY-MM-DD' または 'YY-MM-DD'フォーマット。日付それぞれの間では記号が区切り文字として使用されます。例えば、 '2012-12-31'や '2012/12/31'、 '2012^12^31'、 '2012@12@31' などになります。

・区切り文字のない 'YYYYMMDD' または 'YYMMDD' フォーマットを認識します。例えば'20070523' や '070523'は '2007-05-23' と翻訳されますが、'071332'は不正なので(月日の表記が無意味なため)'0000-00-00'となります。

そのため、 '08/14/2014' というstringは、MySQLでは文字として有効ではありません。ここからの選択肢としては4つあります(質問者さんのご要望がくわしくわからないので、どれが一番いいかはわかりませんが)。


1.Datepickerの設定を変更し、dateFormat optionを使ったフォーマットで日付が与えられるようにする。

$( ".selector" ).datepicker({ dateFormat: "yyyy-mm-dd" });


2.MySQLのSTR_TO_DATE()関数を使ってstringを変換する。

INSERT INTO users VALUES ('', '$user_name', STR_TO_DATE('$created', '%m/%d/%Y'))


3.jQueryから受け取るstringをPHPタイムスタンプへ変換する(例:strtotime()

$timestamp = strtotime($_POST['created']);
その他にも
  ・date()を使ってタイムスタンプをフォーマット化する。

   $date = date('Y-m-d', $timestamp);
  ・FROM_UNIXTIME()(http://dev.mysql.com/doc/en/date-and-time-functions.html#function_from-unixtime)を使ってタイムスタンプをMySQLへ直投げする。

   INSERT INTO users VALUES ('', '$user_name', FROM_UNIXTIME($timestamp))


4.手動でstringを有効な文字として入力する。

$parts = explode('/', $_POST['created']);
$date = "$parts[2]-$parts[0]-$parts[1]";

<注意>

そちらのコードはSQLインジェクションに対して弱いです。あらかじめ、変数をSQLで評価されないパラメータとして通すステートメントを用意して使ってください。

また、PHPマニュアルのmysql_*関数についての導入部では、次のように書かれています。

「この拡張モジュールは PHP 5.5.0 で非推奨になりました。将来削除される予定なので、 この拡張モジュールを使って新しくコードを書くことはおすすめしません。 新しくコードを書くときには mysqli や PDO_MySQL を使うべきです。 MySQL API Overview が、MySQL API を選択する際の参考となります」

DATETIMEかTIMESTAMPカラムを使って日付値を保持するようですが、代わりにMySQLのDATEタイプを使うことをオススメします。MySQLの公式では以下のように説明しています。

「DATEタイプは日付部分の値に用いられますが、時間部分には用いられません。MySQLはDATE値を 'YYYY-MM-DD'フォーマットで取得して表示します。対応している幅は'1000-01-01' から '9999-12-31' までとなっています。

DATETIMEタイプは日付時間共に含んだ部分の値に用いられます。MySQLはDATETIME値を'YYYY-MM-DD HH:MM:SS'フォーマットで取得して表示します。対応している幅は'1000-01-01 00:00:00' to '9999-12-31 23:59:59'までとなっています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

関連ワード: mysql 日付 フォーマット