作为练习,我试图使用CodeIgniter创建一个非常基本的Twitter克隆。我目前正在尝试创建一个简单的注册/注册表单来创建一个帐户并将其添加到数据库表用户。 这些字段是 名字 , 姓氏 , 用户名 , 电子邮件地址 , 密码 , 密码确认 < /强>
但是,我收到以下错误。
错误号码:1452
无法添加或更新子行:外键约束失败(
lamp
。users
,CONSTRAINTusers_ibfk_1
FOREIGN KEY(user_id
)参考tweets
(user_id
))INSERT INTO
users
(first_name
,last_name
,username
,password
)VALUES('fn','ln' ,'username','user @ gmail.com','pw')文件名:models / User_model.php
行号:33
我在 Tweet_model.php 中使用 user_id 列加入了我的两个表用户和推文表
两个表中 user_id 的结构为:
推文表
字段:user_id,类型:INT,长度:11,无符号,密钥:MUL
用户表
字段:user_id,类型:INT,长度:11,无符号,键:PRI,额外:auto_increment
我的代码如下:
控制器: Register.php
class Register extends CI_Controller
{
public function index()
{
$this->load->model('user_model');
$this->form_validation->set_rules('first_name', 'First Name', 'required');
$this->form_validation->set_rules('last_name', 'Last Name', 'required');
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
if ($this->form_validation->run() == false) {
$this->load->view('templates/header');
$this->load->view('register');
$this->load->view('templates/footer');
} else {
$this->user_model->set_user();
$this->load->view('templates/header');
$this->load->view('home');
$this->load->view('templates/footer');
}
}
}
型号: User_model.php
class User_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_users($user_id = false)
{
if ($user_id === false) {
$query = $this->db->get('users');
return $query->result_array();
}
$query = $this->db->get_where('users', array('user_id' => $user_id));
return $query->row_array();
}
public function set_user()
{
$url = url_title($this->input->post('user'), 'dash', true);
$data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'username' => $this->input->post('username'),
'email' => $this->input->post('email'),
'password' => $this->input->post('password')
);
return $this->db->insert('users', $data);
}
}
查看: register.php
<form action="/index.php/register" method="POST">
<h5>First Name</h5>
<input type="text" name="first_name" value="" size="50" />
<h5>Last Name</h5>
<input type="text" name="last_name" value="" size="50" />
<h5>Username</h5>
<input type="text" name="username" value="" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="" size="50" />
<h5>Password</h5>
<input type="text" name="password" value="" size="50" />
<h5>Password Confirm</h5>
<input type="text" name="passconf" value="" size="50" />
<div><input type="submit" value="Register" /></div>
</form>
Tweet_model.php
class Tweet_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_tweets($tweet_id = false)
{
if ($tweet_id === false) {
$this->db->join('users', 'tweets.user_id = users.user_id');
$query = $this->db->get('tweets');
return $query->result_array();
}
$query = $this->db->get_where('tweets', array('tweet_id' => $tweet_id));
return $query->row_array();
}
public function set_tweet()
{
$tweet = url_title($this->input->post('tweet'), 'dash', true);
$data = array(
'tweet' => $this->input->post('tweet')
);
return $this->db->insert('tweets', $data);
}
}
编辑:这是倒退。但是现在我想在发布推文时遇到同样的问题。
错误号码:1452
无法添加或更新子行:外键约束失败(
lamp
。tweets
,CONSTRAINTtweets_ibfk_1
FOREIGN KEY(user_id
)参考users
(user_id
))INSERT INTO
tweets
(tweet
)VALUES('测试推文')文件名:models / Tweet_model.php
行号:30
答案 0 :(得分:1)
似乎外键约束是向后定义的。
我对问题中展示的特定用例没有理解......但我怀疑这是user
和tweet
之间的一对多关系
tweet
由一个user
组成。
user
可以为零,一个或多个tweet
。
通常情况下,我们与“很多”方面的外键实现一对多关系,指向“一方”
e.g。
CREATE TABLE tweet
( ...
, user_id
, ...
, CONSTRAINT FK_tweet_user FOREIGN KEY (user_id) REFERENCES user (id)
, ...
此约束将阻止将行添加到tweet
,其中包含“无效”user_id
(不引用user
中的行的值)
如果我们向后定义外键,反过来说,只要在user
中找不到匹配值,我们就会阻止向tweet
添加行。也就是说,在我们在tweet
中为该用户添加一行之前,我们无法添加用户。
修改强>
一旦外键以正确方式翻转,我们需要在向user_id
插入行时为tweet
列提供值。
INSERT INTO tweet (user_id, tweet) VALUES
-- ^^^^^^^^
( 42, 'rt this if you’re ready for #NoMore with @PRETTYMUCH and @FrencHMonTanA' )
;
-- ^^^
答案 1 :(得分:0)
user_id是AUTO_INCREMENT吗?如果没有,您将始终尝试插入user_id 0(默认INT值),并且由于它是唯一的,它会失败。