thinkphp 我用其提供的add和save方法做插入和更新操作时,居然有默认值,int型的默认0,结果sql执行出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp 我用其提供的add和save方法做插入和更新操作时,居然有默认值,int型的默认0,结果sql执行出错相关的知识,希望对你有一定的参考价值。

我的数据前台没有填,这个字段是外键字段,结果0就挂了。谁能帮忙解答一下,有人碰到过吗?或者如何不让它有默认值

参考技术A 应该是没有默认值的,看看是不是数据库中相应字段属性误操作为有默认值了。追问

没有。数据库外键,我怎么可能会设置默认值。我从前台接收过来的也是null,到后台add后就有0了。我的有默认值的,比如30,90的默认值。但是tp也是给我插入的0,我的新增数据中,除了我填的几个,剩下的int型的都变成0了。
我怀疑是不是有什么配置的问题,tp的自动功能

追答

“我的数据前台没有填”是什么意思?那个外键字段的属性非空么?你没有数据,而属性要求非空的话,要么报错(oracle数据库),要么可能就给默认值了。

追问

我的意思就是说,我的前台的form是空的。什么都不填。那个外键字段是可以为空的,null,我也没有设置默认值。
还有一点很奇怪。我的其它的六个字段,用户Id,name,addTime和更新的对应的三个字段。也是可以为空的,没有设置默认值。但是tp给我id设为0,name可能是null。addTime倒是没有。很奇怪。

参考技术B

那你打印下执行的sql,也就是在执行add或save语句后写上

echo M()->getlastsql();

在页面上打印下,在复制sql到工具中运行,看报什么错,断点调试嘛

追问

我在Logs日志文件中看了。里面运行的sql就是一大堆的只要是int类型的通通是0。我有的字段是有默认值的。但是运行的sql也是0.通通是0

追答

有默认值,要么数据库字段有默认值,要么传递的时候要传的是int型的,你传的是字符串型的转成了0,其他的我就不知道了。

追问

那你碰到过吗?默认设置0的情况

追答

thinkphp框架我用了两年了,虽不敢说精通,但源码是过了遍的,做了四五个项目,楼主的情况,建议贴出代码或是自己断点查询下。

追问

这是后台的接收的代码。我echo也好,print也好。都是null。这里的数据都还不是0

这里的最后一行,就是我页面提交后的插入的数据。上面的几行是我自己添加的。

这就是tp的logs文件里的今天的日志文件的执行的sql。全都是0.我真无语了。

我默认也是有值的,30,90.画对勾的,是指不能为空。不能为空的我都是搞了默认值的。


追答

看了下,也就是action内没有接收到值,你也可以在接收之前,打印下

print_r($_REQUEST);

看看传过来么,而且,我看了下,那些name的值你都用变量写好了,那么你再打印下那些变量,如$award

追问

不是没接收到值。而是我如果是什么都不写。那么就会出现这问题。
如果我填了,就没事。不填就给我默认设为0了

比如additionalPic。用户是可以不填的。
但是不能用户不填,我后台就填入0啊

追答

那你在后台做三木元算,如果没填,你就写合法的默认值,也可以在前台加逻辑,如果用户没填,你也在提交前给些合法的默认值。

追问

那我的默认值咋办。默认值也给我整成0了。要不你加我企鹅吧。帮我看看

参考技术C add save都是自动的吧
取得都是$_GET 或$_POST的数据

你可以接受的时候,自己给那个字段一个值 ,比如null,1什么的,看你需求而定追问

这倒是也行。但是我不明白为嘛给我来个默认值0.而且我的有默认值的字段也是变为了0,看楼上追问。
而且null这样可以?

追答

看你的意思 其实外键系统没有取到值
你dump($_POST['tid']) 假如tid为外键
如果这里面出来30,你插入之后变成0 再来继续讨论
如果这里面本来就是0 那么你save之后肯定还是0了

追问

用dump这个方法出来的是一些html

追答

dump是打印post数组里面的内容

追问

这不是数组。就一个数字
我echo了。或者print-r接收的数据数组。都是null。

参考技术D 先获取这个外键值,然后再保存 第5个回答  2014-01-23 断点调试 一下 看看sql 错误 输出的问题 自己修改数据库默认值试试追问

