PHP中URL显示ID与名称后页面无数据的问题求助
解决方案
我来帮你搞定这个问题,你遇到的核心问题是重写规则没跟上URL格式的变化,再加上原来的PHP查询逻辑也有问题,导致页面拿不到数据。下面分步骤解决:
1. 更新.htaccess的重写规则
原来的规则只能匹配/1这种单ID格式,现在要适配/1/Health-and-Beauty的结构。修改后的规则会提取URL里的ID(数字部分),后面的名称只是SEO友好的slug,不影响业务逻辑:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配 /数字/任意字符 的格式,把数字作为sub_id传递 RewriteRule ^(\d+)/.*$ category-classifieds.php?sub_id=$1 [L] # 保留原单ID格式的兼容性(比如用户直接访问/1也能正常打开) RewriteRule ^(\d+)$ category-classifieds.php?sub_id=$1 [L]
2. 修正PHP的查询与链接生成逻辑
原来的PHP代码有两个致命问题:一是用categories_name作为查询条件,但现在URL传递的是sub_id;二是直接拼接SQL存在注入风险。修改后的代码如下:
<?php // 先验证sub_id是否合法(必须是数字) if(isset($_GET['sub_id']) && is_numeric($_GET['sub_id'])){ $sub_id = $_GET['sub_id']; // 用预处理语句防止SQL注入,同时用sub_id查询数据 $stmt = $conn->prepare("SELECT * FROM sub_categories WHERE sub_id = ?"); $stmt->bind_param("i", $sub_id); $stmt->execute(); $data = $stmt->get_result(); while ($row = $data->fetch_assoc()) { $sub_categories_name = $row['sub_categories_name']; $sub_id = $row['sub_id']; // 生成规范的友好URL,修复原来的语法错误(多了个多余的);) $friendly_url = $sub_id . '/' . str_replace(' ', '-', strtolower($sub_categories_name)); ?> <a href="<?php echo $friendly_url; ?>"> <div class="cat-box p-0 m-0 cat-url"> <p class="subcat-url"><?php echo $sub_categories_name;?></p> </div> </a> <?php } $stmt->close(); } else { // 处理无效ID的情况 echo "Invalid category ID"; } ?>
为什么之前的修改会失效?
- 旧的重写规则没法解析
/1/Health-and-Beauty,导致category-classifieds.php根本没接收到sub_id参数,自然查不到数据 - 原来的PHP代码用
categories_name作为查询条件,但新URL并没有传递这个参数,查询条件不成立,返回空结果
内容的提问来源于stack exchange,提问作者Bhawesh
相关产品推荐
相关产品推荐

