Mysql空字段

时间:2015-02-19 08:48:39

标签: mysql

我有一个足球注册网站。有时一个空字段被注册(我认为其中一个用户按下注册按钮两次,因为成功和空注册总是同时发生)。这很少发生,不是每次都发生。

我的代码是:

$sql="INSERT INTO events (event_name, registrant_name, date_registration) VALUES ('$event_number', '$username', NOW())";

$event_numberNOW()每次都会注册。 $username有时是空的。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

首先,您应该添加一个UNIQUE索引。除非你这样做,否则你可以拥有双重用户名。

您的PHP代码应该检查strlen($username) > 0。或者,您可以在SQL触发器中执行此检查,但在您的情况下,可能没有理由这样做。

答案 1 :(得分:1)

您可以将NOT NULL约束添加到user_name字段:

ALTER TABLE events MODIFY username varchar(255) NOT NULL;

或者签入PHP代码,user_name是否为空?

if(!empty($username)) {
  $sql="INSERT INTO events (event_name, registrant_name, date_registration) VALUES ('$event_number', '$username', NOW())";
  //run query
} else {
 //handle error as you want
}

答案 2 :(得分:0)

我不同意建议将列声明为UNIQUENOT NULL的答案。嗯,我想,它没有受到伤害,但它们不是你看似设计糟糕的代码(你还没有发布)的答案。

在我看来,数据库解决方案是最后一道防线,如果有第一行定义则不需要 - 在将用户输入传递到数据库之前正确验证和清理用户输入。

使用PDO可以更轻松。

根据我上面的评论:

  • “其中一个用户按两次注册按钮” - 但是表单操作肯定会将您带到一个处理输入的新页面(并检查其有效性)?
  • 如果有人注册为先生Smith;DROP ALL TABLES怎么办? UNIQUENOT NULL都不会为您节省费用

答案 3 :(得分:0)

你可以避免这个伎俩的问题:

INSERT INTO events (event_name, registrant_name, date_registration)  
SELECT '$event_number', '$username', NOW()
FROM DUAL
WHERE length($username) > 0