之前在写网站的时候碰到一个问题,向数据库中插入记录的时候,对于unique类型的字段如果插入已经存在的记录值会出现错误: "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry”,我想了一下之前做的工程,我的解决方案是先查询一下数据库,判断一下数据库中是否存在要插入的字段值,然后在执行Add方法将数据插入,这种方法虽然也可以,但是多了一次数据库的查询操作,不利于网站的优化;今天下午我再次遇到了这种问题,因为这次的数据库关系较为复杂,多一次数据判断就增加了服务器的压力,经过一番研究找到了一种较为方便的方法,这里就记录一下.

我用一个例子来说明一下:

首先创建一个数据表

create table yz_test( 
       id int auto_increment, 
       user varchar(32) unique, 
       PRIMARY KEY (id)   ) 
这个数据表中 user字段是不能重复的,我们首先插入一个记录:

public function Test(){ 
   $Model = M("test"); 
   $Data["user"]="user1"; 
   $Model->add($Data); 

第一次执行,没有问题                                   

再次执行,这个时候就会看到错误,原因就是user字段是unique的属性,如图所示我们的错误信息:

SQLSTATE[23000]:Integrity constarint violation

报了一个SQLSTATE[23000]的错误,注意错误代码是23000,我们可以根据这个错误代码做写文章,下面是我判断这种错误的方法:

public function Test(){ 
   $Model = M("test"); 
   $Data["user"]="user1"; 
   $Ret =-1;//操作的返回值 
   try{ 
     $Ret = $Model->add($Data);//注意:如果Add有异常,$Ret的值不会被修改 
   }catch(\Exception $e){ 
     if($e->getCode()==23000){ 
       echo "插入的数据Unique导致的错误"; 
       die(); 
     } 
   } 
   echo "创建成功"; 

我用try catch捕获异常,提取错误代码,根据错误代码就知道了错误的愿意,从而就能一次判断数据是否能够插入了.

当然也可以用tp官方文档的自动验证解决这个问题,只需要在自动验证里面增加一条规则就可以了。

比如:array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
更详细的内容,可以参考文档!

版权声明:若无特殊注明,本文皆为( yueshuo )原创,转载请保留文章出处。