2012-03-28 69 views
2

在表'用户'中注册我的第一个用户时,id与链接表中的user_id相同,为1(语言)。然而,当我注册的其他用户(ID2中的用户)的语言USER_ID仍为1请参见SQL:外键无法正确链接

CREATE TABLE `language` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`native` varchar(30) NOT NULL, 
`other` varchar(30) NOT NULL, 
`other_list` varchar(9) NOT NULL, 
`other_read` varchar(9) NOT NULL, 
`other_spokint` varchar(9) NOT NULL, 
`other_spokprod` varchar(9) NOT NULL, 
`other_writ` varchar(9) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 


CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `md5_id` varchar(200) NOT NULL, 
    `full_name` tinytext CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `user_name` varchar(10) NOT NULL, 
    `user_email` varchar(30) NOT NULL, 
    `user_level` tinyint(4) NOT NULL DEFAULT '1', 
    `pwd` varchar(220) NOT NULL, 
    `nationality` varchar(30) NOT NULL, 
    `department` varchar(20) NOT NULL, 
    `birthday` date NOT NULL, 
    `date` date NOT NULL DEFAULT '0000-00-00', 
    `users_ip` varchar(200) NOT NULL, 
    `activation_code` int(10) NOT NULL DEFAULT '0', 
    `banned` int(1) NOT NULL, 
    `ckey` varchar(200) NOT NULL, 
    `ctime` varchar(220) NOT NULL, 
    `approved` int(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

这是我的PHP代码:

if(empty($_SESSION['$user_id'])) { // user not logged in; redirect to somewhere else } 
if (!empty($_POST['doLanguage']) && $_POST['doLanguage'] == 'Submit') 
{ 
$result = mysql_query("SELECT `id` FROM users WHERE `banned` = '0'") or 
die (mysql_error()); 


list($id) = mysql_fetch_row($result); 

session_start(); 
$_SESSION['user_id']= $id; 

sql_insert = "INSERT into `language` 
(`user_id`,`native`,`other`,`other_list`,`other_read`, `other_spokint` 
,`other_spokprod`,`other_writ` ) 
VALUES 
('$id','$native','$other','$other_list','$other_read','$other_spokint', 
'$other_spokprod','$other_writ') "; 

mysql_query($sql_insert,$link) or die("Insertion Failed:" . mysql_error());  
} 

header("Location: myaccount.php?id=' . $_SESSION[user_id] .'"); 
exit(); 

希望得到任何帮助!

+3

$ id在哪里填充?或者是这条线向后写:“$ _SESSION ['user_id'] = $ id;” – Yamikuronue 2012-03-28 16:06:24

+0

@Yamikuronue - 它来自与获取结果集一起工作的'list'构造。 – 2012-03-28 16:32:01

+0

@Yamikuronue我试图写它的另一种方式,但仍然有user_id 1的问题,当它应该是2.thanks – user1296762 2012-03-28 16:38:24

回答

1

我想这是因为你最初的选择查询是选择没有被禁止

所有用户因此需要更改查询由新用户过滤:

"SELECT `id` FROM users WHERE `banned` = '0' and id=" . $_SESSION['$user_id']; 

之所以USER_ID字段不断填充为1,因为mysql_fetch_row获得了第一个记录,即用户标识1.

因此,如果您按新用户过滤它,mysql_fetch_row应该获得新用户的标识。

编辑

我只是在看代码再次,它看起来像你没有保存在PHP的用户ID插入后,让你的$ _SESSION user_id是空。

所以我上面的例子不会工作。而不是上述查询,使用以下函数来获取您新创建的用户的ID。在运行插入查询后调用此函数。该功能将获得新创建的用户。

mysql_insert_id()

http://php.net/manual/en/function.mysql-insert-id.php

EDIT 2

OK,既然mysql_insert_id()为您没有工作,也许你可以尝试以下。我只是通过id desc来改变你的select查询。

$result = mysql_query("SELECT `id` FROM users WHERE `banned` = '0' order by id desc") 

只是说明一下,这可能不是最好的解决方案。但在低流量的网站上应该没问题。为了使查询更精确一点,您需要根据用户名或电子邮件等唯一字段来搜索用户标识。这将确保你得到正确的身份证。

编辑3 以下是检查用户电子邮件的示例。这只是mysql的查询,你必须调整这个php。对不起,我现在正在上课。

"SELECT `id` FROM users WHERE `banned` = '0' and email='[email protected]' limit 1 
+0

添加mysql_insert_id()没有好运。仍然user_id 1 :(我加入后 - mysql_query($ sql_insert,$链接)或死亡(“插入失败:”。mysql_error());} – user1296762 2012-03-28 20:42:10

+0

你做了像'$ userId = mysql_insert_id()'? – Gohn67 2012-03-28 20:55:04

+0

是尝试$ id = mysql_insert_id();和$ user_id = mysql_insert_id(); – user1296762 2012-03-28 20:57:59