5

phpActiveRecord を使用してテーブルにレコードを作成しようとすると、次のエラーが発生します。

Invalid datetime format: 1292 Incorrect datetime value: '2013-06-20 11:59:08 PDT' for column 'created_at'

実行中のコード:

$new_cart = new QuoteRequest();
$new_cart->status = "cart";
$new_cart->save();

これを phpActiveRecord の関連する行まで追跡しました。ファイル Connection.php の 55 ~ 59 行目:

/**
 * Database's datetime format
 * @var string
 */
static $datetime_format = 'Y-m-d H:i:s T';

そして、これを使用する行 (Connection.php、行 457-466):

/**
 * Return a date time formatted into the database's datetime format.
 *
 * @param DateTime $datetime The DateTime object
 * @return string
 */
public function datetime_to_string($datetime)
{
  return $datetime->format(static::$datetime_format);
}

値が変換される場所 (Table.php 行 394-412):

private function &process_data($hash)
{
    if (!$hash)
        return $hash;

    foreach ($hash as $name => &$value)
    {
        if ($value instanceof \DateTime)
        {
            if (isset($this->columns[$name]) && $this->columns[$name]->type == Column::DATE)
                $hash[$name] = $this->conn->date_to_string($value);
            else
                $hash[$name] = $this->conn->datetime_to_string($value);
        }
        else
            $hash[$name] = $value;
    }
    return $hash;
}

MySQL バージョン 5.6.10 を使用しており、created_atフィールドはタイムスタンプです。

質問:ここで phpActiveRecord に何か問題がありますか、それとも MySQL の問題ですか?

4

3 に答える 3

8
static $datetime_format = 'Y-m-d H:i:s T';

タイムスタンプ形式の一部ではないため、それを削除する必要があると思います'T'PDT、つまりタイムゾーンの略語が得られます)。

次のようにする必要があります。

static $datetime_format = 'Y-m-d H:i:s';
于 2013-06-20T19:33:43.323 に答える
4

受け入れられた答えは機能します。ただし、パッケージのコードを上書きしています。つまり、プロジェクトで PHP-AR を更新するたびに、その変更が失われます。

より良いアプローチは、プロジェクトで AR を設定するときに実行時にオーバーライドすることです。

ActiveRecord\Config::initialize(function($cfg) {
  // [...] Your init config goes here
  ActiveRecord\Connection::$datetime_format = 'Y-m-d H:i:s';
});

init構成は少し異なる場合があるため、必要に応じて調整してください。

ベンダーのコア ファイルを変更する代わりに、プロジェクトをオーバーライドします。

  1. 良い習慣です。
  2. プロジェクトで作業するすべての人に対して、カスタマイズを明確にします。
  3. プロジェクトで PHP-AR を更新する場合は、コードの破損を防ぎます。
于 2016-05-12T08:43:42.183 に答える
-1

この問題の根本的な原因は、デフォルトのタイムゾーンが設定されていないことです。

サーバーには構成でタイムゾーンが設定されているため、これはサーバーではなくローカルで表示される場合があります。これは、php 構成でローカルに設定するか、次のようなものを使用して ActiveRecord.php を必要とするソースの上部で設定できます。

date_default_timezone_set('America/New_York');
于 2014-02-26T03:50:03.360 に答える