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

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

ただいまの
回答率

89.05%

MySQLに文字列として保存される日付を日付型に直したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,035

kokokooooooooo

score 18

イメージ説明

registe.php→confirm.php→add.phpという流れで、個人情報の登録を行なっています。
confirm.phpでの値をそのまま、文字列として保存している状況です。

add.php
<?php

$user     = 'root';
$pass     = 'root';

$name     =     $_POST['name'];
$password = $_POST['password'];
$sex      =(int) $_POST['sex'];//URLで数字はPOSTすると文字列と扱われるため、intを使い数字に直して代入
$bday     =     $_POST['bday'];

try {
    $db = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8', $user, $pass);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $sql = 'INSERT INTO task (name, password, sex, bday) VALUES (:name, :password, :sex, :bday)';
    //カラム名を順番に指定していく。VALUES以下で?にブレースホルダを指定して行く
    $stmt = $db->prepare($sql);
    $stmt->bindParam(':name',     $name,     PDO::PARAM_STR);
    $stmt->bindParam(':password', $password, PDO::PARAM_STR);
    $stmt->bindParam(':sex',      $sex,      PDO::PARAM_INT);
    $stmt->bindParam(':bday',     $bday,     PDO::PARAM_STR);

    $stmt->execute();
    echo "登録が完了しました";;
} catch (PDOException $e) {
    die('エラー:'.$e->getMessage());
}
?>


add.phpの14行目

 $sql = 'INSERT INTO task (name, password, sex, bday) VALUES (:name, :password, :sex, :bday)';


ここのINSERT文をcast関数を使い、文字列型を日付型に変更して保存したいと考えています。

これに併せて、edite.phpのSQL文も見て欲しいです

edite.php
<?php
//サーバーメソッドを調べ、それがpostで送られてきているかを調べる関数
//ポストバック
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    //データベースに接続
    $dsn  = 'mysql:host=localhost;dbname=mydb;charset=utf8';
    $user = 'root';
    $pass = 'root';

    $name     =  $_POST['name'];
    $password =  $_POST['password'];
    $sex      = (int) $_POST['sex'];//URLで数字はPOSTすると文字列と扱われるため、intを使い数字に直して代入
    $bday     =  $_POST['bday'];

    try {
        $id = (int) $_POST['id'];
        //データベース接続
        $db = new PDO($dsn, $user, $pass);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $sql  = 'UPDATE task SET name = :name, password = :password, sex = :sex, bday = :bday WHERE id = :id';
        $stmt = $db->prepare($sql);
        $stmt->bindParam(':name',     $name,     PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR);
        $stmt->bindParam(':sex',      $sex,      PDO::PARAM_INT);
        $stmt->bindParam(':bday',     $bday,     PDO::PARAM_STR);
        $stmt->bindParam(':id',       $id,       PDO::PARAM_INT);
        $stmt->execute();
        header('Location: index2.php');
    } catch (PDOException $e) {
        die('エラー:'.$e->getMessage());
    }
}
?>

<?php
    $dsn  = 'mysql:host=localhost;dbname=mydb;charset=utf8';
    $user = 'root';
    $pass = 'root';

    try {
        $id = (int) $_GET['id'];
        //データベース接続
        $db = new PDO($dsn, $user, $pass);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $sql = 'SELECT * FROM task WHERE id = :id';
        $stmt = $db->prepare($sql);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        die('エラー:'.$e->getMessage());
    }
?>
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>修正版</title>
  </head>
  <body>
      <h1>修正板</h1>
      <a href="index2.php">トップページに戻る</a>
      <form action="" method="post">
        <p>名前:      <input type="text"  name="name"     value="<?php echo $result['name']; ?>">
        <p>パスワード: <input type="text"  name="password" value="<?php echo $result['password'];?>">
        <p>男         <input type="radio" name="sex"      value="1" <?php if ($result['sex'] === 1) {echo 'checked';} ?>>
        <p>女         <input type="radio" name="sex"      value="2" <?php if ($result['sex'] === 2) {echo 'checked';} ?>>
        <br>
        <p>生年月日    <input type="date" name="bday"      value="<?php echo $result['bday'];?>">
        <br>

        <input type="hidden" name="id" value="<?php echo $result['id'];?>">
        <p><input type="submit" value="送信">
      </form>
  </body>
</html>


このedite.phpでは、登録した個人情報の更新を行なっています ここの部分でも文字列として日付をいれています。文字列型に直して保存をするクエリの書き方を教えてください

$sql  = 'UPDATE task SET name = :name, password = :password, sex = :sex, bday = :bday WHERE id = :id';
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

ちょっと質問の意図がわからないのですが
date型のカラムに文字列でデータを投入すれば自動的にキャストされて
date型のデータとして投入されていませんか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/19 18:36

    MySQLには、文字列が自動的にキャストされて、date型のデータとして投入されるのですか?
    str_to_dateやcast関数を使わなければ、文字列で保存されるとおもっていました。

    キャンセル

  • 2018/09/19 18:44

    テーブルの定義がDate型なら、現状Date型で格納されています。
    ツールなどで表示されているのは単にそういう表現なだけであって、文字列で格納されている訳ではありません。

    キャンセル

  • 2018/09/19 18:56

    ありがとうございます。

    キャンセル

0

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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