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


78

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
            );

1
트랙과 범위에서 벗어나지 만 사용하면 NOW () 효과를 얻을 수 있다는 것을 알고 strtotime있습니까? 예를 들어 echo date("N", strtotime('now'));오늘 날짜를 알려줄 것입니다. php.net/strtotime 및 php.net/date를 참조하십시오
Kumar

답변:


32

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

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

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


22
단순화를 위해 항상 다른 ORM 등으로 date ( 'Ymd H : i : s')로 타임 스탬프를 설정하므로 다른 구현에 맞서 싸울 필요가 없습니다.
geekuality

2
개인적으로 저는 항상 Unix 타임 스탬프를 사용합니다. 1308124173975는 모든 언어와 데이터베이스에서 항상 long (또는 int, float 또는 이와 동등한)이라는 것을 알고 있습니다. 나는 신경 쓸 필요가없는 것을 좋아합니다.
cwallenpoole

1
그건 좋은 지적이야. 나는 게으 르기 때문에 가능하면 사람이 읽을 수있는 항목을 갖는 것을 좋아합니다. :)
geekuality

1
@jupaju 그것은 단지 다른 유형의 게으름입니다. PgSQL, MySQL, Oracle, Java, PHP 및 Python이 날짜를 저장하는 방법을 기억하거나 모든 것이 멍청한 숫자가 될 수 있습니다. 그리고 그거 알아? 숫자이면 즉시 AS2, AS3 및 JS로 변환됩니다. 그리고 언제 실제 날짜가 필요합니까? Chrome으로 이동하여 Ctrl-shift-J를 누르고 String (new Date (/ * numeric timestamp * /)) 붙여 넣기
cwallenpoole

4
date ( 'Ymd H : i : s')를 사용하면 MySQL 서버와 PHP 라이브러리가 사용자 모르게 두 개의 다른 시간대를 사용하는 문제가있을 수 있습니다. 예를 들어 GMT (+ 0h)에 MySQL이 있고 PHP는 EST (-5h)에있는 호스트가 있습니다.
bafromca 2014 년

76

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

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

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

now() + 1 day어떻게 든 활성 레코드 를 사용할 수 있습니까?
aspirinemaga

이것이 빈 업데이트에서 트리거 될 수있는 방법이 있습니까?
Edeph 2014-06-05

1
나를 위해 일함 2015
CI2.1.2

1
@AnwarHossain 버전 3.1을 사용하고 있으며 작동 중이며 다른 문제가있을 수 있습니다.
Muhammad

1
나는 CI 버전 3.1.8을 사용하고 있으며 절대적으로 잘 작동합니다. :)
haidarvm

14

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);

2
문서에 따르면 이것이 CodeIgniter의 "권장 방법"이라는 점에 주목하고 싶습니다. 다른 시간대로 설정 될 수 있으므로 공유 호스트에있는 경우 PHP의 date ( 'Ymd H : i : s') 대신 MySQL의 네이티브 NOW ()를 사용하는 것이 좋습니다.
bafromca 2014 년

12

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

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

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

이 답변은 품질이 낮은 것으로 표시되었습니다. 질문에 답이된다면 어떻게 작동하는지 설명하는 텍스트를 추가해보세요.
lmo

3
나를 위해 일했습니다. 설명이 도움이 될 수 있지만 문제가 해결되었습니다. 😁
Jordan

time ()은 필요하지 않습니다. date ()는 항상 현재 시간을 반환합니다
Loki

7

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

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

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

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


date ()는 시스템 날짜에 의존하지 않도록 PHP 경고를 표시합니다
pankijs

4

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');

3

NOW ()를 따옴표로 묶는 것은 활성 레코드가 NOW ()를 문자열로 이스케이프하고 "NOW ()"의 문자열로 db에 밀어 넣으려고하므로 작동하지 않습니다.

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

올바르게 설정합니다.

나중에 언제든지 SQL을 확인할 수 있습니다.

$this->db->last_query();

3

나를 위해 일한 날짜 도우미 사용

$this->load->helper('date');

date_helper 여기에서 문서를 찾을 수 있습니다 .

$data = array(
  'created' => now(),
  'modified' => now()
);

$this->db->insert('TABLENAME', $data);

나는 그것 죽은 링크 생각
앤워 후세인

0

$this->db->query("update table_name set ts = now() where 1=1") 현재 타임 스탬프에서도 작동합니다!


0

쿼리를 실행하여 mysql에서 now ()를 가져옵니다. 즉, nowinmysql로 ​​now ()를 선택합니다.

그런 다음 codeigniter를 사용하여 이것을 얻고

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.