Create操作成功的问题【由SOSO提出】

#1 jeffrey_shou

首先感谢Jake兄的辛勤劳动以及各位为SpeedPhp完善的各位朋友们。
继Rc123中的bug修复之后,先发现rc124中的一个bug:
Bug描述:在当Create($row)操作后,一般情况下,我们会用其返回值作为添加操作成功否的依据,匪夷所思的是:仍是有字段为空时,Create()返回值为false。因而不好判断Create成功后,经初步对代码的分析,应由红色字体部分所引起。Jake对于Create操作成功是否的判断能否再调整下,谢谢!
public function create($row)
{
  if(!is_array($row))return FALSE;
  $row = $this->__prepera_format($row);
  if(empty($row))return FALSE;
  foreach($row as $key => $value){
   $cols[] = $key;
   $vals[] = $this->__val_escape($value, TRUE);
  }
  $col = join(',', $cols);
  $val = join(',', $vals);
  $sql = "INSERT INTO {$this->tbl_name} ({$col}) VALUES ({$val})";
  if( FALSE != $this->_db->exec($sql) ){ // 获取当前新增的ID
   if( $newinserid = $this->_db->newinsertid() ){
    return $newinserid;
   }else{
    return array_pop( $this->find($row, "{$this->pk} DESC",$this->pk) );
   }
  }
  return FALSE;
}

/**

2010-07-04 20:49:54

#2 jeffrey_shou

在返回FALSE的情况下,记录却是已添加的。

2010-07-05 09:16:14

#3 jeffrey_shou

具体情况:当数据表主键非自动编号的情况下,有字段内容为NULL,若进行create操作后返回为FALSE,但数据记录已是添加。很诡异。

2010-07-05 09:29:53

#4 jeffrey_shou

更具体地表现于:INSERT INTO t_ezsoso_part (partid,partname,fpartid,partimage,ordernum,partdescription) VALUES ('sfsf2sf','sfsf','xxdt',NULL,'0',NULL)

partid非自增量的主键。望Jake分析下。谢谢!

2010-07-05 09:41:28

#5 jake

一个问题是否BUG,请先让我来进行判断,你看出有问题可以意见反馈一下即可。(已修改你帖子标题,谢谢!)

create的返回值规则是返回新增自增量主键值,这是PHP的insertid函数获取的,而create也同时增加了无法获取的时候会用find来进行再一次的查找来获取。但是获取不到那也没有办法,这是PHP函数库本身的制约。

无论是create、update这些操作,返回false并不代表成功或失败,而是语句或者过程中有无其他错误,所以一般在开发中,开发者都会对“影响行数”来进行判断,而非返回值。

2010-07-05 10:02:46

#6 jeffrey_shou

不好意思jake,我想问题是出在“return array_pop( $this->find($row, "{$this->pk} DESC",$this->pk) );”“

2010-07-05 10:07:33

#7 jake

如果要判断是否create已经生效,可以使用“影响行数”来进行判断。

新增记录的主键获取,一般也是通过函数或者查找最后一条的方式来进行,如果你有更好的方法,可以研究研究。

2010-07-05 10:13:09

#8 jeffrey_shou

奇怪的是用3.0.21版本,居然正常。

2010-07-05 10:24:38

#9 jeffrey_shou

经3.0.21的dumpsql后发现,对于Null处理方式是将字段内容改为''(空字符串)

2010-07-05 10:29:49

#10 jeffrey_shou

我将mysql.php(driver部分)改为了,貌似牺牲了严谨性而获得了兼容性。
        public function __val_escape($value, $quotes = FALSE) {
                if(is_null($value))return "''";
                if(is_bool($value))return $value ? 1 : 0;
                if(is_int($value))return (int)$value;
                if(is_float($value))return (float)$value;
                if(@get_magic_quotes_gpc())$value = stripslashes($value);
                $value = mysql_real_escape_string($value, $this->conn);
                if($quotes)$value = "'{$value}'";
                return $value;
        }

2010-07-05 10:37:56

#11 jake

如果这里说的是插入null的问题,SVN已经更新了,可以去看看。

不过这种问题发生的几率很少,因为create在一般来说,存在的字段就要有值,null的话可以直接不输入该字段。

2010-07-05 12:36:49

#12 jeffrey_shou

非常感谢,我去看看。

2010-07-05 14:44:30

#13 jeffrey_shou

我试了,可能还是有之前的问题,暂时我调整下,字段没字符就用''代替,null比较诡异。

2010-07-05 14:47:26

#14 jake

新的代码是使用if(is_null($value))return 'NULL';来替换,
http://code.google.com/p/speedphp/source/browse/trunk/Drivers/mysql.php

经过测试是没有问题的,数据表字段可以被正确地识别成null类型

QQ截图未命名.jpg

2010-07-05 15:07:30

#15 hkbaby

我做的时候就直接把
//if(is_bool($value))return $value ? 1 : 0;
影藏掉好像就行了

2010-07-05 15:36:54

#16 jake

我做的时候就直接把影藏掉好像就行了
hkbaby 发表于 2010-7-5 15:36
上面说是的null的问题,不是bool的问题。和那个无关的。

2010-07-05 15:40:01

#17 hkbaby

哦,误会误会!{:2_25:}

2010-07-05 15:45:51