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が唯一の手段です。
一方で、date('Y-m-d');
は、MySQLのNOW()
のPHPバージョンとして機能するはずです。 (ただし、すべてのバージョンのSQLで機能するわけではありません)。
私は通常、タイムスタンプを処理するためにトリガーを使用しますが、これはうまくいくと思います。
$data = array(
'name' => $name,
'email' => $email
);
$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
アスピリンマガ、単に置き換える:
$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時間オフセットを参照する場合は、dateヘルパーをロードし、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は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');
nOW()を引用符で囲むと、アクティブレコードがNOW()をエスケープして文字列に入れ、それを "NOW()"の文字列としてdbにプッシュしようとするため、機能しません...使用する必要があります
$this->db->set('time', 'NOW()', FALSE);
正しく設定します。
後でSQLをいつでも確認できます
$this->db->last_query();
日付ヘルパーを使用して私のために働いた
$this->load->helper('date');
date_helper
)here のドキュメントを見つけることができます。
$data = array(
'created' => now(),
'modified' => now()
);
$this->db->insert('TABLENAME', $data);
$this->db->query("update table_name set ts = now() where 1=1")
は現在のタイムスタンプでも機能します!
mysqlからnow()を取得するクエリを実行します。つまり、nowinmysqlとしてnow()を選択します。
次にcodeigniterを使用してこれを取得し、
$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);