因此,我的项目有一个表单,可以在其中将用户创建到数据库中。那里有三种类型的用户,管理员、管理员和最终用户。
我创建用户表的查询如下:
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中,没有一个答案,而是有几个答案,具体取决于您的编码方式。只需记住将您的逻辑应用于整个项目,而不是突然为这个或那个模型/控制器更改它。
至于我,我会这样做:
NEVER信任用户的输入。
-检查您的所有$数据,以便密码/用户名(以及其他内容)不为空!你需要在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)
实际上这并没有奏效。现在我得到一个关于外键的数据库错误:
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(); ?>