无法通过logincheck.php完成用户名密码数据库校验,求技术协助
解决用户身份认证功能的问题
我帮你一步步排查代码里的问题,搞定用户身份校验功能:
首先梳理现有代码的核心问题
- 变量名不匹配:你通过
$_POST获取的用户名和密码变量是$uname和$pword,但SQL查询语句里却用了未定义的$username和$password,这直接导致数据库查询不到任何匹配数据。 - 存在SQL注入风险:直接将用户输入拼接进SQL语句是高危操作,恶意用户可以通过构造特殊输入篡改SQL逻辑,窃取或破坏数据。
- 缺少查询执行与结果校验:代码只定义了查询语句,但没有执行查询,也没有判断查询结果是否存在匹配的用户记录。
修正后的完整logincheck.php代码
<?php // 获取表单提交的用户名和密码 $uname = $_POST['username']; $pword = $_POST['password']; $serverName = "<ip address , portnumber>"; $connectionInfo = array( "Database"=>"testing", "UID"=>"sa", "PWD"=>"abc@123"); $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn ) { // 使用参数化查询避免SQL注入,同时修正变量名 $sqlquery = "SELECT * FROM emp WHERE username = ? AND password = ?"; $params = array($uname, $pword); $queryResult = sqlsrv_query($conn, $sqlquery, $params); if($queryResult === false) { // 输出查询错误信息(生产环境建议隐藏具体错误,返回通用提示) die( print_r( sqlsrv_errors(), true)); } // 检查是否查询到匹配的用户 if(sqlsrv_has_rows($queryResult)) { echo "身份认证成功!"; // 这里可以添加会话创建、页面跳转等逻辑,比如: // session_start(); // $_SESSION['username'] = $uname; // header("Location: dashboard.php"); // exit; } else { echo "用户名或密码错误,请重试!"; // 可以跳回登录页,比如: // header("Location: login.html?error=1"); // exit; } // 释放查询资源 sqlsrv_free_stmt($queryResult); // 关闭数据库连接 sqlsrv_close($conn); } else { echo "数据库连接失败!"; die( print_r( sqlsrv_errors(), true)); } ?>
关键说明
- 参数化查询:用
?作为占位符,通过$params数组传递用户输入,sqlsrv会自动处理输入的转义,彻底避免SQL注入。 - 结果校验:通过
sqlsrv_has_rows()判断查询结果是否存在记录,存在则说明用户名和密码匹配,认证成功。 - 错误处理:添加了连接失败、查询失败的错误输出(生产环境注意不要暴露具体错误信息,避免泄露数据库敏感信息)。
- 资源释放:使用
sqlsrv_free_stmt()和sqlsrv_close()释放查询资源和数据库连接,避免资源浪费。
内容的提问来源于stack exchange,提问作者Bhanu Prakash
相关产品推荐
相关产品推荐

