PHP中含'%$session%'的DELETE语句无效,phpMyAdmin中正常求解
问题分析与解决方案
你的核心问题出在直接将$session变量拼接进SQL语句的写法上——这种方式很容易因为特殊字符、空白或者转义问题导致匹配失败,还存在严重的SQL注入风险。
为什么原写法失效?
- 特殊字符未转义:如果
$session里包含单引号、反斜杠这类SQL特殊字符,会直接破坏语句结构,让匹配逻辑完全失效; - 潜在空白字符:如果
$session变量前后有看不见的空白(比如换行、空格),%$session%的匹配规则就会和数据库里的实际值不匹配; - 这种裸写SQL的方式,在生产环境中会被注入攻击,绝对不能用。
可靠修复方案:使用预处理语句
预处理语句会自动处理字符串转义,完美规避上述问题,同时从根源上防止SQL注入。下面给出两种常用PHP数据库扩展的实现:
1. MySQLi 写法
// 假设$conn是你的MySQLi连接对象 $stmt = $conn->prepare("DELETE FROM usertour WHERE tourID = ? AND name LIKE CONCAT('%', ?, '%')"); // 绑定参数:"is"表示第一个参数是整数(i),第二个是字符串(s) $stmt->bind_param("is", $idnum, $session); $stmt->execute(); // 查看受影响行数,确认删除结果 echo "成功删除 " . $stmt->affected_rows . " 行"; $stmt->close();
2. PDO 写法
// 假设$pdo是你的PDO连接对象 $stmt = $pdo->prepare("DELETE FROM usertour WHERE tourID = :idnum AND name LIKE CONCAT('%', :session, '%')"); $stmt->bindParam(':idnum', $idnum, PDO::PARAM_INT); $stmt->bindParam(':session', $session, PDO::PARAM_STR); $stmt->execute(); // 查看受影响行数 echo "成功删除 " . $stmt->rowCount() . " 行";
临时调试排查方法
如果你想先定位原写法的具体问题,可以在执行原语句后输出MySQL的错误信息:
$query = "Delete from usertour where tourID = $idnum and name LIKE '%$session%' "; $result = mysqli_query($conn, $query); if (!$result) { echo "SQL错误详情: " . mysqli_error($conn); }
这会帮你快速找到语句失效的原因,比如是否有未转义的单引号导致语句中断。
另外,建议先清理$session变量的空白字符,避免因空格导致匹配失败:
$session = trim($session);
内容的提问来源于stack exchange,提问作者Abu Machi
相关产品推荐
相关产品推荐

