php - 使用 CodeIgniter 构建动态查询

标签 php mysql codeigniter

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

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

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 值?

这是我的 Controller (实际上是它的一部分):

    $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 中,没有一个答案,但有几个答案取决于您的编码方式。请记住将您的逻辑应用于整个项目,而不是突然更改这个或那个模型/ Controller 。

对于我来说,我会这样做:

绝不相信用户的输入。

-检查您的所有 $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)

关于php - 使用 CodeIgniter 构建动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23091542/

相关文章:

php - 使用 dompdf 和 CodeIgniter 生成 pdf 文件

php - 获取通过 file_get_contents() 发送的请求 header

mysql - 我正在尝试执行 mysql 查询以获取只供应红色部分的供应商?

codeigniter - 如何为特定 Controller 加载钩子(Hook)

mysql - 授予命令语法错误

php - 使用内爆创建新表

php - 在 echo 语句中使用循环

php - 在 MySQL while 循环中连接另一个数据库

php - Laravel 身份验证不显示 session 消息

PHP 根据时间戳计算年龄和月份