2015-10-13 65 views
0

Error: Cannot add or update a child row: a foreign key constraint fails? (testlogin . leavetable , CONSTRAINT leavetable_ibfk_1 FOREIGN KEY
(users_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE)SQL一對多用戶外鍵問題

在最後一天半的時間裏得到這條消息。試圖在兩個表之間建立一對多(外鍵)關係。在users:idleavetable:users_id之間。當用戶登錄時,他們會得到一個ID。當他們將表格提交給hours列時,我希望ID能夠保留表格數據。當有人創建一個新的身份證號碼並且不會更新leavetable:user_id時,它會拋出錯誤。它會拋出上面的錯誤。

發生了什麼事?我以正確的方式接近這個嗎?

這裏是我的代碼:

CREATE TABLE IF NOT EXISTS `users` ( 
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`id` int(11) NOT NULL, 
`password` char(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`salt` char(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 



CREATE TABLE IF NOT EXISTS `leavetable` ( 
`hours` int(11) NOT NULL, 
`users_id` int(11) DEFAULT NOT NULL, 
`id` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


ALTER TABLE `users` 
ADD PRIMARY KEY (`id`) USING BTREE, 
ADD UNIQUE KEY `email` (`email`) USING BTREE, 
ADD UNIQUE KEY `username` (`username`) USING BTREE; 

ALTER TABLE `leavetable` 
ADD PRIMARY KEY (`id`) USING BTREE, 
ADD KEY `users_id` (`users_id`) USING BTREE; 

ALTER TABLE `leavetable` 
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 
-- AUTO_INCREMENT for table `users` 
ALTER TABLE `users` 
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 

ALTER TABLE `leavetable` 
ADD CONSTRAINT `leavetable_ibfk_1` FOREIGN KEY (`users_id`) REFERENCES 
`users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

我的表結構:

+---------------------+ 
| Tables_in_testlogin | 
+---------------------+ 
| leavetable   | 
| users    | 
+---------------------+ 

+----------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+--------------+------+-----+---------+----------------+ 
| email | varchar(255) | NO | UNI | NULL |    | 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| password | char(64)  | NO |  | NULL |    | 
| salt  | char(16)  | NO |  | NULL |    | 
| username | varchar(255) | NO | UNI | NULL |    | 
+----------+--------------+------+-----+---------+----------------+ 
5 rows in set (0.01 sec) 

+----------+---------+------+-----+---------+----------------+ 
| Field | Type | Null | Key | Default | Extra   | 
+----------+---------+------+-----+---------+----------------+ 
| hours | int(11) | NO |  | NULL |    | 
| users_id | int(11) | NO | MUL | NULL |    | 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
+----------+---------+------+-----+---------+----------------+ 
3 rows in set (0.01 sec) 

PHP代碼:

mysql_select_db("testlogin", $con); 
$sql="INSERT INTO leavetable (hours) 
VALUES 
('$_POST[hours]')"; 
if (!mysql_query($sql,$con)) 
    { 
    die('Error: ' . mysql_error()); 
    } 
+0

你是什麼意思的「當sy創建一個新的ID號碼」?你是否嘗試同時創建一個新用戶和一個入口? – Shadow

+0

否。用戶註冊時,會在用戶表中創建一個帶有ID的記錄。然後,他們用表格提交一個頁面並將數據提交給離開表格:小時。 –

+0

我在最後用我的PHP腳本更新了我的原始文章。當我在myphpadmin中輸入值時,我得到錯誤代碼,但我的表格仍然更新。 –

回答

0
$sql="INSERT INTO leavetable (hours) 
VALUES 
('$_POST[hours]')"; 

上面的SQL代碼不包含用戶的任何引用ID。 mysql應該如何猜測這個離開條目屬於哪個用戶?在插入語句的列和值部分中包含tge用戶標識。可能你應該在php會話中存儲用戶標識。

+0

將用戶標識存儲在php會話中是否存在安全問題? –

+0

會話值存儲在服務器上,客戶端只會知道會話ID。除非sy可以劫持會話,否則會話變量是安全的。保護會話是一個完全不同於現在的問題。 – Shadow

0

看起來我已經有了。我的表單中基本上有一個隱藏字段,其中包含用戶標識。當表格被提交時,將其與表格信息一起提交給離開表格。不知道這是否是正確的方式去做,但它似乎工作。

表單代碼:

<input type="number" name="hours" value="" /> 
    <label>id: </label> 
    <input type="text" name="id" value="<?php 
    echo htmlentities($_SESSION['user']['id'], ENT_QUOTES, 'UTF-8'); 
    ?>" /> <br /><br /> 
    <input type="submit" class="btn btn-info" name="submit" value="Submit" /> 

SQL:

$sql = "INSERT INTO leavetable (hours, users_id) 
VALUES ('{$mysqli->real_escape_string($_POST['hours'])}', 
     '{$mysqli->real_escape_string($_POST['id'])}')"; 
$insert = $mysqli->query($sql); 

它的工作原理。這是否是最好的方法呢?