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

.htaccess配置友好URL后无法获取$_GET变量的问题

解决友好URL后$_GET['id']未定义及相关问题

作为PHP新手,你遇到的问题主要来自.htaccess规则顺序、变量校验缺失、SQL注入风险,还有输出语法错误这几个方面,咱们一步步来修复:

1. 调整.htaccess重写规则顺序与标志

你的最后一条规则RewriteRule ^([^\.]+)$ $1.php [NC,L]会优先把proyecto/id/1这类无后缀URL重写成proyecto/id/1.php,导致前面的友好URL规则根本没机会触发。同时前面的规则缺少L标志(告诉Apache处理完这条规则就停止,不再匹配后续规则),建议加上QSA(保留原有查询字符串,提升扩展性)。

修改后的.htaccess代码:

<ifModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on

    # 处理友好URL,添加L和QSA标志,精确匹配开头结尾
    RewriteRule ^proyecto/id/(.*)/$ proyecto.php?id=$1 [L,QSA]
    RewriteRule ^proyecto/id/(.*)$ proyecto.php?id=$1 [L,QSA]

    # 无后缀转.php规则放在最后
    RewriteRule ^([^\.]+)$ $1.php [NC,L]

    ErrorDocument 404 /error404.php
</ifModule>

2. 修复$_GET['id']未定义问题

在使用$_GET['id']前必须先检查变量是否存在,还要验证它是合法的数字(因为你的ID是数据库数值类型),避免非法请求报错:

// 校验ID是否存在且为有效数字
if(isset($_GET['id']) && is_numeric($_GET['id'])){
    $valorid = $_GET['id'];
} else {
    // 非法请求跳转到404页面
    header("Location: /error404.php");
    exit;
}

3. 修复严重的SQL注入风险

你直接把变量拼接到SQL语句里的写法存在致命的SQL注入漏洞,任何人都能通过构造URL篡改你的数据库,必须改用PDO预处理语句:

$connection = new PDO('mysql:host='.$host.';dbname='.$db_name.';charset=utf8', $username, $password);
// 预处理SQL,用?作为占位符
$stmt = $connection->prepare('SELECT * FROM grafica WHERE id = ?');
// 绑定参数,指定参数类型为整数,进一步保障安全
$stmt->bindParam(1, $valorid, PDO::PARAM_INT);
$stmt->execute();
// 获取单条结果(因为按ID查询是唯一数据)
$row = $stmt->fetch(PDO::FETCH_ASSOC);

如果需要查询多条数据,再用fetchAll()配合循环即可。

4. 修复输出语法错误

你的输出代码<?php echo $row['nombre'] /&gt;存在语法错误,正确写法应该是:

<?php echo $row['nombre']; ?>

去掉多余的/,添加语句结束分号,使用正确的PHP闭合标签。

现在访问www.mywebsite.com/proyecto/id/1,应该就能正常获取ID并输出数据库中的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:33