[总结+讨论]php 字符串过滤 各类函数应用
首先自我检讨一下..因为正则不过关,所以自己写的过滤条件基本失败了...
上网查的函数也看不懂,改了也出错....
在csdn的各路神仙指点下,略微开了点窍...原问题帖链接
现放出各个路子的函数,供各位已经死过还尚未死成的同志使用....
希望大家积极补充,把平时常用的方法帖出来
基础函数
-----------------------------------------------
其实mysql和php自带很多函数可以处理字符问题,下面给出几个会经常用到的.
ps:由于php6开始不支持magic_quotes_gpc,所以下面的东西都是假设在magic_quotes_gpc=off的条件上(不知道php6会出什么新东西....)
mysql_real_escape_string()
定义:函数转义 SQL 语句中使用的字符串中的特殊字符。
语法: mysql_real_escape_string(string,connection)
说明:本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()。
由于实例代码过长,给出函数解释链接 w3school phpnet
addSlashes()
定义:addslashes() 函数在指定的预定义字符前添加反斜杠。
语法:addslashes(string)
注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
由于实例代码过长,给出函数解释链接 w3school phpnet
相关函数
StripSlashes()去掉反斜线字符。(解释过滤字符时用)
mb_convert_encoding()
PHP的内码转换函数
版本(PHP 4 >= 4.0.6, PHP 5)
这个函数可以将各种编码互相转换
相关链接 phpnet
iconv()
php内码转换函数,同上
因为iconv()在转换gb2312时的bug,所以要这样处理
iconv( "UTF-8", "gb2312//IGNORE" , $str)
mb_convert_encoding($str,"gb2312", "UTF-8");
SET NAMES utf8;SET CHARACTER SET utf8;SET COLLATION_CONNECTION='utf8_general_ci';
<?phpfunction escape($str) { preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r); $ar = $r[0]; foreach($ar as $k=>$v) { if(ord($v[0]) < 128) $ar[$k] = rawurlencode($v); else $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); } return join("",$ar);}function unescape($str) { $str = rawurldecode($str); preg_match_all("/(?:%u.{4})|.+/",$str,$r); $ar = $r[0]; foreach($ar as $k=>$v) { if(substr($v,0,2) == "%u" && strlen($v) == 6) $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4))); } return join("",$ar);}?>
<?phpfunction addslashes_str($str){$str=addslashes($str);$str=str_replace($str,";",'\;');return $str;}function stripslashes_str($str){$str=stripslashes($str);$str=str_replace($str,'\;',";");return $str;}?>
ps:如果有什么错误,希望大家指出,另外希望大家把平时用到的一些方法提供一下,互相学习...散分...
我写的原文
[解决办法]
写得很好,支持一下,顶,坐个沙发,呵呵!
[解决办法]
不懂,帮忙顶
[解决办法]
良好的学习习惯,
恭喜.
相信不久将来你也会成为高手的.
[解决办法]
不错,关注,学习中。。。
[解决办法]
不错
[解决办法]
不错,比较了解了
<?php
function addslashes_str($str){
$str=addslashes($str);
$str=str_replace($str,";",'\;');
return $str;
}
?>
$str=str_replace($str,";",'\;');这个有什么用?
[解决办法]
PHP_FUNCTION(mysql_set_charset){ zval *mysql_link = NULL; char *csname; int id = -1, csname_len; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &csname, &csname_len, &mysql_link) == FAILURE) { return; } if (ZEND_NUM_ARGS() == 1) { id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); CHECK_LINK(id); } ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); if (!mysql_set_character_set(&mysql->conn, csname)) { RETURN_TRUE; } else { RETURN_FALSE; }}
[解决办法]
刚才看了一下 php 5.2.8 的 ext/mysql/php_mysql.c,1099 行:
PHP_FUNCTION(mysql_set_charset){ zval *mysql_link = NULL; char *csname; int id = -1, csname_len; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &csname, &csname_len, &mysql_link) == FAILURE) { return; } if (ZEND_NUM_ARGS() == 1) { id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); CHECK_LINK(id); } ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); if (!mysql_set_character_set(&mysql->conn, csname)) { RETURN_TRUE; } else { RETURN_FALSE; }}
[解决办法]
补充一句:大家不要认为addslashes和mysql有什么关系,addslashes只不过正好可以用在mysql这个场景下而已。当然如我上面所说,实际上addslashes和mysql所要求的过滤还是有一些区别的。
[解决办法]