【问题标题】:PHP/MySQL: how to prevent insertion of a row with all columns = NULL?PHP/MySQL:如何防止插入所有列 = NULL 的行?
【发布时间】:2011-05-30 14:31:13
【问题描述】:

我正在尝试在 PHP 表单中使用 this trigger。我已经尝试了以下方法,但是当我提交表单时,我的表中仍然插入了空行。

$trigger="DELIMITER $$
CREATE TRIGGER check_not_all_null BEFORE INSERT ON agent FOR EACH ROW
BEGIN
   IF COALESCE(first_name, last_name, affiliation) IS NOT NULL THEN
       CALL fail('All fields cannot be null');
   END IF;
END $$
DELIMITER ; ";
$execute = mysql_query($trigger);

$query4 = "INSERT INTO agent 
             (first_name, last_name, affiliation) 
           VALUES 
             ('$first_name', '$last_name', '$affiliation')";
$result4 = mysql_query($query4, $connection) or die('Error querying database.');

【问题讨论】:

  • 插入的字段真的为空吗?您也可能发送零长度字符串(可能会更改为 null)。
  • 我不认为mysql触发器是一个很好的输入验证方法。我认为最好在 javascript 和 php 中执行此操作。
  • @lex Javascript 不是解决这个问题的方法。
  • 为什么不在字段上加上一个约束,指定一个 NOT NULL 子句?

标签: php mysql sql triggers


【解决方案1】:

首先,我认为你的意思是

IF COALESCE(first_name, last_name, affiliation) IS NULL

因为NOT NULL 意味着其中一个值(至少)不为空。

第二,@tofutim 是正确的;空字符串与NULL 值不同。

【讨论】:

    【解决方案2】:

    如果我理解你的逻辑不应该这行:

    IF COALESCE(first_name, last_name, affiliation) IS NOT NULL THEN
    

    成为

    IF COALESCE(first_name, last_name, affiliation) IS NULL THEN
    

    否则,只有当值不为空时才会失败。

    【讨论】:

      【解决方案3】:

      触发器需要指定new. 虚拟表,否则它将永远无法工作。
      您可能需要考虑将触发器更改为。

      CREATE TRIGGER check_not_all_null BEFORE INSERT ON agent FOR EACH ROW
      BEGIN
         SET new.first_name = NULLIF(new.first_name, '');
         SET new.last_name = NULLIF(new.last_name, '');
         SET new.affiliation = NULLIF(new.affiliation , '');
         IF COALESCE(new.first_name, new.last_name, new.affiliation) IS NULL THEN
             CALL fail('All fields cannot be empty');
         END IF;
      END $$
      

      这将强制空字符串进入null's。

      见:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_nullif
      还有:http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html

      【讨论】:

        【解决方案4】:

        假设您的触发器(根据已提供的出色答案进行了修改)可确保集合 {first_name, last_name, affiliation} 的至少一个属性不为空。假设您还有一个 ID 号代理键,该表可能允许这样的数据。 (我不知道你所说的从属关系是什么意思,所以我只使用一个 char(1) 来表示。)

        ID  first_name  last_name  affiliation
        --
        1   NULL        NULL       A
        2   NULL        NULL       A
        3   NULL        Nethery    B
        4   Clare       NULL       C
        5   Christian   Guilbert   A
        6   Christian   Guilbert   A
        7   Christian   Armistead  A
        8   Hugh        Marchal    B
        9   Sharron     Sevier     A
        10  Christian   Guilbert   NULL
        

        假设您的名字是“Christian Guilbert”。这些行中只有一个(其中一个代理 ID 号)是您的。是哪一个?

        想想这是否真的是你想要做的。我对数据库约束的第一条经验法则:dbms 允许的一切最终都会进入您的数据库。 (我曾经看到一个财富 500 强的 IT 部门发布了一个应用程序,该应用程序允许用户输入运输集装箱的负尺寸。您可以通过这种方式将很多箱子装入火车车厢。在纸上。)

        恕我直言,这三列中的每一列都应声明为 NOT NULL。我也会为所有这么说的人投票。

        (姓名由The Random Name Generator提供。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          • 1970-01-01
          • 2019-03-21
          • 2013-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多