Вставка 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 15 J0000006Europe/Moscow 2011, 11:17:07

11 ответов


0

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

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

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

ответил cwallenpoole 15 J0000006Europe/Moscow 2011, 11:32:40
0

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

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

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
ответил Bill H 16 J0000006Europe/Moscow 2011, 09:03:07
0

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);
ответил Bruno Rigolon 19 22013vEurope/Moscow11bEurope/MoscowTue, 19 Nov 2013 16:10:40 +0400 2013, 16:10:40
0

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

$data = array('created_on' => date('Y-m-d H:i:s'));
ответил saurabh kamble 6 Jam1000000amMon, 06 Jan 2014 08:53:57 +040014 2014, 08:53:57
0

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

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

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

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

ответил Steven 3 Jam1000000amThu, 03 Jan 2013 01:39:58 +040013 2013, 01:39:58
0
    $data = array(
            'name' => $name ,
            'email' => $email,
            'time' =>date('Y-m-d H:i:s')
            );
            $this->db->insert('mytable', $data);
ответил sandeep kumar 24 PM000000120000000531 2016, 12:45:05
0

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

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

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

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

$this->db->last_query();
ответил williamli 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 23:16:22 +0400000000pmSun, 26 Feb 2012 23:16:22 +040012 2012, 23:16:22
0

Согласно исходному коду 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');
ответил Junliang Huang 29 PM00000060000000731 2014, 18:50:07
0

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

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

Вы можете найти документацию для date_helper здесь .

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

$this->db->insert('TABLENAME', $data);
ответил Brandon Hollenbeck 5 Jam1000000amSun, 05 Jan 2014 05:35:39 +040014 2014, 05:35:39
0

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

ответил user3526 21 PMpTue, 21 Apr 2015 14:43:49 +030043Tuesday 2015, 14:43:49
0

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

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

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
ответил khalrd 12 Mayam16 2016, 08:48:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132