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

通过Session插入登录用户名到数据库失败,字符串截断报错如何解决?

问题:Session获取用户名插入SQL Server数据库失败(字符串截断错误)

我编写了如下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字段定义的最大长度,导致数据被截断,插入操作终止。

解决步骤

  1. 检查并调整数据库字段长度

    • 打开SQL Server管理工具(如SSMS),找到user_activity_log表,查看username字段的类型和长度(例如是varchar(20)还是nvarchar(30))。
    • 如果当前长度不足以容纳实际的用户名,修改字段为合适的长度(比如改成varchar(100),根据业务场景设置足够的长度)。
  2. 修复代码的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:10:54