2012-02-24 15 views
0

我试图插入一个mysql查询本身到一个表字段中(当某些条件满足时执行一系列查询),但是每当查询中有任何特殊字符时,就会将其转换为它的相应的实体。插入特殊字符时的问题CodeIgniter

例如,如果Iam将此查询插入到表中,则报价将变为“'” ,>至& gt;和空间到&#。是否有任何方法插入查询,并以正确的形式显示。

"select 
     case item_id 
     when 206 then '1 Column' 
     when 255 then '2 Columns' 
     end as split, 
     # case oi.product_id 
     # when 24 then 'XXXX' 
     # when 28 then 'CCCC' 
     # when 30 then 'EEEE' 
     # else 'Something Else' 
     # end as product, 
    case oi.price_id 
     when 72 then 'UYT - Single Pay' 
     when 73 then 'UYT - Single Pay' 
     when 74 then 'UYT - Single Pay' 
    else 'Upsell' 
    end as product, 
    count(distinct(al.cust_id)) as the_count 
    from logtable al 
    where item_id in (206,255) and 
     activity_dts > '2012-01-31 19:15:00' and 
     o.order_is_refunded = 0 and 
     t.response_code = 1 and 
     t.response_reasontext not like '%testmode%' 
     group by 1,2;" 

请给我建议或我在这里丢失任何东西。我的CI安装使用的字符集是UTF-8。

+0

你的意思是你将整个查询作为“字符串”插入到mysql表列中?而不是特性和特定专业人员的伎俩? – Shaheer 2012-02-24 05:30:34

+0

是的。整个查询作为字段类型的字符串是text.I使用CI的活动记录来执行查询。但是,当我试图从phpmyadmin中插入查询到通常的插入到语句中时,它工作。任何想法 ? – 2012-02-24 05:36:03

回答

0

不应该有与插入你的字符串,因为它IS一个字符串的任何问题,并且数据库库本身并不做任何字符编码,据我所知。什么编码是数据库? (连接应该是UTF-8,按照默认设置)

由于您使用的框架,你可以使用它的方法(和 mysql_real_escape_string(),或神,和addslashes()!喜欢建议在其他的答案)。这应该工作:

$string_query = "select 
     case item_id 
     when 206 then '1 Column' 
     when 255 then '2 Columns'...."; 
$sql = "INSERT INTO table(column) VALUES (?)"; 
$this->db->query($sql, array($string_query)); 

查询绑定自动转义为SQL,所以你是安全的(你也可以使用ActiveRecord的结果相同)。我不知道什么不能在这工作,肯定没有功能编码的HTML。

也许你正在做的编码别处:你确定你不是叫xss_clean()htmlspecialchars()/htmlentities(),或者您已启用XSS保护,否则你传TRUE作为$this->input->第二paramenter?

如果上述所有出于某种原因 - 为您至极没有提供足够多的信息 - 失败,您可以alwasy编码的一切:

$string_query = base64_encode("select....."); 
// HERE YOU MAKE THE INSERT QUERY 

,当你找回它,你base64_decode()的字符串。但理想的解决方案不是这样,它应该没有任何缺陷。

+0

数据库编码是UTF-8 Unicode。 – 2012-02-24 07:09:04

+0

@JayeshAmbali好吧,你已经说过了。桌子?和田地?你有没有试过我建议的?特别是**粗体**部分 – 2012-02-24 07:14:47

+0

数据库编码是UTF-8 Unicode。我知道我们不能使用mysql_real_escape_string()或god,addslashes()来达到此目的。是的,我一直在使用xss_clean进行验证。现在我修好了。感谢buddy – 2012-02-24 07:27:48

0

PHP addshlashes

该功能将帮助您与它的报价以及添加查询,因为它是在你的数据库。

$tmp = "See single' quotes";

或反之亦然,如::

你也可以做到这一点的方式,

如果查询仅仅只拥有多个单引号,然后用双引号边境它

$tmp = 'See double " quotes'; 
+0

Addlashes()?在2012年?当使用框架?真?该手册甚至说'强烈建议使用DBMS特定的转义函数' – 2012-02-24 06:46:43

+0

@DamienPirsy当你发现你的框架不支持100%的需求时,你的生活中总会有时间。因此,无论是2012年还是1012年,有时是务实的,都不是罪恶:) – linuxeasy 2012-02-24 06:49:16

+0

还有alwasy mysq_real_escape_string(),你知道吗?无论如何,为什么问题是斜线? OP说了一些关于字符编码 – 2012-02-24 07:14:25