【问题标题】:Building dynamic queries with CodeIgniter使用 CodeIgniter 构建动态查询
【发布时间】:2014-04-15 18:25:23
【问题描述】:

所以,我有我的项目表单,我可以在其中将用户创建到数据库中。那里 是三种类型的用户类型,管理员、版主和最终用户。

我创建用户表的查询如下:

CREATE TABLE IF NOT EXISTS users (

    id SMALLINT(5) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(70) NOT NULL,
    email VARCHAR(70) NOT NULL,
    username VARCHAR(9) NOT NULL,
    password VARCHAR(60) NOT NULL,
    user_type ENUM('admin','moderator','enduser'),
    phone_number VARCHAR(10) NOT NULL,

    school_id SMALLINT(5) UNSIGNED DEFAULT NULL,
    CONSTRAINT fk_school_id
    FOREIGN KEY (school_id)
    REFERENCES schools(id)
    ON UPADTE CASCADE ON DELETE RESTRICT,

    subject_id SMALLINT(5) UNSIGNED DEFAULT NULL,
    CONSTRAINT fk_subject_id
    FOREIGN KEY (subject_id)
    REFERENCES subjects(id)
    ON UPDATE CASCADE ON DELETE RESTRICT

) ENGINE = INNODB;

所以 school_id 和 subject_id 作为外键工作。

在我的表单中,我有选择菜单,我可以在其中选择创建某种类型的用户。如果我选择创建管理员,表单将不会显示学校和学科的隐藏选择菜单。如果我选择创建版主,表单将显示隐藏的选择菜单。这是通过 JavaScript 完成的。

当我创建管理员时,一切正常。它将所有值存储在数据库中,并将 school_id 和 subject_id 值设置为 NULL。当我决定创建一个版主时,就会出现问题。即使我在选择菜单中设置了这些值,它仍然会将 school_id 和 subject_id 值设置为。

我知道我需要构建一个动态查询。只是不知道如何在 CodeIgniter 中以正确的方式实现它。如果我只是用意大利面条式的 PHP 编码,那将是小菜一碟,但由于我非常想学习使用 MVC 框架,所以这不是一个选择。

这是我的模型:

