Php 策略查询执行
在users表中插入新记录时,首先检查电子邮件和昵称尚未添加。另一个同时使用相同数据注册的用户是否有可能得到错误的结果?澄清: 连接1:Php 策略查询执行,php,mysql,Php,Mysql,在users表中插入新记录时,首先检查电子邮件和昵称尚未添加。另一个同时使用相同数据注册的用户是否有可能得到错误的结果?澄清: 连接1: > SELECT * FROM account WHERE username = 'test'; > SELECT * FROM account WHERE username = 'test'; > INSERT INTO account(username) VALUES ('test'); DELIMITER $$ CREATE
> SELECT * FROM account WHERE username = 'test';
> SELECT * FROM account WHERE username = 'test';
> INSERT INTO account(username) VALUES ('test');
DELIMITER $$
CREATE TRIGGER bi_account_each BEFORE INSERT ON account FOR EACH ROW
BEGIN
declare MaxAge integer;
SELECT Max(account.age) INTO MaxAge FROM account;
IF (new.age <= MaxAge) THEN BEGIN
/* force an error by selecting from a table_that_does_not_exist.*/
SELECT * FROM
ErrFromTrigger_bi_account_each_New_Member_Must_Be_Older_then_The_Last
END; END IF;
END$$
DELIMITER ;
空集(0.00秒)
连接2:
> SELECT * FROM account WHERE username = 'test';
> SELECT * FROM account WHERE username = 'test';
> INSERT INTO account(username) VALUES ('test');
DELIMITER $$
CREATE TRIGGER bi_account_each BEFORE INSERT ON account FOR EACH ROW
BEGIN
declare MaxAge integer;
SELECT Max(account.age) INTO MaxAge FROM account;
IF (new.age <= MaxAge) THEN BEGIN
/* force an error by selecting from a table_that_does_not_exist.*/
SELECT * FROM
ErrFromTrigger_bi_account_each_New_Member_Must_Be_Older_then_The_Last
END; END IF;
END$$
DELIMITER ;
空集(0.00秒)
查询正常,1行受影响(0.01秒)
连接1:
> SELECT * FROM account WHERE username = 'test';
> SELECT * FROM account WHERE username = 'test';
> INSERT INTO account(username) VALUES ('test');
DELIMITER $$
CREATE TRIGGER bi_account_each BEFORE INSERT ON account FOR EACH ROW
BEGIN
declare MaxAge integer;
SELECT Max(account.age) INTO MaxAge FROM account;
IF (new.age <= MaxAge) THEN BEGIN
/* force an error by selecting from a table_that_does_not_exist.*/
SELECT * FROM
ErrFromTrigger_bi_account_each_New_Member_Must_Be_Older_then_The_Last
END; END IF;
END$$
DELIMITER ;
错误。复制密钥
我想知道的是,MySQL是否能以这种方式工作,在查询出现时运行查询,以及使用的最佳实践。
我注意到,在一个过渡过程中,发生了一些变化由其他连接创建的连接不可见。为什么?您可以使用选择。。。对于转换之外的更新?建议大量使用外键来确保数据完整性
编辑:
换句话说。忽略这个愚蠢的例子。我希望下一个注册用户的年龄大于所有已注册用户的年龄
> SELECT MAX (age) FROM account;
[…检查用户的年龄是否更高…]
> INSERT INTO accounts (age) VALUES ('$ var');
如何确保有两个用户在同一个现场营地存在风险?在这种情况下,最佳做法是创建
唯一的约束(唯一索引
)
当您同时得到两个查询时,您将得到一个失败的查询,并且能够通过向用户发送正确的消息来处理它。Gheez列出MySQL的所有最佳实践需要一本书
让我首先回答:
我希望下一个注册用户的年龄大于所有已注册用户的年龄
> SELECT MAX (age) FROM account;
使用触发器:
> SELECT * FROM account WHERE username = 'test';
> SELECT * FROM account WHERE username = 'test';
> INSERT INTO account(username) VALUES ('test');
DELIMITER $$
CREATE TRIGGER bi_account_each BEFORE INSERT ON account FOR EACH ROW
BEGIN
declare MaxAge integer;
SELECT Max(account.age) INTO MaxAge FROM account;
IF (new.age <= MaxAge) THEN BEGIN
/* force an error by selecting from a table_that_does_not_exist.*/
SELECT * FROM
ErrFromTrigger_bi_account_each_New_Member_Must_Be_Older_then_The_Last
END; END IF;
END$$
DELIMITER ;
请参阅:
有关触发器的详细信息。
和:
有关存储过程和函数的详细信息
至于最佳实践,我的清单是:
不要信任客户输入:当从php向MySQL中插入值时,始终使用MySQL\u real\u escape\u string();这将保护您免受SQL注入攻击李>
在显示客户输入的数据之前去除HTML标记不允许所有HTML。使用htmlspecialchars()将HTML字符转换为HTML实体。因此,标记标记标记开始/结束的字符(如<和>)将变成<和>。仅仅使用strip_tags()来只允许一些标记是不够的,因为函数不会去除像onclick或onload这样的有害属性李>
规范化数据库
使用外键检查
使用事务,但尽可能频繁地提交(或回滚)。只在一次交易中把属于自己的东西放在一起李>
使用触发器
使用存储过程来操作和测试依赖于数据库布局的内容
这就是我现在能想到的,这个清单绝对不完整,而且这些东西有些私人性质。这对我来说很有效,YMMV。@ypercube:是的,无论如何这是一个最佳实践。)