Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 策略查询执行_Php_Mysql - Fatal编程技术网

Php 策略查询执行

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

在users表中插入新记录时,首先检查电子邮件和昵称尚未添加。另一个同时使用相同数据注册的用户是否有可能得到错误的结果?澄清:

连接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 ;
空集(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:是的,无论如何这是一个最佳实践。)