我有一个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不工作。当我在中尝试相同的查询时,它不会给出任何错误。
我只是错过了一些显而易见的东西吗?请帮帮忙
发布于 2015-08-04 17:04:28
看到别人决定发一个答案,把我的评论抄成一个答案。
仅此而已,您不能用UPDATE users SET ? = ? WHERE ID=?;绑定表/列。
如果有什么需要的话就找个安全员。
您可以通过“提前”分配一个预定义的变量来通过$var="x";实现这一点。
然后做UPDATE users SET '$var' = ? WHERE ID=?;
您可以看到,表/列需要硬编码值或“前瞻性”,以便在开始绑定之前知道表/列名应该使用什么。这一切都发生在查询之后,因此“展望”可以以变量的形式出现。
发布于 2015-08-04 17:03:12
当传入参数时,您的查询相当于:
UPDATE users SET 'title' = 'Teleco' WHERE ID='1';如果你试着在管理演播室运行它,这是行不通的。你得到的错误信息是错误的。正如Fred的评论所指出的,您需要有一个可以更新的安全(白色)列列表:
$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
}https://stackoverflow.com/questions/31815088
复制相似问题