it-swarm.com.ru

Вставка NOW () в базу данных с активной записью CodeIgniter

Я хочу вставить текущее время в базу данных, используя функцию mySQL NOW () в активной записи Codeigniter. Следующий запрос не будет работать:

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

Это связано с тем, что класс ActiveRecord CodeIgniter автоматически экранирует входные данные.

Следующее работает нормально, вызывая 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
            );
73
Roman

Если я не сильно ошибаюсь, ответ: «Нет, нет пути».

Основная проблема в подобных ситуациях заключается в том, что вы вызываете функцию MySQL, а на самом деле вы не устанавливаете значение. CI экранирует значения, так что вы можете выполнить чистую вставку, но не проверяет, являются ли эти значения вызывающими функциями, такими как aes_encrypt, md5 или (в данном случае) now(). Хотя в большинстве ситуаций это замечательно, для таких ситуаций единственным вариантом является использование sql.

С другой стороны, date('Y-m-d'); должна работать как PHP версия NOW() для MySQL. (Это не будет работать для всех версий SQL, хотя).

32
cwallenpoole

Я обычно использую триггеры для обработки временных меток, но я думаю, что это может сработать.

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

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
70
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);
12
Bruno Rigolon

Это простой способ обработки вставки метки времени. 

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

вы можете загрузить помощник по дате и использовать кодовое значение interal now (), если хотите сослаться на смещение времени пользователя по Гринвичу

это выглядит примерно так

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

Если вы не используете основные настройки GTM и позволяете своим пользователям устанавливать свои собственные смещения, использование php time () не дает никаких преимуществ.

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

помещение NOW () в кавычки не будет работать, так как Active Records поместит escape-NOW () в строку и попытается вставить его в БД в виде строки «NOW ()» ... вам нужно будет использовать 

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

установить его правильно.

вы всегда можете проверить свой sql позже

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

Согласно исходному коду 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, поэтому в этой ситуации работают следующие коды (используя метод цепочки):

$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
Junliang Huang

Использование даты помощник работал для меня

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

Вы можете найти документацию для date_helperhere .

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

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

$this->db->query("update table_name set ts = now() where 1=1") также работает для отметки текущего времени!

0
user3526

запустить запрос, чтобы получить now () из mysql, т.е. выбрать now () как nowinmysql;

затем используйте codeigniter, чтобы получить это и положить в 

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