你molaifeng的回答,和我的追问吧

ThinkPHP的增删改查!

对表的操作
增加:M(‘表名‘)->add($data);  (可以是数组)
删除:M(‘表名‘)->delete($data); (不可以是数组,删除多个有另外的方法)
修改:M(‘表名‘)->save($data);
查询:M(‘表名‘)->select();
 
增加:add
1、通过关联数组的方式添加:
public function addFun(){
    $data = array(
        ‘goods_name‘=>‘小米‘,
        ‘goods_price‘=>‘3210‘
    );
    $result = M(‘goods‘)->add($data);
}
这里的 $result 返回结果:
如果主键是自动增加,则返回自动增加的编号;
否则就返回受影响的行数(有多少行发生改变 0 或者 1);
如果SQL语句有错误,则返回 false ;
 
2、通过AR(active record)方式添加:
public function addFun(){
    $goods = M(‘goods‘);
    $goods->goods_name = ‘山寨机‘;
    $goods->goods_price = 998;
    $result = $goods->add();
}

 

删除:delete

删除单条数据:

public function deleteFun(){
    //result 返回受影响的行数
    $result = M(‘goods‘)->delect(138);
}

删除多条数据:

public function deleteFun(){
    $result = M(‘goods‘)->delect(‘137,138,140‘);
}

通过where来删除:

$result = M(‘goods‘)->where("goods_price >= 900")->delect();

 

修改:save

只有知道了主键才能够进行修改,所以修改比增加多了主键。
1,通过关联数组的方法修改:
public function saveFun(){
$data = array(
    ‘goods_name‘=>‘小米‘,
    ‘goods_price‘=>‘3210‘,
    ‘goods_id‘=>‘130‘
);
$result = M(‘goods‘)->save($data);

2,通过AR (active record )方式修改:

public function saveFun(){
    $goods = M(‘goods‘);
    $goods->goods_name = ‘山寨机‘;
    $goods->goods_price = 998;
    $goods->goods_id=130;
    $result = $goods->save();
}

 

查询:select

简单查询
public function showList(){
    $list = M(‘Goods‘)->select();
    $this->assign(‘list‘,$list);
    $this->display();
}
<volist name="list" id="vo">
{$vo.id}:{$vo.name}
</volist>

条件查询

1、获取一条记录:

$list = M(‘Goods‘)->find();

2、查询主键为 2 的记录:

$list = M(‘Goods‘)->select(2);

3、查询编号为 2、3、4、5 的记录:

$list = M(‘Goods‘)->select(‘2,3,4,5,6‘);

4、where条件查询:

$list = M(‘Goods‘)->where("goods_name like ‘%诺基亚%‘")->select();
$list = M(‘Goods‘)->where("goods_name like ‘%诺基亚%‘ and goods_price >= 3000")->select();

5、limit条件查询:

$list = M(‘Goods‘)->limit(‘5‘)->select();
这里的查询的前5条,正常的写法是limit(0,5),但如果是从零开始可以这样写 limit(5);
查询两条,但是从2开始 可以这样写 limit(2,5);

6、order排序:

$list = M(‘Goods‘)->limit(‘5‘)->order(‘goods_price desc‘)->where("goods_price >=50")->select();

7、指定字段进行查询:

$list = M(‘Goods‘)->field(‘goods_name,goods_price‘)->select();

 

增删改查终极方法:直接写SQL语句:
查询数据库使用 query() 方法:
public function sqlFun(){
    //查询
    // 空模型  是sw_goods不是goods,要全名
    $list = M()->query("select * from sw_goods");
}

增/删/改 使用execute()方法: 

public function sqlFun(){
    //增 删 改
    $list = M()->query("delete * from sw_goods where goods_id=‘135‘");
}

这里的 result 返回的是受影响的行数;

   

以上是关于thinkphp 我用其提供的add和save方法做插入和更新操作时,居然有默认值,int型的默认0,结果sql执行出错的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp add()和save()执行完毕,有返回值,但是数据库并未有修改

thinkphp save或add写入不全

总结ThinkPHP使用技巧经验分享

thinkphp的save方法

ThinkPHP的增删改查!

我用的是thinkphp3.2版本,为啥我怎么编写数据库都更新不了数据