thinkPHP替换SQL变量

时间:2022-12-23 12:29:04

使用tp里
M()->where(pb_id=%d and course=%d and DATE_FORMAT(pub_time, \"%H:%i:%s\") < "%s", array($pb_id, $coursse, $time))->select();

想要查询拆书包,结果是把所有的数据都查出来了,
调试断点时发现tp把 where的第二个数组参数交给相应连接mysql的escapeString方法了,
如mysql的连接方式就是mysql_escape_string
mysqli的当然就是mysqli_escape_string
然后用php的函数vsprintf()把第一个参数 和第二个参数按格式打印出来

这样写的问题就是发现第一个参数有6个%,但是给的参数只有3个,导致where是false

改进:
1、把where的字符改成 DATE_FORMAT(pub_time, \"%%H:%%i:%%s\")
2、另一种是直接用mysql的截取方法,不出现%

附:
参数 format 是转换的格式,以百分比符号 ("%") 开始到转换字符结束。下面的可能的 format 值:

%% - 返回百分比符号
%b - 二进制数
%c - 依照 ASCII 值的字符
%d - 带符号十进制数
%e - 可续计数法(比如 1.5e+3)
%u - 无符号十进制数
%f - 浮点数(local settings aware)
%F - 浮点数(not local settings aware)
%o - 八进制数
%s - 字符串
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
arg1, arg2, ++ 等参数将插入到主字符串中的百分号 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。