CakePHP: findById возвращает неправильную строку? - PullRequest
1 голос
/ 13 сентября 2011

версия 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'])

По какой-то причине это SQL, сгенерированный CakePHP , независимо от того, на что установлена ​​переменная $this->data['User']['id'] (до тех пор, пока она является строкой) :

SELECT `User`.`id`, `User`.`password`, `User`.`is_admin_password` FROM `passwords` AS `User`   WHERE `User`.`id` = 1    LIMIT 1

Почему он всегда ищет идентификатор 1, даже когда я говорю ему искать идентификатор 2? Я также попытался изменить «findById» на обычный «find», и это ничего не изменило. Кажется, это только когда я использую поле "id" в качестве условия. Почему это происходит?

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

В вашей таблице паролей поле id определено как tinyint (1), т. Е. Оно может быть только 0 или 1. CakePHP делает все правильно.

1 голос
/ 13 сентября 2011

Немного не по теме, но что произойдет, если однажды ваш клиент попросит вас назначить третий тип роли, то есть не администратор, а не то, что вы сегодня называете «все остальные»?С вашей структурой базы данных это будет трудно сделать.

Лично я бы начал со стандартных данных пользователей (т.е. с именем пользователя), и хорошо, хорошо, если вас попросят никогда не отображать это, хорошо,никогда не отображать его в представлении, но это было бы намного более эволюционно, потому что база данных была бы готова для большего количества функциональных возможностей.

И, кстати, тот факт, что вы назвали модель для «паролей» датируемыми »«Пользователь» заставляет меня думать, что вы недалеки от того, чтобы думать одинаково; -)

Только мои два цента ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...