我有一个MSSQL表users
:
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)
);
我正在尝试使用准备好的查询更新现有条目:
UPDATE users SET ? = ? WHERE ID=?;
我的参数为:
Array ( [0] => title [1] => Teleco [2] => 1 )
但似乎如果字符串长度大于5,则会给出错误“字符串或二进制数据将被截断”。例如,Telec
有效但Teleco
没有。当我在SQL Management Studio中尝试相同的查询时,它没有给我任何错误。
我只是错过了一些明显的东西吗?请帮忙
答案 0 :(得分:1)
您的查询,传入参数时,它等效于:
UPDATE users SET 'title' = 'Teleco' WHERE ID='1';
如果您尝试在管理工作室中运行它,那将无效。您收到的错误消息是错误的。正如弗雷德所说,你需要有一个可以更新的安全(白色)列列表:
$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 :(得分:1)
看到其他人决定发布答案,将我的评论转录成答案。
只是它,你不能用UPDATE users SET ? = ? WHERE ID=?;
绑定表/列。
如果有的话,请使用安全列表。
您可以通过$var="x";
通过分配预定义的变量"提前#34;来完成此操作。
然后执行UPDATE users SET '$var' = ? WHERE ID=?;
你看,表/列需要硬编码值或者#34; lookahead"在绑定开始之前,为了知道表/列名称应该使用什么。这一切都发生在"之后#34;查询,因此" lookahead"可以是变量的形式。