预处理语句绑定SQL函数不生效的原因及使用必要性咨询
问题产生原因
预处理语句的占位符?只能用来绑定数据值,不能绑定SQL函数、关键字、表达式片段。
你将now()、now() + Interval 2 day这类SQL表达式以字符串类型绑定到占位符时,MySQL会将它们识别为普通的字符串常量,而非可执行的SQL逻辑,相当于实际执行的查询条件变成了:
WHERE creation_date_time >= 'now()' AND creation_date_time <= 'now() + Interval 2 day' AND creation_date_time > 'now() + Interval 1 day'
datetime类型的字段和字符串比较自然匹配不到任何结果,所以查询无返回。而直接写非预处理SQL时,这些表达式会被MySQL正常解析执行,所以可以返回正确结果。
此场景是否需要使用预处理语句
分两种情况判断:
- 如果查询的时间区间是固定的、完全由后端代码控制、没有任何用户输入参与构造,那不需要用参数绑定,直接把时间表达式写进预处理的SQL模板里即可,参考写法:
if($stmt = $conn->prepare("SELECT * FROM xx WHERE creation_date_time >= now() AND creation_date_time <= now() + Interval 2 day AND creation_date_time > now() + Interval 1 day")) { $stmt->execute(); $result = $stmt->get_result(); print_r($result); }
- 如果时间区间的数值(比如间隔天数、起始时间)是由用户端传入的,那必须使用预处理语句做参数绑定,避免SQL注入风险。这种情况下不要直接把
now() + Interval N day整个当参数绑定,应该先在PHP侧计算出具体的datetime值,再绑定数值即可,参考写法:
$now = date('Y-m-d H:i:s'); $interval2 = date('Y-m-d H:i:s', strtotime('+2 day')); $interval1 = date('Y-m-d H:i:s', strtotime('+1 day')); if($stmt = $conn->prepare("SELECT * FROM xx WHERE creation_date_time >= ? AND creation_date_time <= ? AND creation_date_time > ?")) { $stmt->bind_param("sss", $now, $interval2, $interval1); $stmt->execute(); $result = $stmt->get_result(); print_r($result); }
内容的提问来源于stack exchange,提问作者user16357892
相关产品推荐
相关产品推荐

