2016-06-06 2 views
0

Я использую CodeIgniter для получения элементов JSON из базы данных, а также их вставки. Я изначально создал его после учебника на сайте CodeIgniter, который использует форму для отправки данных в базу данных и работает правильно. Я пытаюсь изменить этот код, чтобы вы могли писать в базу данных, поместив значения полей в строку URL. Итак, чтобы получить данные, это http://www.mcbiscuit.com/index.php/robots/. Это вызывает контроллер Robots.Как вставить элементы в базу данных с помощью параметров URL с помощью CodeIgniter?

Вы также можете поставить http://www.mcbiscuit.com/robots/(Name), чтобы увидеть запись базы данных для этого робота. Мне нужно исправить метод set, чтобы вы могли использовать такой URL-адрес http://www.mcbiscuit.com/robots/create/(Name)/(StarsIn)/(Function), чтобы записать запись с этими данными в базу данных, но что бы я ни делал, она передает значения NULL для них. Как я могу правильно вставить записи? Я прочитал все, что могу, о написании в базах данных с PHP и вызовах API CodeIgniter и т. Д., И я не могу найти решение.

контроллер код:

<?php 
class Robots extends CI_Controller { 

     public function __construct() 
     { 
      parent::__construct(); 
      $this->load->model('robot_model'); 
      $this->load->helper('url_helper'); 
     } 

     public function index() 
     { 
      header('Content-type: application/json'); 
      echo json_encode($this->robot_model->get_robots(), JSON_PRETTY_PRINT); 
      //$data['Robots'] = $this->robot_model->get_robots(); 
      //$data['title'] = 'Robots'; 

      $this->load->view('robots/index'); 
     } 
     public function view($name = NULL) 
     { 
      header('Content-type: application/json'); 
      echo json_encode($this->robot_model->get_robots($name), JSON_PRETTY_PRINT); 
      $this->load->view('robots/view'); 
     } 

     public function create($name, $starsIn, $function) 
     { 
      $this->robot_model->set_robots($name, $starsIn, $function); 
      $this->load->view('robots/success'); 
     } 
} 

Код модели:

<?php 
class Robot_model extends CI_Model { 

     public function __construct() 
     { 
       $this->load->database(); 
     } 

     public function get_robots($name = FALSE) 
     { 
      if ($name === FALSE) 
      { 
        $query = $this->db->get('Robots'); 
        return $query->result_array(); 
      } 

      $query = $this->db->get_where('Robots', array('Name' => $name)); 
      return $query->row_array(); 
     } 

     public function set_robots($name, $starsIn, $function) 
     { 
      //$data = parse_str($_SERVER['QUERY_STRING'], $_GET); 

      $data = array(
       'Name' => $this->input->post('name'), 
       'StarsIn' => $this->input->post('starsIn'), 
       'Function' => $this->input->post('function') 
      ); 
      var_dump($data); 

      return $this->db->set('Robots', $data); 
     } 
} 

код маршрутизации, потому что я не уверен, что это правильно:

$route['robots/create'] = 'robots/create'; 
$route['robots/(:any)'] = 'robots/view/$1'; 
$route['robots'] = 'robots'; 
$route['(:any)'] = 'pages/view/$1'; 
$route['default_controller'] = 'pages/view'; 
+1

Вы можете использовать [$ this-> uri- > сегмент ($ n)] (https://codeigniter.com/userguide3/libraries/uri.html#CI_URI::segment) или [$ this-> uri-> rsegment ($ n)] (https: // codeigniter .com/userguide3/libraries/uri.html # CI_URI :: rsegment), чтобы достичь этих значений. Кроме того, поместите контроллер по умолчанию в начало файла ** routes.php **. [Последняя строка в документе] (https://codeigniter.com/userguide3/general/routing.html): * Зарезервированные маршруты должны появляться перед любыми шаблонами подстановочных знаков или регулярных выражений. * – Tpojka

+0

Спасибо! Я изменил маршрут. –

+1

Нет проблем. Самое главное, что вы решили свою проблему. #SOreadytohelp – Tpojka

ответ

2

Да маршрутизации для robots/create неверен , это должно быть

$route['robots/create/(:any)/(:any)/(:any)'] = 'robots/create/$1/$2/$3'; 

Таким образом, codeigniter знает, что что-либо после create/ считается параметром GET/method.

Но вы действительно не должны использовать параметры GET для вставки/обновления/удаления записей, потому что, например, я мог бы разместить ссылку/изображение где-нибудь на каком-либо веб-сайте и поместить ссылку перенаправления на ваш robots/create/some/idiotic/data и всех, кто вошел в систему ваш сайт, который нажимает на мою ссылку/картинку, вставляет данные мусора в вашу базу данных.

Google для атаки CSRF, чтобы узнать больше об этом и как защитить от него.

Кроме того, глядя на set_robots метод, который вы пытаетесь создать $data массив с $this->input->post(), но вы не используете POST, чтобы ваш массив должен быть просто:

$data = array(
    'Name'  => $name, 
    'StarsIn' => $starsIn, 
    'Function' => $function 
); 
Смежные вопросы