thinkphp碰到的一些小问题

摘要:
');}} 否则{$this->错误;}}3.在thinkphp中,用于更新字段加法和减法运算的方法M-˃where-˃setInc//字段加法运算M-˃where-˃setInc//如果字段减法运算同时更新两个或多个字段,则需要使用表达式“think”以这种方式编写:$Role=M$Role-˃heartvalue=array;//请注意,exp后面的表达式必须是双引号,否则变量将无法工作,并且变量必须是数字类型才能有效$Role-˃secretto to=array$Role-˃where-˃save();4.在thinkphp中编写查询语句时,如果字段是字符串,则必须添加引号。如果它是一个数字,你可以不加它就加它。当你不确定时,你必须记得加上它。通常,如果{//somethingtodo}用于确定插入是否成功。

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做一个判断,若为空,给与赋值

免责声明:文章转载自《thinkphp碰到的一些小问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇System.AccessViolationException,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。MAC下编译FFMPEG下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何使用FlashgameMaster修改游戏

1 打开任意一款游戏,注意最好是AS2.0版的,我们以黄金矿工为例。 2 使用方法: 点击编辑按钮的打开编辑面板出现编辑面板后在对话框中输入要查找的数值,点击查找按钮,会列表出所以等于该值的变量。 如果输入数值为空则列表出当前所有变量。 如果变量太多不容易判定,可以当数值改变后输入当前数值查找以缩小范围。 如果不知道数值具体变化量,可以输入+(增加),-...

C++指针类型间强制转换

深入理解指针类型间的转换 C++中指针的强制转换 强制类型转换(int)、(int&)和(int*)的区别 内存中的地址   地址的本质就是一串0和1的机器代码,内存中的地址没有明确数据类型,但地址值有类型,以32位编译器为例,内存中的地址是一个32位的整数。无论什么类型的指针变量,在内存中本质上都是一样的,都是一个整数值的地址值,该地址值可以...

「快应用篇02」快应用开发时,优化总结篇

童鞋们好,国庆节已经结束。大家是否已经把学习与工作模式完全切回来了呢? 欢迎关注公众号:大前端早读 之前一篇文章我们了解了一下什么是快应用,现在我们带大家来看看快应用开发时,需要做到的一些优化方式。如果对快应用开发并不熟悉的童鞋,可以先去学一学快应用的一般开发方式。 快应用是一种新的应用形态,以往的手机端应用主要有两种方式:网页、原生应用;网页无需安装,...

c语言1博客作业09

一、本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/10033 我在这个课程的目标是 <学习c语言知识,学会做编程题,学会做小程序> 这个作业在那个具体方面帮助我实现目标 <学会使用co...

VBS数组函数学习实例分析

Array 函数 返回包含数组的Variant。 Array(arglist) 参数:arglist是赋给包含在Variant中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则将会创建零长度的数组。 说明:用于引用数组元素的表示符,由跟随有括号的变量名组成,括号中包含指示所需元素的索引号。 在下面的示例中,第一条语句创建名为 A 的...

Linux内核调试方法总结之栈帧

栈帧 栈帧和指针可以说是C语言的精髓。栈帧是一种特殊的数据结构,在C语言函数调用时,栈帧用来保存当前函数的父一级函数的栈底指针,当前函数的局部变量以及被调用函数返回后下一条汇编指令的地址。如下图所示:                         栈帧位于栈内存中,接下里我们用一个实例展示一下栈帧的入栈和退栈过程。  stackframe.c #incl...