Php Yii日期、小时、分钟->;日期时间字符串->;MySQL日期时间

Php Yii日期、小时、分钟->;日期时间字符串->;MySQL日期时间,php,yii,Php,Yii,我正在使用Yii构建一个web应用程序。我的一个输入表单有一个用于日期的CJuiDatePicker。我有两个下拉列表,一个是小时,一个是分钟 我的问题是在数据模型中,我试图将表单中的日期、小时和分钟转换为MySQL日期时间字符串。我必须生成一个datetime字符串,看起来像这样-2011-02-27 20:11:56,这样我就可以将该字符串转换为MySQL datetime并将值插入行中 在模型中,我有一个如下规则: array('event_datetime_from', 'createD

我正在使用Yii构建一个web应用程序。我的一个输入表单有一个用于日期的CJuiDatePicker。我有两个下拉列表,一个是小时,一个是分钟

我的问题是在数据模型中,我试图将表单中的日期、小时和分钟转换为MySQL日期时间字符串。我必须生成一个datetime字符串,看起来像这样-
2011-02-27 20:11:56
,这样我就可以将该字符串转换为MySQL datetime并将值插入行中

在模型中,我有一个如下规则:

array('event_datetime_from', 'createDatetime', 
    'date'=>'event_date_from', 'hour'=>'event_hour_from',
    'minute'=>'event_minute_from'),
public function createDatetime($attribute, $params) {
    if (!$this->hasErrors()) {      
        $date = $this->$params['date'];
        $hour = $this->$params['hour'];
        $minute = $this->$params['minute'];

        if (trim($date) === '') {
            $this->$attribute = null;
        } else {
            $parse = CDateTimeParser::parse(
                $date.' '.$hour.':'.$minute,
                'MM/dd/yyyy hh:mm');
            $this->$attribute = date('Y-m-d H:i:s', $parse);
        }
    }
}
createDateTime
验证程序函数如下所示:

array('event_datetime_from', 'createDatetime', 
    'date'=>'event_date_from', 'hour'=>'event_hour_from',
    'minute'=>'event_minute_from'),
public function createDatetime($attribute, $params) {
    if (!$this->hasErrors()) {      
        $date = $this->$params['date'];
        $hour = $this->$params['hour'];
        $minute = $this->$params['minute'];

        if (trim($date) === '') {
            $this->$attribute = null;
        } else {
            $parse = CDateTimeParser::parse(
                $date.' '.$hour.':'.$minute,
                'MM/dd/yyyy hh:mm');
            $this->$attribute = date('Y-m-d H:i:s', $parse);
        }
    }
}
现在,我不是一个PHP开发人员。但是,在我看来,
$params['date']
返回的是来自的字符串值
event\u date\u,而不是来自
event\u date\u的值

我的PHP问题是,如何从
createDateTime
验证器函数中获取
event\u date\u的值

如果我忽略了Yii文档中的某个地方,我深表歉意。我找不到很多验证程序函数的示例。Yii验证器类与验证器函数具有不同的参数签名

根据thaddeusmt的答案编辑:

我尝试扩展CActiveRecord并编写了afterValidate方法,但找不到一个地方来定义我的工作日期、小时和分钟变量。我在扩展方法中定义了它们,afterValidate方法无法看到它们。我在afterValidate方法中发现一个PHP未定义变量错误

在控制器中,我对以下功能进行了编码:

protected function createDateTime($dateString, $hour, $minute) {
    if (trim($dateString) == '') {
        return null;
    } else {
        $timeString = $dateString.' '.$hour.':'.$minute;
        return date('Y-m-d H:i:s', strtotime($timeString));
    }
}
$model->event_datetime_from = 
            createDateTime($_POST['event_date_from'],
            $_POST['event_hour_from'],
            $_POST['event_minute_from']
            );
在PHP中调用函数应该很容易,对吗

我在actionCreate()函数中尝试了这两个调用:

protected function createDateTime($dateString, $hour, $minute) {
    if (trim($dateString) == '') {
        return null;
    } else {
        $timeString = $dateString.' '.$hour.':'.$minute;
        return date('Y-m-d H:i:s', strtotime($timeString));
    }
}
$model->event_datetime_from = 
            createDateTime($_POST['event_date_from'],
            $_POST['event_hour_from'],
            $_POST['event_minute_from']
            );
以及:

我的控制器代码随着这两个调用中的任何一个而消失,我得到一个空白(没有HTML)响应页面


我觉得我想做的很简单。我想获取日期、小时和分钟字符串,并将串联转换为日期时间字符串。我缺少什么?

我要做的是,在控制器中的POST操作(分配POST变量的地方)中,我使用date()和mktime()函数将发布的日期和时间值转换为MySQL datetime,然后验证/保存。下面是一个事后行动的例子:

public function actionUpdate() {
  $model=$this->loadModel();
  if(isset($_POST['Model'])) {
    $model->attributes = $_POST['Model']; // assign the rest of the POST vars here
    $model->event_datetime_from = date(
      'Y-m-d H:i:s', // convert the timestamp to the mySQL format
      mktime(        // create the timestamp from the posted date and time vars
        $_POST['my-hour-var'], // set the hour
        $_POST['my-minute-var'], // set the min
        $_POST['my-second-var'], // set the sec
        date("m"), // set the month
        date("d"), // set the day
        date("Y") // set the year
      )
    ); // create a MySQL Y-m-d H:i:s format date from the POST vars
    $model->save(); // this run the validation rules, naturally
  }
}
(假设有一个名为“model”的模型,分别发布了名为my hour var、my minute var和my second var的小时、分钟和秒变量,并将日期部分设置为今天。)

下面是模型中的验证规则示例,使用:


我希望这有帮助

我要做的是,在控制器中的POST操作中(分配了POST变量),我使用date()和mktime()函数将发布的日期和时间值转换为MySQL datetime,然后验证/保存。下面是一个事后行动的例子:

public function actionUpdate() {
  $model=$this->loadModel();
  if(isset($_POST['Model'])) {
    $model->attributes = $_POST['Model']; // assign the rest of the POST vars here
    $model->event_datetime_from = date(
      'Y-m-d H:i:s', // convert the timestamp to the mySQL format
      mktime(        // create the timestamp from the posted date and time vars
        $_POST['my-hour-var'], // set the hour
        $_POST['my-minute-var'], // set the min
        $_POST['my-second-var'], // set the sec
        date("m"), // set the month
        date("d"), // set the day
        date("Y") // set the year
      )
    ); // create a MySQL Y-m-d H:i:s format date from the POST vars
    $model->save(); // this run the validation rules, naturally
  }
}
(假设有一个名为“model”的模型,分别发布了名为my hour var、my minute var和my second var的小时、分钟和秒变量,并将日期部分设置为今天。)

下面是模型中的验证规则示例,使用:


我希望这有帮助

我终于将日期、小时和分钟字符串转换为日期时间字符串

下面是我在
actionCreate
方法和
CalendarEventController的
actionUpdate
方法中输入的代码:

        $model->attributes=$_POST['CalendarEvent'];

        // new code
        $timeString = $_POST['CalendarEvent']['event_date_from'].' '.
            $_POST['CalendarEvent']['event_hour_from'].':'.
            $_POST['CalendarEvent']['event_minute_from'];
        $model->event_datetime_from = 
            date('Y-m-d H:i:s', strtotime($timeString));

        if (trim($_POST['CalendarEvent']['event_date_to']) === '') {
            $model->event_datetime_to = null;
        } else {
            $timeString = $_POST['CalendarEvent']['event_date_to'].' '.
                $_POST['CalendarEvent']['event_hour_to'].':'.
                $_POST['CalendarEvent']['event_minute_to'];
            $model->event_datetime_to = 
                date('Y-m-d H:i:s', strtotime($timeString));
        }
在这个模型中,我有两个datetime字段,第二个字段是可选的。当我将此代码放入函数中时,它不起作用。只有当我将代码内联到两个动作方法中时,它才起作用


我想我不理解PHP函数调用。但是,如果其他人遇到这个问题,下面是有效的答案。

我终于将日期、小时和分钟字符串转换为日期时间字符串

下面是我在
actionCreate
方法和
CalendarEventController的
actionUpdate
方法中输入的代码:

        $model->attributes=$_POST['CalendarEvent'];

        // new code
        $timeString = $_POST['CalendarEvent']['event_date_from'].' '.
            $_POST['CalendarEvent']['event_hour_from'].':'.
            $_POST['CalendarEvent']['event_minute_from'];
        $model->event_datetime_from = 
            date('Y-m-d H:i:s', strtotime($timeString));

        if (trim($_POST['CalendarEvent']['event_date_to']) === '') {
            $model->event_datetime_to = null;
        } else {
            $timeString = $_POST['CalendarEvent']['event_date_to'].' '.
                $_POST['CalendarEvent']['event_hour_to'].':'.
                $_POST['CalendarEvent']['event_minute_to'];
            $model->event_datetime_to = 
                date('Y-m-d H:i:s', strtotime($timeString));
        }
在这个模型中,我有两个datetime字段,第二个字段是可选的。当我将此代码放入函数中时,它不起作用。只有当我将代码内联到两个动作方法中时,它才起作用


我想我不理解PHP函数调用。但是,如果其他人遇到这个问题,下面是有效的答案。

我强烈建议查看此扩展:


它会自动执行其中一些行为。你可能需要更新它一点,这取决于你希望你的到来日期看起来如何。一种方法是始终通过strotime()(内置php日期解析函数)而不是扩展中的特定日期解析器来运行属性

我强烈建议您查看此扩展:


它会自动执行其中一些行为。你可能需要更新它一点,这取决于你希望你的到来日期看起来如何。一种方法是始终通过strotime()(内置php日期解析函数)而不是扩展中的特定日期解析器来运行属性

是的,你的回答很有帮助。我现在在控制器里工作。我编写了一些类似于您的post action示例的代码,创建了一个空白网页。一旦我发现我做错了什么,我就接受你的答案。在我的代码中,$_POST['my-hour-var']没有定义。你在哪里定义你的工作变量,使它们在控制器中可见?不,你是对的,那是一个虚构的变量。看看你下面的答案,应该是$_POST['CalendarEvent']['event\u hour\u from'],我只是不知道JUI日期小部件是如何发布数据的,对此表示抱歉。抱歉,我在之前的评论中没有说得更清楚。当时,我使用自己的变量名,但它们没有定义,因为我还需要指定CalendarEvent键。我认为最好将此代码放在afterV中的抽象ActiveRecord类中