通过Session插入登录用户名到数据库失败,字符串截断报错如何解决?
我编写了如下PHP代码,尝试通过Session获取登录用户名并插入到数据库的user_activity_log表中:
<?php session_start(); include 'connection.php'; $uname = $_SESSION['user']; echo $uname; $sql = "INSERT INTO user_activity_log (username) VALUES ('$uname')"; if (sqlsrv_query($conn, $sql)) { echo "New record created successfully"; } else { echo "record could not be established.<br />"; die( print_r( sqlsrv_errors(), true)); } sqlsrv_close($conn); ?>
代码可正常输出用户名,但无法完成插入操作,出现如下错误:
Array ( [0] => Array ( [0] => 22001 [SQLSTATE] => 22001 [1] => 8152
[code] => 8152 [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL
Server]String or binary data would be truncated. [message]
=> [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]String or binary data would be truncated. ) [1] => Array ( [0] => 01000
[SQLSTATE] => 01000 [1] => 3621 [code] => 3621 [2] => [Microsoft][ODBC
Driver 17 for SQL Server][SQL Server]The statement has been
terminated. [message] => [Microsoft][ODBC Driver 17 for SQL
Server][SQL Server]The statement has been terminated. ) )
解决方案
错误原因
报错中的String or binary data would be truncated明确说明:你要插入的用户名字符串长度,超过了user_activity_log表中username字段定义的最大长度,导致数据被截断,插入操作终止。
解决步骤
检查并调整数据库字段长度
- 打开SQL Server管理工具(如SSMS),找到
user_activity_log表,查看username字段的类型和长度(例如是varchar(20)还是nvarchar(30))。 - 如果当前长度不足以容纳实际的用户名,修改字段为合适的长度(比如改成
varchar(100),根据业务场景设置足够的长度)。
- 打开SQL Server管理工具(如SSMS),找到
修复代码的SQL注入风险(必须优化)
原代码直接将变量拼入SQL语句,不仅存在严重的SQL注入漏洞,还可能因为用户名包含特殊字符(比如单引号)导致插入失败。改用参数化查询可以同时解决这两个问题:
<?php session_start(); include 'connection.php'; // 先判断Session是否存在,避免未登录时出错 if (!isset($_SESSION['user'])) { die("用户未登录"); } $uname = $_SESSION['user']; echo $uname; // 使用参数化查询 $sql = "INSERT INTO user_activity_log (username) VALUES (?)"; $params = array($uname); $stmt = sqlsrv_query($conn, $sql, $params); if ($stmt) { echo "New record created successfully"; } else { echo "record could not be established.<br />"; die( print_r( sqlsrv_errors(), true)); } sqlsrv_free_stmt($stmt); sqlsrv_close($conn); ?>
内容的提问来源于stack exchange,提问作者Priya Tiwari

