外键未正确链接

时间:2012-03-28 16:02:48

标签: php mysql

在表'users'中注册我的第一个用户时,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();

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我认为这是因为您的初始选择查询是选择所有未被禁止的用户

因此需要更改查询以供新用户过滤:

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

user_id字段保持填充为1的原因是因为mysql_fetch_row获取了第一条用户ID为1的记录。

因此,如果您通过新用户过滤它,mysql_fetch_row应该获得新用户的ID。

修改

我只是再次查看代码,看起来你插入后不会在php中存储用户ID,所以$ _SESSION的user_id为空。

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

mysql_insert_id()

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

编辑2

好的,因为mysql_insert_id()不适合你,也许你可以尝试以下方法。我刚刚将你的选择查询更改为id desc。

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

请注意,这可能不是最佳解决方案。但在流量较低的网站上应该没问题。为了使查询更准确一些,您需要根据用户名或电子邮件等唯一字段搜索用户ID。这样可以确保您获得正确的ID。

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

"SELECT `id` FROM users WHERE `banned` = '0' and email='user@email.com' limit 1