zoukankan      html  css  js  c++  java
  • thinkphp碰到的一些小问题

    1. 生成的html自动被去掉换行和空格,压缩挤到一起了。

    解决: 开启debug即可,在入口文件增加

     define("APP_DEBUG",true);

     2. 添加mysql的 datetime类型数据,以当前时间为例

    class IndexAction extends Action{
        public function insert(){
            $data   =   D('Operate');
            if($data->create()) {
                $data->optime = date("Y-m-d H:i:s" ,time()); //注意必须先create再add,否则无效
                $result =   $data->add();
                if($result) {
                    $this->success('操作成功!');
                }else{
                    $this->error('写入错误!');
                }
            }else{
                $this->error($data->getError());
            }
        }
    }

     3. thinkphp中进行字段加减操作更新的方法

    M('User')->where('id=5')->setInc('score+2'); //字段加操作
    M('User')->where('id=5')->setInc('score',5); //字段减操作

    若同时更新两个或以上的字段,需要这样写,用think的表达式写法

    $Role = M('Role');
    $Role ->heartvalue = array('exp',"heartvalue - $opvalue"); //注意,这里exp后面的表达式必须为双引号,否则变量不起作用,而且变量必须为数字类型才有效
    $Role ->secretto = array('exp',"secretto+1");
    $Role->where('uid='.$opfrom) ->save();

     4. thinkphp中查询语句书写时,字段若为字符串,必须加引号,若为数字可加可不加,不确定的时候一定记得加。

    错误写法:

    //pass为字符串,这样对比返回结果是false
    $list = $Proxy->where('imid='.$user.' AND pass='.md5($pass.'mixedhash'))->find();
    
    //错误写法二,变量为字符串还不行,必须是与字段对比的变量的运算结果为字符串
    $list = $Proxy->where('imid='.$user.' AND pass='.md5("$pass".'mixedhash'))->find();

    正确写法:

    $list = $Proxy->where('imid='.$user.' AND pass="'.md5($pass.'mixedhash').'"')->find();
    
    //正确写法二,比较保险也比较清晰的写法,这样可以避免忘记加引号
    $condition['imid'] = $user;
    $condition['pass'] = md5($pass.'qd');
    $list = $Proxy->where($condition)->find(); 

     5. thinkphp中create()自动填充返回false的一些原因分析

    一般出现这种情况是由于传过来的字段为空值导致,首先检查一下提交的表单method是否与获取方式对应,例如form中忘记加method或者form中的method为POST而获取的时候用的是$this->$_get("variable"); 这样也会导致获取的变量为空从而create失败。

    6. 设置当前菜单的样式,可以使用thinkphp的系统变量 $Think.ACTION_NAME (代表当前动作的名称对应到页面的function 的name),使用的时候注意把变量放在后面。 形如:

    <a href="__URL__/ccenter" <if condition="'ccenter' eq $Think.ACTION_NAME">class=current</if>>控制中心</a>

    下面的写法不被支持,将报错

    <a href="__URL__/ccenter" <if condition="$Think.ACTION_NAME eq 'ccenter'">class=current</if>>控制中心</a>

    (猜测可能是类型转换导致的,比较运算一般都是先转换类型后比较)

    7. thinkphp save()失败的一些原因分析

    首先根据5但中描述的逐一排除:

    ① 检查 form中是否忘记加method以及 获取变量的时候是否与method对应(method为post,但是获取的时候使用 I("get.xxx")就会导致获取失败为空);

    ② 检查form表单中的input等输入字段的name值是否对应,或者是否漏写、错写name的值;

    ③ 如果是使用create()获取表单数据,然后无限制条件进行的save(),形如

    $Station = D("Station");
    $Station->create();
    $result = $Station->save();

    这样的代码,那就需要检查数据库中是否设置了主键,如果没设置主键的话 是不会生效的哦。

    ④ 今天(2016.4.5)又犯了一个错误,反复save就是不对,最后发现表名写错了。。。尼玛!!!

    8. addAll() 失败的部分原因分析。

    通常使用

    if($lastId = $Table->addAll($data)){
    //something to do
    }

    的形式来判断是否插入成功。 那有时候会插入失败,这个时候就要仔细分析数据结构了。 其中一种情况比较特殊的,就是插入的时候偶尔会出现问题(也就是说问题并非总是出现),提示错误如下:

    Column count doesn't match value count at row x

    这个错误的出现很明显是参数个数与值的个数不一致导致的,但是通常我们都是使用 $data['key'] = $value; 的方式来给data赋值的,又怎么会出现键值对不匹配呢。 经过逐项排查发现,其实是因为 赋值过程中,出现了一个空值,也就是 $data['keyx'] = $value; 这个$value的值为不可识别的值的时候,那值会被自动舍弃,而键却还在,这样就导致了上面的mysql错误。

    解决方法就是对于不能100%确定$value是否为空的情况下,对$value做一个判断,若为空,给与赋值

  • 相关阅读:
    OncePerRequestFilter原理简介
    springboot开启定时任务
    springboot2.x设置跨域的方式
    axios的各种post提交方式总结
    使用FeignClient启动时出错的问题The bean 'xxx.FeignClientSpecification', defined in null
    Spring Boot 工程热部署
    Quartz中表及其表字段的意义
    Java基础
    maven环境隔离
    扫码登录技术原理
  • 原文地址:https://www.cnblogs.com/aleafo/p/3582279.html
Copyright © 2011-2022 走看看