[php] CodeIgniter의 액티브 레코드로 NOW ()를 데이터베이스에 삽입

Codeigniter의 활성 레코드에서 mySQL 함수 NOW ()를 사용하여 데이터베이스에 현재 시간을 삽입하고 싶습니다. 다음 쿼리는 작동하지 않습니다.

$data = array(
        'name' => $name ,
        'email' => $email,
        'time' => NOW()
        );
        $this->db->insert('mytable', $data);

이는 CodeIgniter의 ActiveRecord 클래스가 입력을 자동으로 이스케이프하기 때문입니다.

다음은 set ()을 호출하고 peratmeter FALSE를 전달하여 NOW ()를 이스케이프하지 않도록 잘 작동합니다.

$data = array(
        'name' => $name ,
        'email' => $email,
        );
        $this->db->set('time', 'NOW()', FALSE);
        $this->db->insert('mytable', $data);

그러나 내 질문은 이것 외에 다른 방법이 있습니까? 예를 들어 데이터 배열의 모든 것을 추가하여 어떻게 든 사용할 수 있다면? 예를 들면 다음과 같습니다.

$data = array(
            'name' => $name ,
            'email' => $email,
            'time' => NOW(), FALSE
            );



답변

내가 크게 착각하지 않는 한 대답은 “아니오, 방법이 없다”입니다.

이와 같은 상황에서 기본적인 문제는 MySQL 함수를 호출하고 실제로 값을 설정하지 않는다는 사실입니다. CI는 깨끗한 삽입 할 수 있도록 값을 탈출하지만, 그 값이 기능이 좋아 호출 될 일 경우는보고 테스트하지 않습니다 aes_encrypt, md5(이 경우), 또는 now(). 대부분의 상황에서 이것은 훌륭하지만 이러한 상황에서는 원시 SQL이 유일한 방법입니다.

측면에서 MySQL 용 date('Y-m-d');PHP 버전으로 작동해야합니다 NOW(). (하지만 모든 버전의 SQL에서 작동하지는 않습니다).


답변

일반적으로 트리거를 사용하여 타임 스탬프를 처리하지만 이것이 작동 할 수 있다고 생각합니다.

$data = array(
    'name' => $name,
    'email' => $email
);

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);


답변

aspirinemaga, 그냥 교체 :

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);

그것을 위해:

$this->db->set('time', 'NOW() + INTERVAL 1 DAY', FALSE);
$this->db->insert('mytable', $data);


답변

이것은 타임 스탬프 삽입을 처리하는 쉬운 방법입니다.

$data = array('created_on' => date('Y-m-d H:i:s'));


답변

    $data = array(
            'name' => $name ,
            'email' => $email,
            'time' =>date('Y-m-d H:i:s')
            );
            $this->db->insert('mytable', $data);


답변

사용자 GMT 시간 오프셋을 참조하려면 날짜 도우미를로드하고 codeigniter interal now ()를 사용할 수 있습니다.

이것은 다소 이렇게 보일 것입니다

$data = array(
'created_on' => date('Y-m-d H:i:s',now())
);

GTM 마스터 설정을 사용하지 않고 사용자가 자신의 오프셋을 설정하도록 허용하는 경우 PHP의 time () 함수를 사용하는 것보다 이점이 없습니다.


답변

codeigniter의 소스 코드에 따르면 함수 set는 다음과 같이 정의됩니다.

public function set($key, $value = '', $escape = TRUE)
{
    $key = $this->_object_to_array($key);

    if ( ! is_array($key))
    {
        $key = array($key => $value);
    }

    foreach ($key as $k => $v)
    {
        if ($escape === FALSE)
        {
            $this->ar_set[$this->_protect_identifiers($k)] = $v;
        }
        else
        {
            $this->ar_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v);
        }
    }

    return $this;
}

분명히 $key배열 인 경우 codeigniter는 단순히 두 번째 매개 변수를 무시 $value하지만 세 번째 매개 변수 $escape는의 반복 동안 계속 작동 하므로이 $key상황에서 다음 코드가 작동합니다 (chain 메서드 사용).

$this->db->set(array(
    'name' => $name ,
    'email' => $email,
    'time' => 'NOW()'), '', FALSE)->insert('mytable');

그러나 이렇게하면 모든 데이터가 이스케이프 해제되므로 데이터를 두 부분으로 나눌 수 있습니다.

$this->db->set(array(
    'name' => $name ,
    'email' => $email))->set(array('time' => 'NOW()'), '', FALSE)->insert('mytable');