如何在PHP的MySQL条件插入语句中传递日期变量?
给SQL插入语句添加日期变量的实现方法
嘿,这事儿其实很容易搞定,咱们直接修改你的INSERT语句结构就行,同时还要提醒你注意代码的安全问题哦~
直接修改原代码的方案
你只需要在INSERT的字段列表里加上date,然后在SELECT对应的位置传入$date变量就可以了,注意日期是字符串类型,要给变量套上单引号:
$date = date("Y-m-d"); $query = " INSERT INTO article_likes (user, article, date) SELECT {$_SESSION['user_id']}, {$id}, '{$date}' FROM users WHERE EXISTS( SELECT uid FROM users WHERE uid = {$id}) AND NOT EXISTS( SELECT id FROM article_likes WHERE user = {$_SESSION['user_id']} AND article = {$id}) LIMIT 1 ";
简单解释下改动点:
- 在
article_likes后的括号里新增date字段,对应表中的date列; - 在SELECT的返回值里新增
'{$date}',用单引号包裹确保日期字符串能被SQL正确识别。
重要提醒:避免SQL注入风险
你现在的代码是直接把变量拼进SQL语句里,这存在严重的SQL注入漏洞,攻击者可以通过构造恶意参数篡改你的SQL逻辑,甚至窃取/破坏数据库数据。生产环境一定要用预处理语句来处理,下面给你两个常用的实现示例:
PDO预处理方案
$date = date("Y-m-d"); $userId = $_SESSION['user_id']; // 用占位符?代替直接拼接变量 $query = " INSERT INTO article_likes (user, article, date) SELECT ?, ?, ? FROM users WHERE EXISTS( SELECT uid FROM users WHERE uid = ?) AND NOT EXISTS( SELECT id FROM article_likes WHERE user = ? AND article = ?) LIMIT 1 "; $stmt = $pdo->prepare($query); // 按顺序传入参数,自动处理类型转义和引号 $stmt->execute([$userId, $id, $date, $id, $userId, $id]);
MySQLi预处理方案
$date = date("Y-m-d"); $userId = $_SESSION['user_id']; $query = " INSERT INTO article_likes (user, article, date) SELECT ?, ?, ? FROM users WHERE EXISTS( SELECT uid FROM users WHERE uid = ?) AND NOT EXISTS( SELECT id FROM article_likes WHERE user = ? AND article = ?) LIMIT 1 "; $stmt = $mysqli->prepare($query); // 绑定参数,"ssssss"表示6个字符串类型的参数,顺序要和占位符对应 $stmt->bind_param("ssssss", $userId, $id, $date, $id, $userId, $id); $stmt->execute();
预处理语句会把SQL的结构和数据完全分开,从根源上杜绝注入风险,这是开发中必须遵守的安全规范哦~
内容的提问来源于stack exchange,提问作者Rajput Princy
相关产品推荐
相关产品推荐

