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

标签 php mysql json database codeigniter

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

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

Controller 代码:

<?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';

最佳答案

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

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

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

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

Google 了解 CSRF 攻击,了解有关该攻击的更多信息以及如何防范它。

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

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

关于php - 如何使用 CodeIgniter 的 URL 参数将项目插入数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37667944/

相关文章:

mysql - 如何在第三个表上匹配两种记录

mysql - 如何获取具有特定值的下一条记录,然后返回一条记录以从日志中计算 session 持续时间?

php - 使用 php 和 javascript AJAX 连接到数据库

php - Laravel 5 运行队列 :work on laravel schedule

php - CodeIgniter 和 PHP 5.5.14 - mysql_escape_string() 问题

javascript - 如何从对象中获取键值?

c# - .Net Core 2.0 替代 HttpResponseBase

php - Laravel - 返回 json 和 http 状态码

php - 如果案例为真,需要向用户抛出错误

php - 根据 REGEX 将 mysql 列值拆分为 2 列