PHP版本:5.2.17
CakePHP version: 1.3.11
MySQL版本:5.5.9我正在为客户做一个非常简单的内部留言板网站。由于它仅供内部使用,因此客户端要求只有一个密码,而不是用户名和密码。没有用户名。管理员有一个密码,其他人有一个密码。
数据库结构如下:
CREATE TABLE `messages` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`date` date DEFAULT NULL,
`time` time DEFAULT NULL,
`from` varchar(255) DEFAULT NULL,
`to` varchar(255) DEFAULT NULL,
`subject` varchar(255) DEFAULT NULL,
`regards` varchar(255) DEFAULT NULL,
`memo` text,
`deleted` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
CREATE TABLE `passwords` (
`id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT,
`password` varchar(40) NOT NULL,
`is_admin_password` char(1) DEFAULT 'N',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
这是我的"用户"模型:
class User extends AppModel {
var $name = 'User';
var $useTable = 'passwords';
}
我现在在网站的"更改密码"部分工作,这是只有管理员可以访问。该表单有一个下拉菜单,用户可以在其中选择要更改的密码,然后输入当前密码、新密码和确认新密码。
一旦管理员提交"Change Password"表单,控制器检查他们正在更改的密码,然后在数据库中查找该密码以验证他们输入的当前密码是否正确。这是查找密码的代码:
$this->User->findById($this->data['User']['id'])
由于某些原因,CakePHP 生成的SQL无论$this->data['User']['id']
变量设置为什么(只要它是字符串):
SELECT `User`.`id`, `User`.`password`, `User`.`is_admin_password` FROM `passwords` AS `User` WHERE `User`.`id` = 1 LIMIT 1
为什么它总是查找ID 1,即使我告诉它查找ID 2?我还尝试将"findById"更改为常规的"find",但这没有改变任何东西。似乎只有当我使用"id"字段作为条件时才会这样。为什么会发生这种情况?
密码表的id字段定义为tinyint(1),即它只能是0或1。
有点离题,但是如果有一天您的客户要求您拥有第三种类型的角色,即不是管理员,也不是您今天所说的"其他人",会发生什么?在你的数据库结构下,很难做到这一点。
我个人会从一个标准的用户数据表(即用户名)开始,好吧,如果你被要求永远不要显示它,好吧,永远不要在视图中显示它,但这将是真正的进化,因为数据库将准备好更多的功能。
顺便说一下,你把'密码'数据表的模型称为'用户'这一事实使我认为你的想法并不遥远;-)