public function add_user($data) {

    $data = array(
            'username' => $data['username'],
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => $data['password'],
            'user_type' => $data['user_type'],
            'phone_number' => $data['phone_number']
        );

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

我是否应该将这些 school_id 和 subject_id 值包含在数组中?

这是我的控制器(实际上是它的一部分):

    $this->load->model('user');

    $name = ucfirst($this->input->post('f_name')). " " .ucfirst($this->input->post('l_name'));

    $data = array (
            'name'          => $name,
            'email'         => $this->input->post('email'),
            'username'      => $username,
            'password'      => $this->phpass->hash($password),
            'user_type'     => $this->input->post('user_type'),
            'phone_number'  => $this->input->post('phone_number'),

        );

// Here's where I'm trying to build the dynamic part 

    if($this->input->post('school_id') && $this->input->post('subject_id'))
    {

        $data['school_id'] = $this->input->post('school_id');
        $data['subject_id'] = $this->input->post('subject_id');
    }

    if($this->user->add_user($data))
    {
    // Inserted successfully
}

显然这不是正确的方法,因为它不起作用。我应该怎么做才能使用最佳做法使其发挥作用?

提前致谢!

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    在 PHP 中,没有 一个 答案,但有几个答案取决于您的编码方式。请记住在整个项目中应用您的逻辑,而不是突然为这个或那个模型/控制器更改它。

    至于我,我会这样做:

    从不相信用户的输入。

    -检查您的所有 $data 以确保密码/用户名(以及其他)不为空!您需要在 javascript 和 PHP 中执行此操作!

    -看到你不会有很多学校和科目,你可以检查它们的有效性(但你使用的是 InnoDB,所以这不是必需的)

    public function add_user($data)
    {
        $minimalUser = array('username','password');
        if (count(array_diff($minimalUser, array_keys($data))) != 0) {
            return false;  //If a $data is missing, do not create the user !
        }
    
        $data = array(
                'username' => $data['username'],
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => $data['password'],
                'user_type' => $data['user_type'],
                'phone_number' => $data['phone_number'],
                'subject_id' => isset($data['subject_id']) ? $data['subject_id'] : null,
                'school_id' => isset($data['school_id']) ? $data['school_id'] : null
            );
        $this->db->insert('users', $data);
    }
    

    此代码适用于您的所有案例!版主、管理员和最终用户。

    另一点:检查提供的电子邮件。有的东西:filter_var("some@address.com", FILTER_VALIDATE_EMAIL)

    【讨论】:

    • 检查我的答案。我使用 CodeIgniters form_validation 库,只是没有将它包含在此处。
    • 回答?所以如果你回答了你的问题,就没有更多的问题了吗?虽然我不认为这是一个答案。
    • 不,当然问题没有解决。我只是决定把它贴在下面而不是编辑我以前的帖子。对此感到抱歉。
    【解决方案2】:

    其实那行不通。现在我收到关于外键的数据库错误:

    Cannot add or update a child row: a foreign key constraint fails (`mydatabase`.`users`, CONSTRAINT `fk_school_id` FOREIGN KEY (`school_id`) REFERENCES `schools` (`id`) ON UPDATE CASCADE)
    
        INSERT INTO `users` (`username`, `name`, `email`, `password`, `user_type`, `phone_number`, `subject_id`, `school_id`) VALUES ('xxx', 'xxx', 'xxx', '$2a$08$VT4QYX9kiy8i7ivLmbVVre7AQfiKxAQ.0E9jGF0PbS.PNVTTmpLK2', 'moderator', 'xxx', 0, 0)
    

    可能是因为我使用另一个控制器和模型从数据库中获取这些科目和学校?

    控制器获取所有科目和学校:

    <?php
    
    class Dashboard extends CI_Controller {
    
        public function __construct()
        {
    
            parent::__construct();
            $this->load->model('subject');
        }
    
    
        public function index() {
    
            $data['subjects'] = $this->subject->get_all_subjects();
            $data['schools'] = $this->subject->get_all_schools();
    
            $this->load->view('header');
            $this->load->view('dashboard', $data);
            $this->load->view('footer');
        }
    
    
    }
    
    ?>
    

    获取所有学校和科目的模型:

    <?php
    
    class Subject extends CI_Model
    {
    
        public function get_all_subjects()
        {
    
            $this->db->select('*')->from('subjects')->order_by('name', 'asc');
    
            $query = $this->db->get();
    
            return $query->result_array();
        }
    
        public function get_all_schools()
        {
    
            $this->db->select('*')->from('schools')->order_by('name', 'asc');
    
            $query = $this->db->get();
    
            return $query->result_array();
        }
    
    
    }
    
    
    ?>
    

    我的观点(dashboard.php):

    <?php echo form_open('users/add_user', $attributes); ?>
    
        <span class="close_form_button_add_user_form">X</span>
    
        <?php echo validation_errors('<div class="login_error">', '</div>'); ?>
    
        <div class="form_row">
        <input type="text" name="f_name" placeholder="Etunimi" class="half-width" />
        <input type="text" name="l_name" placeholder="Sukunimi" class="half-width" style="float: right; margin-right: 24px;"/>
        </div>
    
    
        <div class="form_row">
        <input type="email" name="email" placeholder="Uuden käyttäjän sähköpostiosoite" class="user full-width" />
        </div>
    
    
        <div class="form_row">
        <input type="email" name="email_confirm" placeholder="Sähköpostiosoite uudelleen" class="user full-width" />
        </div>
    
        <div class="form_row">
        <input type="text" name="phone_number" placeholder="Puhelinnumero (0401234567)" class="full-width" />
        </div>
    
    
        <div class="form_row" style="margin-top: 20px;">
        <select name="user_type" class="add_user_select" id="select_user_type">
            <option value="">Käyttäjätyyppi</option>
            <option value="admin">Hallinto</option>
            <option value="moderator">Hallinto 2</option>
            <option value="enduser">Pääkäyttäjä</option>
        </select>
    
        <input type="submit" name="add_user" value="Luo käyttäjä" class="login_submit" id="submit_user" style="margin: 5px 24px 0px 0px;"/>
        </div>
    
        <div class="form_row" id="add_user_optional_information">
        <select name="school" class="add_user_select half-width">
            <option value="">Koulutalo</option>
            <?php  foreach($schools as $school) :?>
            <option value="<?=$school['id']?>"><?=$school['name']?></option>
            <?php endforeach; ?>
        </select>
    
        <select name="subject" class="add_user_select half-width">
            <option value="">Laji</option>
            <?php  foreach($subjects as $subject) :?>
            <option value="<?=$subject['id']?>"><?=$subject['name']?></option>
            <?php endforeach; ?>
        </select>
        </div>
    
    <?php echo form_close(); ?>
    

    【讨论】:

    • 这不应该是答案,而是对您帖子的编辑。不管怎样,问题是你想在 school_id、subject_id 中插入 0,0。 foreign_key 告诉你这样的学校和学科不存在。在我的代码中,试试这个 'subject_id' =&gt; empty($data['subject_id']) ? null : $data['subject_id'](和 school_id 一样)
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2014-07-04
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多