如果您将用户名字段更改为唯一键字段怎么样,这意味着两行不能有相同的用户名,主键字段也是如此。这不应该破坏你的 php 代码。
CREATE TABLE users (
id int unsigned auto_increment,
username varchar(30),
password varchar(32),
userid varchar(32),
userlevel tinyint(1) unsigned not null,
email varchar(50),
timestamp int(11) unsigned not null,
unique key(username),
primary key (id)
);
编辑:
好的,如果您更改数据库架构,您还必须更改其他代码以匹配数据库架构。即在这种情况下,您必须更改将用户插入数据库的函数。让我解释一下我是如何调试的。
1)你没有提供完整的源代码,所以我用谷歌搜索了 Jpmaster77,我找到了这个网站
2)我意识到您正在尝试注册到系统中,我打开了 register.php 文件并搜索了该术语
很抱歉,发生了错误
我找到了正确的行,看到 $_SESSION['regsuccess'] 已设置,但设置为 false。
3)然后我打开process.php文件,看到procRegister-function中是调用该$session->register
函数的行,在这种情况下它返回2,因为注册不成功。
4)然后我必须知道做什么$session->register-function
。我session.php
从包含目录打开文件并搜索register
-function。我知道这个函数在这种情况下返回 2。所以我找到了return 2;
来自第 233 行的评论
注册尝试失败
5) 如果该函数返回 2,那一定是因为$database->addNewUser
函数返回 false。同样,我database.php
从包含目录打开文件并查看addNewUser
-function。
6)所以这里这个函数返回false。原因很明显:
该脚本尝试在数据库中插入一行而不在插入查询中提供列名。因此,如果您更改表列顺序并添加或删除列,例如在这种情况下,该脚本将失败。就像 MySQL 的文档说的:
如果您没有为 INSERT ... VALUES 或 INSERT ... SELECT 指定列名列表,则表中每一列的值必须由 VALUES 列表提供
您可以尝试通过为插入查询提供列名来解决此问题,但如果您不知道自己在做什么,则不建议这样做。
$q = sprintf("INSERT INTO ".TBL_USERS." (username, password, userid, userlevel, email, name) VALUES ('%s', '%s', '%s', '%s', '%s', $time, '0', '%s', '0', '0')",
mysql_real_escape_string($username),
mysql_real_escape_string($password),
mysql_real_escape_string($userid),
mysql_real_escape_string($ulevel),
mysql_real_escape_string($email),
mysql_real_escape_string($name));
我希望这篇文章可以帮助您找出问题并调试您的脚本。