You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:25:23