如何使用CodeIgniter的URL参数将项目插入数据库?

时间:2016-06-06 22:43:55

标签: php mysql json database codeigniter

我正在使用CodeIgniter从数据库中获取JSON项目并插入它们。我最初是按照CodeIgniter网站上的教程创建的,该网站使用表单将数据发送到数据库,并且工作正常。我正在尝试修改此代码,以便您可以通过将字段值放在URL字符串中来写入数据库。因此,要获取数据,它是http://www.mcbiscuit.com/index.php/robots/。这称为机器人控制器。

您还可以放置http://www.mcbiscuit.com/robots/(Name)以查看该机器人的数据库条目。我需要修复set方法,以便您可以使用像这个http://www.mcbiscuit.com/robots/create/(Name)/(StarsIn)/(Function)这样的URL来将包含这些详细信息的条目写入数据库,但无论我做什么,它都会为这些传递NULL值。如何正确插入记录?我已经阅读了有关使用PHP写入数据库以及CodeIgniter API调用等的所有内容,但我无法找到解决方案。

控制器代码:

<?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 个答案:

答案 0 :(得分:2)

robots/create的路由不正确,应该是

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

这样,codeigniter知道create/之后的任何内容都被视为GET /方法参数。

但你真的不应该使用GET参数来插入/更新/删除记录,因为例如我可以在某个网站的某个地方发布链接/图片,并将重定向链接发送到robots/create/some/idiotic/data和任何登录您网站点击我的链接/图片的人都会将垃圾数据插入您的数据库。

谷歌进行CSRF攻击以了解有关它的更多信息以及如何防范它。

同时查看set_robots方法,您正尝试使用创建$data数组 $this->input->post()但您没有使用POST,因此您的数组应该只是:

$data = array(
    'Name'     => $name,
    'StarsIn'  => $starsIn,
    'Function' => $function
);