昨晚写了一篇正则表达式相关的文章,修改保存后,文章里的\d表达式里的反斜杠就不见了。就因为这个坑,踩了一个通宵。
之前根本就不太熟悉stripslash、addslash、htmlspecialchars_decode这些函数的详细工作,所以代码有点乱,已经不知道当初是咋写的了。
但是可以先贴出我的项目model底层代码关于这段的实现:
protected function parseValue($value) {
if(is_string($value) || is_numeric($value)) {
$value = '\''.$this->escapeString($value).'\'';
}elseif(isset($value[0]) && is_string($value[0]) && strtolower($value[0]) == 'exp'){
$value = $value[1];
}elseif(is_array($value)) {
$value = array_map(array($this, 'parseValue'),$value);
}elseif(is_null($value)){
$value = 'NULL';
}
return $value;
}
public function escapeString($str) {
$str = addslashes(stripslashes($str));
return $str;
}
在更新和插入mysql表的数据时,每一列都会经历上面代码块里的parseValue方法,如果是字符串或数字,继而又会走escapeString方法。
我踩的坑就在这里的escapeString方法上。
我去手册先查了下addSlashes方法,是像下面这样描述的:
Returns a string with backslashes added before characters that need to be escaped. These characters are:
//没有给单引转义,这个sql语句就无法执行
insert into blog(content) values('我是一枚不折不扣的'码农'');
public function escapeString($str) {
//就只加了下面这行代码
$str = str_ireplace("\\", "\", $str );
$str = addslashes(stripslashes($str));
return $str;
}
$str = '\你好\\"我是一枚不折\不扣的码农\\\\';
var_dump(htmlspecialchars_decode($str));
string(50) "\你好\"我是一枚不折\不扣的码农\\"
//这块本来是代码,结果被一同解析显示成文本和图片在文章里了
$str = '<a class="link" href="http://www.zhai14.com">翟码农</a>
<img src="http://www.zhai14.com/media/upload/article/9671d518gy1g14y4dwe36j20ki08u758.jpg">';
明天就要星期一啦!<br />
明天就要星期一啦!!<br />
明天就要星期一啦!!!<br />
蹭了一天饭躺了一天床的我,实在愧于向大家打鸡血。<br />
可是星期一也是属于每一个人的,我也需要给自己注射注射一下子。<br />
<br />
<br />
明天就要星期一啦!<br />
明天就要星期一啦!!<br />
明天就要星期一啦!!!<br />
蹭了一天饭躺了一天床的我,实在愧于向大家打鸡血。<br />
可是星期一也是属于每一个人的,我也需要给自己注射注射一下子。<br /> <br /> <br />