如何在CodeIgniter查询构造器中向MSSQL插入含newid()的uniqueidentifier数据
错误原因
CodeIgniter Query Builder 默认会对所有插入的值做转义处理,你直接把newid()、getdate()作为字符串传入数据数组时,框架会自动给值加上单引号,最终生成的SQL语句为id = 'newid()',相当于尝试把普通字符串转换为uniqueidentifier类型,自然会触发转换失败的报错。
另外PHP原生的uniqid()生成的是13位无分隔符的唯一字符串,不符合SQL Server uniqueidentifier要求的36位GUID格式,也会出现格式不匹配的错误。
正确实现方式
对需要调用SQL原生函数的字段,单独调用set()方法,并将第三个参数设为false,关闭该字段的自动转义即可,其他普通字段仍保持正常传值即可保留转义逻辑,避免SQL注入风险。正确代码如下:
$db = \Config\Database::connect(); $builder = $db->table('DOM5_PP_LOGI'); // 单独处理需要调用SQL原生函数的字段,第三个参数关闭转义 $builder->set('id', 'NEWID()', false); $builder->set('data_datetime', 'GETDATE()', false); // 普通业务字段正常传入数组,框架会自动做转义处理 $data = [ 'id_zgloszenia' => $idpp, 'response' => $response_pp, 'header_response' => $head_res, ]; $builder->insert($data);
内容的提问来源于stack exchange,提问作者Kordian Zadrożny
相关产品推荐
相关产品推荐

