Create操作成功的问题【由SOSO提出】
发布于:2022-01-17 09:50:54
#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类型
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