1

シナリオ:私の PHP アプリケーションは常に日付フィールド DD-MM-YYYY を使用します。MySQLは明らかに常に日付をYYYY-MM-DDで保存します

免責事項:日付形式を手動で変更する方法を知っています-それは問題ではありません

質問:アプリケーションが常にDD-MM-YYYY の日付を取得し、mySQLが常にYYYY-MM-DD の日付を受け取って保存されるようにするための、適切でクリーンでエレガントな方法は何ですか?

つまり、基本的には、SQL クエリを実行するたびに呼び出さなくても、変換が自動的に行われる単一の場所が必要です。そうすれば、date_conversion を「忘れる」かどうかは問題ではありません。

どこかで何らかのコールバックを考えていますか?

(編集) 私の考え:現在、Codeigniter フレームワークを使用しています。before_get、before_insert、および before_update コールバックを使用して、MY_Model を使用することを考えています。これらのコールバックでは、次のような SELECT を使用してすべてのフィールドを調べることができます。

// {insert my query here to get records from DB. Then:
$query = $this->db->query();
$fields = $query->field_data(); 
foreach ($fields as $field)
{
      if ($field->type == 'date')
           // do conversion here
}

UPDATE/INSERT コールバックに対して同様のことを行います。私が知る限り、データベースに余分な作業はありません (Codeigniter が $query の結果で情報を提供するため)

考え?

編集2:他のアイデア:モデルごとにこれを行い、どのフィールドが日付フィールドであるかを定義し、各コールバックで変更を適用するだけです...ええ...そうするかもしれません...?

4

3 に答える 3

1

strtotimeを使用して、検査対象の値がphpで解析可能かどうかを判断できます。もしそうなら、あなたはそれを自由に変換することができます

// {insert my query here to get records from DB. Then:
$query = $this->db->query();
$fields = $query->field_data(); 
foreach ($fields as $field)
{

    // strtotime returns false when provided an invalid value
    if ($timestamp = strtotime($field->value)) {
        $field->value = date('m-d-Y', $timestamp);
    }
}

// strtotime('Whatever content here') == bool(false)
// strtotime('2011-01-12') == int(1294808400)
// strtotime('January 12th, 2011') == int(1294808400)
于 2012-05-04T04:18:48.483 に答える
1

わかりました-私自身の質問に答えてください-人々がこれを検索して見つけた場合に備えて:

ジェイミーの「MY_Model」を使用しています-https ://github.com/jamierumbelow/codeigniter-base-model

日付フィールドを持つ各モデルでコールバックを使用します。

    class Fake_model extends MY_Model
    {
        public $before_create = array ('date_convert_to_mysql');
        public $before_update = array ('date_convert_to_mysql');
        public $after_get = array ('date_convert_to_php');

        function __construct()
        {
             parent::__construct();
        }


protected function date_convert_to_mysql($post)
{
    // Now convert the date field(s)
    $post['purchase_date'] = date("Y-m-d", strtotime($post['purchase_date']));
    return $post;        
}

    protected function date_convert_to_php($result)
{
    // Now convert the date field(s)
    $result['purchase_date'] = date("d-m-Y", strtotime($result['purchase_date']));
    return $result;        
}
}

複数のレコードを選択または追加する場合は、foreachループを追加する必要があります。それが日付であるかどうかをチェックする各変数を循環させる一般的なコールバックにすることができますが、それはかなりのオーバーヘッドのようです。このように、モデルごとに1回だけ日付フィールドを定義する必要があります

于 2012-05-04T04:21:42.320 に答える
1

PHPDateTimeクラスを使用します。

// To Object, from input:
    $input_date_object = DateTime::createFromFormat('d-m-Y', $input_date);

// From Object, to MySQL:
    $mysql_date = $input_date_object->format('Y-m-d');

// ... Do a query using $mysql_date, returning, say, "due_date" field:

// To Object, from MySQL:
    $mysql_date_object = DateTime::createFromFormat('Y-m-d', $row['due_date']);

// From Object, to PHP/CodeIgniter friendly date:
    $php_date = $mysql_date_object->format('d-m-Y');

または、少しクリーンなバージョン:

$php_format = 'd-m-Y';
$mysql_format = 'Y-m-d';

$input_date_object = DateTime::createFromFormat($php_format, $input_date);

$mysql_date = $input_date_object->format($mysql_format);

$mysql_date_object = DateTime::createFromFormat($mysql_format, $row['due_date']);

$php_date = $mysql_date_object->format($php_format);
于 2012-05-04T04:26:45.697 に答える