首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“MSSQL”字符串或二进制数据将被截断。更新错误

“MSSQL”字符串或二进制数据将被截断。更新错误
EN

Stack Overflow用户
提问于 2015-08-04 16:56:00
回答 2查看 237关注 0票数 1

我有一个MSSQL表users

代码语言:javascript
复制
CREATE TABLE users (
  ID int IDENTITY(1,1) NOT NULL,
  firstname nvarchar(20) NOT NULL,
  lastname nvarchar(20) NOT NULL,
  dir bit NOT NULL,
  cc nvarchar(15),
  readyacc bit NOT NULL,
  region nvarchar(50),
  org nvarchar(50),
  suborg nvarchar(50),
  section nvarchar(50),
  title nvarchar(50),
  floor tinyint,
  wkstn nvarchar(50),
  fc nvarchar(15)
);

我试图用准备好的查询更新一个现有条目:

代码语言:javascript
复制
UPDATE users SET ? = ? WHERE ID=?;

我的参数如下:

代码语言:javascript
复制
Array ( [0] => title [1] => Teleco [2] => 1 )

但是,如果字符串长度大于5,则会出现“字符串或二进制数据将被截断”的错误。Telec工作,但Teleco不工作。当我在中尝试相同的查询时,它不会给出任何错误。

我只是错过了一些显而易见的东西吗?请帮帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 17:04:28

看到别人决定发一个答案,把我的评论抄成一个答案。

仅此而已,您不能用UPDATE users SET ? = ? WHERE ID=?;绑定表/列。

如果有什么需要的话就找个安全员。

您可以通过“提前”分配一个预定义的变量来通过$var="x";实现这一点。

然后做UPDATE users SET '$var' = ? WHERE ID=?;

您可以看到,表/列需要硬编码值或“前瞻性”,以便在开始绑定之前知道表/列名应该使用什么。这一切都发生在查询之后,因此“展望”可以以变量的形式出现。

  • FYI:同样的情况也适用于MySQL,而不是专门针对MSSQL的。
票数 1
EN

Stack Overflow用户

发布于 2015-08-04 17:03:12

当传入参数时,您的查询相当于:

代码语言:javascript
复制
UPDATE users SET 'title' = 'Teleco' WHERE ID='1';

如果你试着在管理演播室运行它,这是行不通的。你得到的错误信息是错误的。正如Fred的评论所指出的,您需要有一个可以更新的安全(白色)列列表:

代码语言:javascript
复制
$safe_cols = ['dir', 'cc', 'title'];

if(in_array($col, $safe_cols, true))
{
    $stmt = $db->prepare('UPDATE users SET ' . $col . ' = ? WHERE id = ?');
    // bind params and execute
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31815088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档