2011-04-09 2 views
1

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

статья: идентификатор (целое), название (VARCHAR), гиперссылка (VARCHAR), тело (текст), дата (даты и время)
пользователя: идентификатор (целое) ....
userarticle: UID (целое) , помощь (интермедиат) -где 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(''); 
    } 

мой newArticleview

<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" />

ответ

6

Вы выводите поле скрытой формы перед началом формы. Не уверен, что это нарушит 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), чтобы увидеть, что на самом деле подхватили - с использованием библиотеки ввода помогает sanities все для вас автоматически, это не является обязательным требованием, очевидно, но функциональность встроен в CI.

1

Одна из трех вещей здесь не так:

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

  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) 

Viola! Дата вы видите:

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 непосредственно в этом дб заявлении, если метод insert не дезинфицирует ваши данные вы уязвимы для инъекций атаки SQL ,

+0

вы знаете, как получить CodeIgniter забрать поле даты? Дата отображается в html как '' – Raptrex

+0

Я не думаю, что дата - это зарезервированное слово. http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html – Raptrex

+0

@Raptrex Я бы сказал, что это по-прежнему плохой выбор для имени столбца. Существует еще одно прилагательное, описывающее дату, которая делает ее более описательной. Кроме того, 'date()' является именем функции в php, так что кто знает, как codeigniter под капотом использует это определение. Меня не удивило бы, что он выполняет вызов на сегодняшний день, чтобы переопределить значение, которое вы предоставляете в своей форме. – Wes

1

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

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

Например:

$this->db->set('posted_date', 'CURDATE()', FALSE); 
Смежные вопросы