我很难绑定我的sql查询,我只剩下几个脑细胞了。
基本上,这段代码可以工作,但很容易注入sql:
return DB::connection('sqlsrv_rfo_user')
->table('dbo.tbl_rfaccount')
->insert([
'Email' => $email,
'id' => DB::raw("CONVERT(binary, '$username')"),
'password' => DB::raw("CONVERT(binary, '$password')"),
'birthdate' => $birthday,
'accounttype' => 0,
'BCodeTU' => 1
]);
我正在尝试找出如何绑定这些代码行:
'id' => DB::raw("CONVERT(binary, '$username')"),
'password' => DB::raw("CONVERT(binary, '$password')"),
我确实尝试过:
'id' => DB::raw("CONVERT(binary, ?)", [$username]),
'password' => DB::raw("CONVERT(binary, ?)", [$password]),
出现了这个错误:
SQLSTATE[07002]: [Microsoft][ODBC Driver 13 for SQL Server]COUNT field incorrect or syntax error (SQL: insert into [dbo].[tbl_rfaccount] ([Email], [id], [password], [birthdate], [accounttype], [BCodeTU]) values (user@example.com, CONVERT(binary, 2011-11-11 00:00:00), CONVERT(binary, 0), 1, ?, ?))
还有这个:
'id' => DB::raw("CONVERT(binary, :username)", ['username' => $username]),
'password' => DB::raw("CONVERT(binary, :password)", ['password' => $password]),
出现了这个错误:
SQLSTATE[IMSSP]: An error occurred substituting the named parameters. (SQL: insert into [dbo].[tbl_rfaccount] ([Email], [id], [password], [birthdate], [accounttype], [BCodeTU]) values (user@example.com, CONVERT(binary, :username), CONVERT(binary, :password), 2011-11-11 00:00:00, 0, 1))
如果我尝试全生的:
return DB::connection('sqlsrv_rfo_user')
->insert("
INSERT INTO [dbo].[tbl_rfaccount]
([id]
,[password]
,[accounttype]
,[birthdate]
,[BCodeTU]
,[Email])
VALUES
((CONVERT(binary, ?)), (CONVERT(binary, ?)), ?, ?, ?, ?)
", [$username, $password, 0, $birthday, 1, $email]);
我得到这个错误:
SQLSTATE[22001]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]String or binary data would be truncated. (SQL: INSERT INTO [dbo].[tbl_rfaccount] ([id] ,[password] ,[accounttype] ,[birthdate] ,[BCodeTU] ,[Email]) VALUES ((CONVERT(binary, user01)), (CONVERT(binary, password01)), 0, 2011-11-11 00:00:00, 1, user@example.com)
从我开始学习laravel开始,我就一直在使用eloquent,但我有一个项目,它迫使我用这种方式编码,所以我别无选择。
2条答案
按热度按时间9w11ddsr1#
根据上一条错误消息,在尝试完整原始查询时:
sqlstate[22001]:[microsoft][odbc driver 13 for sql server][sql server]字符串或二进制数据将被截断(sql:插入到[dbo]。[tbl\ rfaccount]([id],[password],[accounttype],[birthdate],[bcodetu],[email])值((convert(binary,user01)),(convert(binary,password01)),0,2011-11-11 00:00:00,1,user@example.com)
您需要指定中字段的长度
CONVERT
功能。不是
CONVERT(binary, user01)
,但是CONVERT(binary(16), user01)
. 指定与目标表中定义的列相同的长度。如果不指定长度,则在某些情况下假定长度为1,在某些情况下假定长度为30。
AaronBertrand写了一篇关于这个(和其他)坏习惯的详细文章:踢坏习惯:声明varchar不带(长度)。
varchar
或者binary
或者varbinary
在这里是相似的。正如@zhorov在评论中正确指出的
CONVERT
函数假定长度为30(如果未指定)。...
长度
对于允许用户指定长度的数据类型,指定目标数据类型长度的可选整数。默认值为30。
下面是一个简单的示例,演示了正在发生的事情:
结果是:
所以,如果不指定
CONVERT
,你会得到binary(30)
结果。当您尝试将这个长值插入表中的列时,您的列不够长,无法存储它,因此长值被截断,您将看到此错误消息。
xqnpmsa82#
你能试试这个吗