Вставлення NOW () в базу даних за допомогою активного запису CodeIgniter


78

Я хочу вставити поточний час у базу даних за допомогою функції mySQL ЗАРАЗ () в активному записі Codeigniter. Наступний запит не буде працювати:

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

Це тому, що клас ActiveRecord CodeIgniter автоматично уникає вводу.

Наступне працює нормально, викликаючи set () та передаючи ператметр 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
Поза треком і навіть обсяг, але чи знаєте ви, що можете отримати ефект ЗАРАЗ (), як ефект strtotime? Наприклад, наприклад echo date("N", strtotime('now'));, дасть вам сьогоднішню дату, зверніться до php.net/strtotime та php.net/date
Кумар

Відповіді:


32

Якщо я сильно не помиляюся, відповідь: "Ні, ніяк".

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

Побічно, це date('Y-m-d');повинно працювати як PHP-версія NOW()MySQL. (Хоча це не буде працювати для всіх версій SQL).


22
Для простоти я завжди встановлюю мітки часу з датою ('Ymd H: i: s') з різними ORM тощо, не потрібно боротися з різними реалізаціями.
geekuality

2
Особисто я завжди використовую мітки часу Unix. Я знаю, що 1308124173975 завжди буде довгим (або int, або float, або еквівалентом) у кожній мові та базі даних. Мені подобається не турбуватися.
cwallenpoole

1
Це хороший момент. Я лінивий, тому мені подобається мати читабельні записи, якщо це можливо. :)
geekuality

1
@jupaju Це просто інший тип лінощів. Я міг пам’ятати, як PgSQL, MySQL, Oracle, Java, PHP та Python зберігають дати, або я міг просто мати все, щоби бути нудним числом. І знаєш що? Якщо це число, воно миттєво перекладається в AS2, AS3 та JS. А коли мені потрібна фактична дата? Перейдіть до Chrome, Ctrl-shift-J та вставте рядок (нова дата (/ * числова позначка часу * /))
cwallenpoole

4
Я хотів би зазначити, що використання дати ('Ymd H: i: s') може мати проблему, коли сервер MySQL та бібліотека PHP використовують два різні часові пояси, не знаючи про це. Наприклад, у мене був хост, який мав MySQL на GMT (+ 0h), а PHP був EST (-5h).
bafromca

76

Зазвичай я використовую тригери для обробки міток часу, але я думаю, що це може спрацювати.

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

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

будь-який спосіб використовувати now() + 1 dayякось для активних записів?
aspirinemaga

Чи є спосіб, який це може спричинити порожнє оновлення?
Едеф

1
Працював і для мене, CI2.1.2 2015 року
Федміч

1
@AnwarHossain Я використовую версію 3.1 і вона працює, можливо, є якась інша проблема.
Мухаммед

1
Я використовую версію CI 3.1.8, і вона працює абсолютно нормально :)
haidarvm

14

аспіринемага, просто замініть:

$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. Я б рекомендував використовувати рідну MySQL NOW (), а не дату PHP ('Ymd H: i: s'), якщо ви перебуваєте на спільному хості, оскільки для них можуть бути встановлені різні часові пояси.
bafromca

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
Працював у мене. Пояснення може допомогти, але мою проблему вирішило. 😁
Йорданія

time () не потрібен, date () завжди повертає поточний час
Loki

7

Ви можете завантажити помічник дати та використати інтеграл codeigniter зараз (), якщо хочете вказати зміщення часу GMT для користувачів

це виглядає приблизно так

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

Якщо ви не використовуєте основні налаштування GTM і не дозволяєте своїм користувачам встановлювати власні зсуви, немає переваги над використанням функції php's time ().


date () дає попередження php не покладатися на
системну

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, тому в цій ситуації працюють наступні коди (за допомогою ланцюгового методу):

$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 () у лапках не буде працювати, оскільки Active Record поміщає escape NOW () у рядок і намагається ввести його в db як рядок "NOW ()" ... вам потрібно буде використовувати

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

Я думаю, що це мертва ланка
Anwar Hossain

0

$this->db->query("update table_name set ts = now() where 1=1") також працює для поточної позначки часу!


0

запустити запит, щоб отримати зараз () з mysql, тобто вибрати зараз () як nowinmysql;

потім скористайтеся codeigniter, щоб отримати це і ввести

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.