为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 绑定参数使用 insert() 和 Convert() 内部

Laravel 绑定参数使用 insert() 和 Convert() 内部

PHP
蝴蝶不菲 2023-08-06 14:41:41
我很难绑定我的 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))我收到此错误: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 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

根据您最后的错误消息,当您尝试完整的原始查询时:

SQLSTATE[22001]:[Microsoft][SQL Server 的 ODBC 驱动程序 13][SQL Server]字符串或二进制数据将被截断。(SQL: INSERT INTO [dbo].[tbl_rfaccount] ([id] ,[password] ,[accounttype] ,[birthdate] ,[BCodeTU] ,[Email]) VALUES ((CONVERT(binary, user01)), (CONVERT (二进制,密码01)),0,2011-11-11 00:00:00,1,user@example.com)

您需要指定函数中字段的长度CONVERT

不是CONVERT(binary, user01),但是CONVERT(binary(16), user01)。指定与目标表中定义的列相同的长度。

如果不指定长度,则在某些情况下假定为 1,在某些情况下假定为 30。

CONVERT如果未指定,该函数假定长度为 30。

-- CONVERT Syntax:  CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

...

长度

对于允许用户指定长度的数据类型,指定目标数据类型的长度的可选整数。默认值为 30。

这是一个简单的例子,演示了正在发生的事情:

SELECT
    CONVERT(binary(16), '1234567890123456') AS Bin16
    ,CONVERT(binary, '1234567890123456') as BinNoLength
;

结果:

+------------------------------------+----------------------------------------------------------------+

| Bin16                              | BinNoLength                                                    |

+------------------------------------+----------------------------------------------------------------+

| 0x31323334353637383930313233343536 | 0x313233343536373839303132333435360000000000000000000000000000 |

+------------------------------------+----------------------------------------------------------------+

因此,当您未在 中指定长度时CONVERT,您将得到结果binary(30)。


当您尝试将此 long 值插入到表中的列中时,您的列不够长,无法存储它,因此 long 值被截断,并且您会看到此错误消息。


查看完整回答
反对 回复 2023-08-06
?
精慕HU

TA贡献1845条经验 获得超8个赞

你能试试这个吗


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

    ]);


查看完整回答
反对 回复 2023-08-06
  • 2 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信