新增保存返回值问题

#1 Genius

问题说明:norabn不选,保存,数据库有记录,但是return $this->create($rows);无返回值。



var $pk = "regcod";
var $table = "bloinf";


function insertBloinf($data, $user)
{
  $rows = array('regcod' => $data['s_regcod'],
       'insdat' => $data['insdat'],
       'norabn' => $data['norabn'],
       'WBC' => $data['WBC'],
       'HB' => $data['HB'],
       'Hct' => $data['Hct'],
       'Plt' => $data['Plt'],
       'remark' => $data['remark'],
       'creman' => $user['usrcod'],
       'cretim' => date('Y-m-d H:i:s'));
  return $this->create($rows);
}

<%html_radios name="norabn" options=$data.norabns checked=$data.bloinf.norabn separator=" "%>

2014-04-04 11:30:56

#2 jake

dump一下返回的结果看看

2014-04-04 11:37:46

#3 Genius

dump为空,但是把radio,换成文本框,不填写,则有返回值。返回值为ID。

2014-04-04 11:40:50

#4 jake

create是如果存在自增ID就会返回,如果没有自增ID就没有返回了。

2014-04-04 12:06:55

#5 Genius

把radio,改成text,同样不填写,保存返回26


                  
                  

2014-04-04 12:15:12

#6 Genius

如果没有返回值,我没办法判断数据库操作成功了。

2014-04-04 12:16:36

#7 Genius


                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->escape($value);
                }
                $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{dump($this->find($row, "{$this->pk} DESC",$this->pk));
                                return array_pop( $this->find($row, "{$this->pk} DESC",$this->pk) );
                        }
                }
                return FALSE;


Array
(
    [regcod] => 28
)


28

2014-04-04 12:23:54

#8 Genius

不是自动增长,会返回这句。
$this->find($row, "{$this->pk} DESC",$this->pk)

dump($row)

Array
(
    [regcod] => 26
    [insdat] => 2014-04-04
    [norabn] =>
    [WBC] =>
    [HB] =>
    [Hct] =>
    [Plt] =>
    [remark] =>
    [creman] => 1
    [cretim] => 2014-04-04 12:26:31
)

而保存的时候
INSERT INTO gdwk_bloinf (regcod,insdat,norabn,WBC,HB,Hct,Plt,remark,creman,cretim) VALUES ('26','2014-04-04',NULL,'','','','','','1','2014-04-04 12:28:42')


在数库里比较的时候,就会出现''=null,不成立,所以没返回值

2014-04-04 12:28:35

#9 Genius

保存在数据库里的数据导出SQL文
INSERT INTO `gdwk_bloinf` (`regcod`, `insdat`, `norabn`, `WBC`, `HB`, `Hct`, `Plt`, `remark`, `creman`, `cretim`, `updman`, `updtim`) VALUES
(26, '2014-04-04', NULL, '', '', '', '', '', 1, '2014-04-04 13:03:56', NULL, NULL);


2014-04-04 13:07:21

#10 Genius

保存返回执行return array_pop( $this->find($row, "{$this->pk} DESC",$this->pk) );
执行的SQL文
SELECT regcod FROM gdwk_bloinf WHERE regcod = '26' AND insdat = '2014-04-04' AND norabn = NULL AND WBC = '' AND HB = '' AND Hct = '' AND Plt = '' AND remark = '' AND creman = '1' AND cretim = '2014-04-04 13:03:56' ORDER BY regcod DESC LIMIT 1

2014-04-04 13:10:14

#11 Genius

数据库中  null  表示 不可知,不确定 所以 判断都用 字段  is null的方式进行判断 而  = null 、<> null 的判断结果,仍然是不可知,不确定,所以 不会返回任何结果。 或者简单说: = null、   <> null   的判断结果都是  false。

2014-04-04 13:13:58

#12 Genius

找到findAll($conditions = null, $sort = null, $fields = null, $limit = null)函数
把语句$condition = $this->escape($condition);
修改成
if ($condition=="NULL"){$join[] = "{$key} IS {$condition}";}else
$condition = $this->escape($condition);
就OK了。

2014-04-04 13:31:40

#13 Genius

上一条写错
找到findAll($conditions = null, $sort = null, $fields = null, $limit = null)函数
把语句$join[] = "{$key} = {$condition}";
修改成
if ($condition=="NULL"){$join[] = "{$key} IS {$condition}";}else
$join[] = "{$key} = {$condition}";
就OK了。

2014-04-04 13:40:32

#14 jake

Genius 发表于 2014-4-4 13:40
上一条写错
找到findAll($conditions = null, $sort = null, $fields = null, $limit = null)函数
把语句$j ...
分析得不错,不过 null 和 'null' 是两个不同的东西。所以在编程的时候,注意别把它们弄混就行。

2014-04-04 14:45:30

#15 Genius

$condition = $this->escape($condition);
处理后用is_null,试过没用处
老大是把speedphp框架修改一下?还是,我怕自己改了以后升级出问题

2014-04-04 15:00:46

#16 Genius

可能是这样改更合理一点,因为用户可能是会检索输入"NULL"
if (is_null($condition)){$join[] = "{$key} IS NULL";}else
{
$condition = $this->escape($condition);
$join[] = "{$key} = {$condition}";
}

2014-04-04 15:23:02

#17 jake

null作为条件的情况比较少见,我想问题在于
if(is_null($value))return 'NULL';

我看看怎么搞

2014-04-04 15:43:30

#18 jake

jake 发表于 2014-4-4 15:43
null作为条件的情况比较少见,我想问题在于
if(is_null($value))return 'NULL';
按你说的方式,修改了Model,把条件那种都变成了null的判断,代码在:

https://git.oschina.net/SpeedPHP/dev

非常感谢你的指出和研究。

PS:本帖将转移到bug意见区

2014-04-04 15:57:52

#19 mebtime

这个问题确实很实在,我也有用到

2014-04-11 17:44:40