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

点击链接时如何存储原始导演名到PHP Session并适配数据库查询

解决URL友好格式导演名无法直接查询数据库的问题

我完全懂你碰到的麻烦——把带特殊字符的导演名转成URL友好格式后,跳转过去拿到的处理后字符串没法直接用来查数据库,对吧?这里有几个实用的解决方案,你可以根据自己的场景来选:

方案1:点击时将原始导演名存入Session(符合你的需求)

既然你提到要在点击链接时把文本存入Session,那可以通过前端事件+AJAX的方式实现:

第一步:给链接添加原始导演名的Data属性

修改你生成链接的PHP代码,给每个<a>标签加上data-original-name属性,存原始的导演名:

foreach ($directors as &$d) {
    $sd = sanitize($d);
    // 新增data-original-name属性存储原始导演名
    $d = "<a href=\"/movies/director/$sd-movies\" id='mov' title='$d movies' itemprop='name' data-original-name='$d'>$d</a>";
}

第二步:用JavaScript监听点击事件,发送AJAX存Session

添加一段JS代码,拦截链接的默认跳转,先把原始导演名传到后台存入Session,再完成跳转:

// 监听所有导演链接的点击事件
document.querySelectorAll('#mov').forEach(link => {
    link.addEventListener('click', function(e) {
        e.preventDefault(); // 先阻止默认跳转
        const originalName = this.dataset.originalName;
        
        // 发送POST请求到后台脚本存Session
        fetch('/save-director-session.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: `director=${encodeURIComponent(originalName)}`
        }).then(() => {
            // 请求完成后跳转到目标页面
            window.location.href = this.href;
        }).catch(err => {
            // 即使AJAX失败,也正常跳转(后续可根据需求处理错误)
            window.location.href = this.href;
        });
    });
});

第三步:后台脚本存Session

创建save-director-session.php文件,负责把原始导演名存入Session:

<?php
session_start();
if (isset($_POST['director'])) {
    // 可以先做简单的过滤,避免恶意内容
    $_SESSION['selected_director'] = trim($_POST['director']);
}
?>

之后在跳转后的页面,直接用$_SESSION['selected_director']就能拿到原始导演名,用于数据库查询了。

⚠️ 注意:Session是用户级别的,如果用户同时打开多个标签页,后续的点击会覆盖之前的Session值,这点要考虑到。

方案2:传递加密后的原始导演名作为URL参数

如果不想用Session,也可以把原始导演名加密后作为URL参数传递,跳转后再解码:

修改链接生成代码

foreach ($directors as &$d) {
    $sd = sanitize($d);
    // 用base64编码原始导演名,再做URL编码避免解析问题
    $encodedOriginal = urlencode(base64_encode($d));
    $d = "<a href=\"/movies/director/$sd-movies?original=$encodedOriginal\" id='mov' title='$d movies' itemprop='name'>$d</a>";
}

跳转后页面解码

<?php
if (isset($_GET['original'])) {
    // 先URL解码,再base64解码得到原始导演名
    $originalDirector = base64_decode(urldecode($_GET['original']));
    // 现在可以用$originalDirector查询数据库了
}
?>

这个方案不需要依赖Session,适合多标签页场景,但要注意URL长度限制(不过导演名字通常不会太长,影响不大)。

方案3:用导演ID替代处理后的字符串(最稳妥)

如果你的数据库设计允许,建议单独建一个directors表,存储导演ID和原始名字,这样生成链接时直接用导演ID:

// 假设你从directors表拿到了导演的id和name
$d = "<a href=\"/movies/director/{$directorId}-movies\" id='mov' title='{$directorName} movies' itemprop='name'>{$directorName}</a>";

跳转后直接用$_GET['directorId']查询数据库,完全避免名字编码解码的问题,也不会有冲突,是最安全可靠的方案。

重要安全提醒

你的原始代码里直接把$_GET['id']拼到SQL语句里,存在严重的SQL注入风险!一定要改用预处理语句:

// 替换原来的查询代码
$stmt = $conn->prepare("SELECT * FROM movies WHERE id = ?");
$stmt->bind_param("i", $_GET['id']); // "i"表示参数是整数类型
$stmt->execute();
$result = $stmt->get_result();
while ($movie = $result->fetch_assoc()) {
    $mdirector = $movie['director'];
}
$stmt->close();

内容的提问来源于stack exchange,提问作者user7425848

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:42:26