CakePHP:findById返回不正确的行?

时间:2011-09-13 01:02:00

标签: php mysql sql cakephp

PHP版本:5.2.17

CakePHP版本: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';
}

我正在处理网站的“更改密码”部分,只有管理员才能访问。该表单有一个下拉菜单,用于选择要更改的密码,然后他们必须输入当前密码,新密码并确认新密码。

管理员提交“更改密码”表单后,控制器会检查他们正在更改的密码,然后在数据库中查找该密码以验证他们输入的密码是否正确。这是查找密码的代码:

$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 2,它总是在查找ID 1?我也尝试将“findById”更改为常规“查找”,但没有改变任何内容。似乎只有当我使用“id”字段作为条件时。为什么会这样?

2 个答案:

答案 0 :(得分:1)

有点偏离主题,但是如果有一天你的客户要求你有第三种类型的角色,这意味着不是管理员,而不是你今天所谓的“其他人”,会发生什么?使用您的数据库结构很难做到这一点。

Personaly我会从一个标准的用户数据表(即用户名)开始,好吧,好吧,如果你被要求永远不会显示它,好吧,永远不要在视图中显示它,但这会更加进化因为数据库可以为更多的功能做好准备。

顺便说一下,你为“密码”数据表“用户”调用模型这一事实让我觉得你的思维方式并不差; - )

只是我的两分钱......

答案 1 :(得分:1)

您的密码表的id字段定义为tinyint(1),即它只能是0或1. CakePHP正在做正确的事。