Sql codeigniter将复杂查询更改为活动记录
我有一个codeigniter应用程序 我的活动记录语法工作正常,如下所示:Sql codeigniter将复杂查询更改为活动记录,sql,codeigniter,activerecord,Sql,Codeigniter,Activerecord,我有一个codeigniter应用程序 我的活动记录语法工作正常,如下所示: function get_as_09($q){ $this->db->select('m3'); $this->db->where('ProductCode', $q); $query = $this->db->get('ProductList'); if($query->num_rows > 0){ foreach (
function get_as_09($q){
$this->db->select('m3');
$this->db->where('ProductCode', $q);
$query = $this->db->get('ProductList');
if($query->num_rows > 0){
foreach ($query->result_array() as $row){
$row_set[] = htmlentities(stripslashes($row['m3'])); //build an array
}
return $row_set;
}
}
这是有效的
select 'm3' from 'ProductList' where ProductCode='$1'
我需要做的是将下面的查询转换为活动记录类型查询,并按照上面的活动记录语法将其返回给控制器:
select length from
(SELECT
[Length]
,CONCAT(([width]*1000),([thickness]*1000),REPLACE([ProductCode],concat(([width]*1000),([thickness]*1000),REPLACE((convert(varchar,convert(decimal(8,1),length))),'.','')),'')) as options
FROM [dbo].[dbo].[ProductList]) as p
where options='25100cr' order by length
我画了下面这样的东西,但这不起作用
$this->db->select(length);
$this->db->from(SELECT [Length],CONCAT(([width]*1000),([thickness]*1000),REPLACE[ProductCode],concat(([width]*1000),([thickness]*1000),REPLACE((convert(varchar,convert(decimal(8,1),length))),'.','')),'')) as options
FROM [dbo].[dbo].[ProductList]);
$this->db->where(options, $q);
$this->db->order(length, desc);
一如既往地感谢你的帮助。再次感谢。您可以使用codeigniter的子查询方式来执行此操作。为此,您必须破解codeigniter。这样地 转到system/database/DB_active_rec.php从这些函数中删除public或protected关键字
public function _compile_select($select_override = FALSE)
public function _reset_select()
现在子查询写入可用,下面是您的查询和活动记录
$select = array(
'Length'
'CONCAT(([width]*1000)',
'thickness * 1000',
'REPLACE(ProductCode, concat((width*1000),(thickness*1000),REPLACE((convert(varchar,convert(decimal(8,1),length))),'.','')),'')) as options'
);
$this->db->select($select);
$this->db->from('ProductList');
$Subquery = $this->db->_compile_select();
$this->db->_reset_select();
$this->db->select('length');
$this->db->from("($Subquery)");
$this->db->where('options','25100cr');
$this->db->order_by('length');
事情就这样结束了。干杯
注意:在使用子查询时,必须使用
$this->db->from('myTable')
而不是
$this->db->get('myTable')
它运行查询
为什么不执行sql查询呢
$this->db->query($sql)
@Brewal,不允许注入或任何其他安全漏洞?嗨,raheel,如何设置整个查询=$q以便我可以执行“$query=$this->db->query($sql)”;if($query->num_rows>0){foreach($query->result_array()as$row){$row_set[]=htmlentities(stripslashes($row['length']);//构建数组}返回$row_set;}`而不是`$query=$this->db->query($sql)`使用`$query=$this->db->get()`并比你的if条件等更有效,查询生成器不是为像这样的黑客行为而设计的。如果您需要子查询等等,您应该手动编写查询。您可以使用以确保转义数据(也建议在手动之前进行适当的验证)。