Я на самом деле не предлагаю, чтобы вы это делали, поскольку индекс UNIQUE
, предложенный Piskvor и другими, намного лучший способ сделать это, но вы действительно можете делать то, что пытаетесь:
CREATE TABLE `table_listnames` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`address` varchar(255) NOT NULL,
`tele` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Вставить запись:
INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
SELECT * FROM `table_listnames`;
+----+--------+-----------+------+
| id | name | address | tele |
+----+--------+-----------+------+
| 1 | Rupert | Somewhere | 022 |
+----+--------+-----------+------+
Попробуйте снова вставить одну и ту же запись:
INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
+----+--------+-----------+------+
| id | name | address | tele |
+----+--------+-----------+------+
| 1 | Rupert | Somewhere | 022 |
+----+--------+-----------+------+
Вставить другую запись:
INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name = 'John'
) LIMIT 1;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
SELECT * FROM `table_listnames`;
+----+--------+-----------+------+
| id | name | address | tele |
+----+--------+-----------+------+
| 1 | Rupert | Somewhere | 022 |
| 2 | John | Doe | 022 |
+----+--------+-----------+------+
И так далее ...
Вы могли использовать эту стратегию, описал здесь как лучшую практику (2006) или обновленная стратегия, описанная здесь (2015):
Этот подход обеспечивает защиту подробно. Если кому-то удается пропустить таблицу базы данных, она не дает взломщику открытую дверь для исполнения роли пользователей.
Я сохранил бы идентификатор пользователя и маркер. Когда пользователь возвратится к сайту, сравните те два сведения с чем-то персистентным как запись базы данных.
Что касается безопасности, просто не помещайте ничего там, которое позволит кому-то изменять cookie для получения дополнительной выгоды. Например, не храните их группы пользователей или их пароль. Что-либо, что может быть изменено, который обошел бы Вашу безопасность, не должно быть сохранено в cookie.
Сохраните их UserId и RememberMeToken. Когда они входят в систему с, помнят меня проверенный, генерируют новый RememberMeToken (которые делают недействительным любые другие машины, которые отмечены, помнят меня).
, Когда они возвращаются, ищут их тем, чтобы помнить меня маркер и удостоверяются соответствия UserId.
Исследование персистентных сессий самостоятельно, я нашел, что это просто не стоит угрозы безопасности. Используйте его, если Вы абсолютно имеете к, но необходимо считать такую сессию только слабо аутентифицируемой и вызвать новый вход в систему для чего-либо, что могло быть значимо для взломщика.
причина, являющаяся, конечно, состоит в том, что Ваши cookie, содержащие Вашу персистентную сессию, так легко украдены.
4 способа украсть Ваши cookie (от комментарий Jens Roland на странице @splattne
основывал его ответ на):