PHP获取Varchar类型主键值及调用getUserById方法问题咨询
解决PHP中GET变量获取与用户信息查询的问题
我看你在开发登录后通过护照号(varchar类型主键)展示用户信息的功能时,碰到了两个关键问题:GET变量的正确获取方式,以及getUserById方法的安全调用。下面一步步帮你修正:
1. 修正GET变量的错误写法
你原来代码里的$userid=()$_GET['passport_IC'];是语法错误,这直接导致了$userid未定义的提示。正确的做法是直接从$_GET数组取值,还可以加一些基础过滤保证数据干净:
// 正确获取并处理GET参数 if (isset($_GET['passport_IC'])) { // 去除前后空格,避免无效的空白字符 $userid = trim($_GET['passport_IC']); // 可选:如果需要强制转为字符串(虽然varchar本身就是字符串类型) // $userid = (string) trim($_GET['passport_IC']); } else { // 如果没有传passport_IC参数,直接跳回首页或者给出提示 header("Location: index.php"); exit; }
2. 安全调用getUserById方法
你原来的代码在调用方法时,没有考虑$userid可能不存在的情况(比如用户直接访问这个页面没带参数)。必须确保$userid有效后再调用查询方法,避免传空值或未定义变量进去。
修正后的完整代码示例
<?php // 先实例化User类,建议放在逻辑最开头 $user = new User(); // 初始化$userid,避免未定义变量 $userid = null; // 处理GET参数 if (isset($_GET['passport_IC'])) { $userid = trim($_GET['passport_IC']); // 可选:添加护照号格式验证,比如用正则匹配你的护照号规则 // if (!preg_match('/^[A-Z0-9]{10}$/', $userid)) { // 示例正则,根据实际调整 // header("Location: index.php"); // exit; // } } else { // 没有传递必要参数,跳回首页 header("Location: index.php"); exit; } // 确保$userid不为空时才调用查询方法 $userdata = $user->getUserById($userid); ?> <div class="panel panel-default"> <div class="panel-heading"> <h2>User Profile<span class="pull-right"><a class="btn btn-info" href="index.php">Back</a></span></h2> </div> <div class="panel-body"> <div style="max-width: 600px; margin:0 auto"> <?php if ($userdata) { ?> <!-- 这里输出用户信息,记得用htmlspecialchars防止XSS攻击 --> <p>护照号:<?php echo htmlspecialchars($userdata['passport_IC']); ?></p> <p>姓名:<?php echo htmlspecialchars($userdata['name']); ?></p> <!-- 其他用户字段按需添加 --> <?php } else { ?> <p>未找到匹配的用户信息</p> <?php } ?> </div> </div> </div>
额外提醒
- 安全问题:输出用户数据时一定要用
htmlspecialchars()转义,防止XSS攻击;如果你的getUserById方法是直接拼接SQL语句查询,务必改用预处理语句(PDO或mysqli预处理),避免SQL注入风险(毕竟护照号是字符串,直接拼接非常危险)。 - 方法适配:确认你的
getUserById方法能接收字符串类型的参数,因为你的数据库主键是varchar类型。如果之前方法是为整数主键设计的,要修改内部的SQL逻辑,比如把主键值用字符串的方式处理(比如在SQL里加引号,或者用预处理绑定字符串参数)。
内容的提问来源于stack exchange,提问作者Mim Hsan
相关产品推荐
相关产品推荐

