web-dev-qa-db-ja.com

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

私が大きく間違えない限り、答えは「いいえ、ありません」です。

このような状況での基本的な問題は、MySQL関数を呼び出しており、実際に値を設定していないという事実です。 CIは値をエスケープするため、クリーンな挿入を実行できますが、それらの値がaes_encryptmd5、または(この場合)now()などの関数を呼び出しているかどうかのテストは行いません。 。ほとんどの状況ではこれはすばらしいことですが、そのような状況では生のSQLが唯一の手段です。

一方で、date('Y-m-d');は、MySQLのNOW()のPHPバージョンとして機能するはずです。 (ただし、すべてのバージョンのSQLで機能するわけではありません)。

32
cwallenpoole

私は通常、タイムスタンプを処理するためにトリガーを使用しますが、これはうまくいくと思います。

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

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

アスピリンマガ、単に置き換える:

$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);
14
Bruno Rigolon

これはタイムスタンプの挿入を処理する簡単な方法です

$data = array('created_on' => date('Y-m-d H:i:s'));
10
saurabh kamble
    $data = array(
            'name' => $name ,
            'email' => $email,
            'time' =>date('Y-m-d H:i:s')
            );
            $this->db->insert('mytable', $data);
7
sandeep kumar

ユーザーのGMT時間オフセットを参照する場合は、dateヘルパーをロードし、codeigniter interal now()を使用できます。

それはややこのように見える

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

GTMマスター設定を使用せず、ユーザーが独自のオフセットを設定できるようにする場合、phpのtime()関数を使用するよりも利点はありません。

7
Steven

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は2番目のパラメーター$valueを単に無視しますが、3番目のパラメーター$escape$keyの反復を通して引き続き機能します。状況では、次のコードが機能します(チェーン方式を使用):

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

ただし、これによりすべてのデータがエスケープされないため、データを2つの部分に分けることができます。

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

nOW()を引用符で囲むと、アクティブレコードがNOW()をエスケープして文字列に入れ、それを "NOW()"の文字列としてdbにプッシュしようとするため、機能しません...使用する必要があります

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

正しく設定します。

後でSQLをいつでも確認できます

$this->db->last_query();
3
williamli

日付ヘルパーを使用して私のために働いた

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

date_helper)here のドキュメントを見つけることができます。

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

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

$this->db->query("update table_name set ts = now() where 1=1")は現在のタイムスタンプでも機能します!

0
user3526

mysqlからnow()を取得するクエリを実行します。つまり、nowinmysqlとしてnow()を選択します。

次にcodeigniterを使用してこれを取得し、

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
0
khalrd