Codeigniter datetime не вставляется - PullRequest
1 голос
/ 09 апреля 2011

Я пытаюсь ввести дату и время в поле datetime в MySql. Прямо сейчас, это вводит дату и время как 00:00:00. У меня есть 3 таблицы: статья, пользователь и статьи пользователя.

статья: id (int), заголовок (varchar), URL (varchar), тело (текст), дата (datetime)
пользователь: id (int) ....
userarticle: uid (int), aid (int) - где uid - это user.id, а помощь - article.id

вот часть моего пользовательского контроллера:

function newArticle()
    {
        $this->load->view('newArticleview');
    }

    function insertArticle()
    {
            //insert from form into article table
        $this->db->insert('article', $_POST);

        //get ID of the row just added
        $rowID = $this->db->insert_id();
        $uid = $this->tank_auth->get_user_id();

        $data = array('uid' => $uid, 'aid' => $rowID);

            //insert uid and aid into userarticles table
        $this->db->insert('userarticles', $data);

        redirect('');
    }

мой новый артикльвью

<html>
<head>
    <title>Save Me - Add New Article</title>
</head>
<body>  
<?php
    $date = date("Y-m-d H:i:s");
    echo form_hidden('date', $date);
    echo form_open('user/insertArticle');
?>
<p>Title:<input type="text" name="title"></p>
<p>URL:<input type="text" name="url"></p>
<p><textarea name="body" rows="20"></textarea></p>

<p><input type="submit" value="Submit"></p>

</form>
</body>

</html>

Все правильно вставлено в базу данных, кроме даты и времени, кто-нибудь знает, что не так? Скрытая форма отображается правильно как <input type="hidden" name="date" value="2011-04-08 21:51:10" />

Ответы [ 3 ]

6 голосов
/ 09 апреля 2011

Вы выводите скрытое поле формы до ее запуска.Не уверен, что это сломает CI, но это неверная разметка.хелпер form_open может принимать третий аргумент - массив скрытых полей.Таким образом, что-то вроде этого может быть сделано вместо / сложение:

$hidden=array('item_id'=>$this->uri->segment(3)); 
echo form_open('admin/do_upload', '', $hidden); ?>

На самом деле вам не нужно помещать дату в представление, если вы не используете ее специально (например, для использования в javascript или чем-то еще).)

У меня есть что-то подобное в моей модели, созданное / измененное временем:

// $data contains everything from the form, I pass this to my model, and then do:

$data['created'] =  date('Y-m-d H:i:s');

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

Где created - имя моего столбца.

Если вы неЕсли вы не используете модель, вы можете вместо этого поместить ее в свой контроллер, но в интересах MVC она действительно должна быть в модели.

Не забывайте, что вы всегда можете сделать:

print_r($this->input->post()) или print_r($_POST), чтобы увидеть, что на самом деле подбирается - использование библиотеки ввода помогает автоматически защитить все для вас, это не так.очевидно, это требование, но функциональность встроена в CI.

1 голос
/ 11 апреля 2016

Просто введите приведенный ниже код перед тем, как вставить код в модель.

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

Например:

$this->db->set('posted_date', 'CURDATE()', FALSE);
1 голос
/ 09 апреля 2011

Здесь неправильно одно из трех:

  1. Значение $ _POST ['date'] = ''

  2. $ this-> db-> insert ('article', $ _POST);не выбирает поле из вашего сообщения и не рассматривает его как пустую строку ''.

  3. у вас есть дата имени столбца date, которое является зарезервированным словом

Вот доказательство того, что вы вставляете пустую строку.Сначала создайте пример таблицы и вставьте строку, которую, как вы думаете, вводите:

mysql> create table uho ( mine datetime );
Query OK, 0 rows affected (0.10 sec)

mysql> insert into uho values ( '2011-01-12 12:10:00' );
Query OK, 1 row affected (0.00 sec)

Получите:

mysql> select * from uho;
+---------------------+
| mine                |
+---------------------+
| 2011-01-12 12:10:00 |
+---------------------+
1 row in set (0.00 sec)

Теперь вставьте пустую строку:

mysql> insert into uho values ('');
Query OK, 1 row affected, 1 warning (0.05 sec)

Виола!Дата, которую вы видите:

mysql> select * from uho;
+---------------------+
| mine                |
+---------------------+
| 2011-01-12 12:10:00 |
| 0000-00-00 00:00:00 |
+---------------------+
2 rows in set (0.00 sec)

Также я очень надеюсь, что ради безопасности ваших приложений вы не используете $ _POST непосредственно в этом выражении db, если только метод insert не очищает ваши данные, к которым вы уязвимыSQL инъекция атаки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...