本人使用的Bo-blog版本Ver 2.1.1 博文量稍大显现出DB锁表问题
Php/Js/Shell/Go jackxiang 2011-5-6 20:11
我用的bo-blog,刚才,发现博客的服务器的负载很高,就一博客,不致与:
Top一看:
Mysql:
如下:
一看索引没有,赶紧加上索引:
SELECT `blogid`,`pubtime`,`edittime`,`blogalias` FROM `boblog_blogs` WHERE `property`<2 ORDER BY
alter table `boblog_blogs` add index property(property);
SELECT `blogid`,`title`,`blogalias` FROM `boblog_blogs` WHERE `property`<'2' AND `pubtime`<'13040783';
alter table `boblog_blogs` add index property_pubtime(property,pubtime);
SELECT * FROM `boblog_blogs` WHERE `property`<2 AND `frontpage`=0 ORDER BY `sticky`DESC, `pubtime`;
alter table `boblog_blogs` add index property_frontpage(property,frontpage);
博客次数和上面是一个表,索引加多了,update效率会不会下降?如下:
UPDATE LOW_PRIORITY `boblog_blogs` SET `views`=`views`+1 WHERE `blogid`='4257'
看来一个博客的访问设计仍旧需要考究和研究,我的博文也就3000多,DB性能就显现出来了。
后记:
查看后依旧有这样那样的小问题,但sleep和锁表大为缓解。
后来,负载降低,由25降低到5,说明还是有点效果滴嘛:
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
| 1 | SIMPLE | boblog_blogs | range | property,property_pubtime,property_frontpage | property | 4 | NULL | 3526 | Using where; Using filesort |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
Top一看:
Mysql:
如下:
一看索引没有,赶紧加上索引:
SELECT `blogid`,`pubtime`,`edittime`,`blogalias` FROM `boblog_blogs` WHERE `property`<2 ORDER BY
alter table `boblog_blogs` add index property(property);
SELECT `blogid`,`title`,`blogalias` FROM `boblog_blogs` WHERE `property`<'2' AND `pubtime`<'13040783';
alter table `boblog_blogs` add index property_pubtime(property,pubtime);
SELECT * FROM `boblog_blogs` WHERE `property`<2 AND `frontpage`=0 ORDER BY `sticky`DESC, `pubtime`;
alter table `boblog_blogs` add index property_frontpage(property,frontpage);
博客次数和上面是一个表,索引加多了,update效率会不会下降?如下:
UPDATE LOW_PRIORITY `boblog_blogs` SET `views`=`views`+1 WHERE `blogid`='4257'
看来一个博客的访问设计仍旧需要考究和研究,我的博文也就3000多,DB性能就显现出来了。
后记:
查看后依旧有这样那样的小问题,但sleep和锁表大为缓解。
后来,负载降低,由25降低到5,说明还是有点效果滴嘛:
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
| 1 | SIMPLE | boblog_blogs | range | property,property_pubtime,property_frontpage | property | 4 | NULL | 3526 | Using where; Using filesort |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
MySQL_LOAD_DATA权限设置
Php/Js/Shell/Go jackxiang 2011-5-6 09:44
Mysql版本号:
mysql> select version();
+------------+
| version() |
+------------+
| 5.0.26-log |
+------------+
配置:
vi /etc/my.cnf
有一行:
local-infile=1
但是导入DB的时候就是不行:
最后解决方法:
导入OK!
反过来证明其配置可能有问题。
具体原因待查,估计得从show variables入手思路:
不加参数:
一样的,奇怪了!!!
Mysql手册摘抄:
你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令。
对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用。类似地,对于mysqlimport,--local or -L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。
如果你使用LOAD DATA LOCAL Perl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了便面不理解local-infile的程序产生问题,则规定使用loose- prefix:
·[client]
·loose-local-infile=1
·如果LOAD DATA LOCAL INFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:
ERROR 1148: The used command is not allowed with this MySQL version
参考来源:
http://wenku.baidu.com/view/4b93ac10f18583d0496459a0.html
mysql> select version();
+------------+
| version() |
+------------+
| 5.0.26-log |
+------------+
配置:
vi /etc/my.cnf
有一行:
local-infile=1
但是导入DB的时候就是不行:
最后解决方法:
导入OK!
反过来证明其配置可能有问题。
具体原因待查,估计得从show variables入手思路:
不加参数:
一样的,奇怪了!!!
Mysql手册摘抄:
你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令。
对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用。类似地,对于mysqlimport,--local or -L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。
如果你使用LOAD DATA LOCAL Perl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了便面不理解local-infile的程序产生问题,则规定使用loose- prefix:
·[client]
·loose-local-infile=1
·如果LOAD DATA LOCAL INFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:
ERROR 1148: The used command is not allowed with this MySQL version
参考来源:
http://wenku.baidu.com/view/4b93ac10f18583d0496459a0.html
[方便查找]我的vim配置文件情况备份包含PHP函数查找等
Php/Js/Shell/Go jackxiang 2011-3-27 12:41
[vps实践]linux下安装php5.3.6的扩展包pear
Php/Js/Shell/Go jackxiang 2011-3-26 14:15
(1)chmod: cannot access `ext/phar/phar.phar': No such file or directory:
wget http://pear.php.net/go-pear.phar
[root@localhost phar]# /usr/local/webserver/php/bin/php go-pear.phar
Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.
1. Installation base ($prefix) : /usr/local/webserver/php
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/local/webserver/php/bin
5. PHP code directory ($php_dir) : /usr/local/webserver/php/lib/php
6. Documentation directory : /usr/local/webserver/php/docs
7. Data directory : /usr/local/webserver/php/data
8. User-modifiable configuration files directory : /usr/local/webserver/php/cfg
9. Public Web Files directory : /usr/local/webserver/php/www
10. Tests directory : /usr/local/webserver/php/tests
11. Name of configuration file : /usr/local/webserver/php/etc/pear.conf
1-11, 'all' or Enter to continue: all
这个根据个人环境进行修改。(我是直接回车即可)
(2)chmod: cannot access `ext/phar/phar.phar': No such file or directory:
make: [ext/phar/phar.phar] Error 1 (ignored)
解决方法:./configure的时候 要加上--without-pear
wget http://pear.php.net/go-pear.phar
[root@localhost phar]# /usr/local/webserver/php/bin/php go-pear.phar
Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.
1. Installation base ($prefix) : /usr/local/webserver/php
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/local/webserver/php/bin
5. PHP code directory ($php_dir) : /usr/local/webserver/php/lib/php
6. Documentation directory : /usr/local/webserver/php/docs
7. Data directory : /usr/local/webserver/php/data
8. User-modifiable configuration files directory : /usr/local/webserver/php/cfg
9. Public Web Files directory : /usr/local/webserver/php/www
10. Tests directory : /usr/local/webserver/php/tests
11. Name of configuration file : /usr/local/webserver/php/etc/pear.conf
1-11, 'all' or Enter to continue: all
这个根据个人环境进行修改。(我是直接回车即可)
(2)chmod: cannot access `ext/phar/phar.phar': No such file or directory:
make: [ext/phar/phar.phar] Error 1 (ignored)
解决方法:./configure的时候 要加上--without-pear
背景:用sed进行删除一行时用@或#均不行,最后还得用斜杠,
sed -i '@^worker_cpu_affinity.*@d' nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s "s@jenkins@@" /etc/hosts
模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts
用斜杠就对了,以行打头进行匹配:
比如删除Nginx里的nginx.conf里的 include vhosts/mini.conf,注意:如果有多个可能会删除多行;
阅读全文
sed -i '@^worker_cpu_affinity.*@d' nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s "s@jenkins@@" /etc/hosts
模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts
用斜杠就对了,以行打头进行匹配:
比如删除Nginx里的nginx.conf里的 include vhosts/mini.conf,注意:如果有多个可能会删除多行;
阅读全文
[个人原创]Js的onload和js表单提交submit的demo示例
Php/Js/Shell/Go jackxiang 2011-1-11 19:55
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Js的onload和js表单提交submit的demo示例</title>
<script language="javascript">
window.onload=function()
{
document.forms.registerform.submit();
}
</script>
</head>
<body>
<form id="registerform" name="register" method="post" action="www.baidu.com">
<label for="name"></label>
<input name="name" type="text" id="name" value="name" />
</form>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Js的onload和js表单提交submit的demo示例</title>
<script language="javascript">
window.onload=function()
{
document.forms.registerform.submit();
}
</script>
</head>
<body>
<form id="registerform" name="register" method="post" action="www.baidu.com">
<label for="name"></label>
<input name="name" type="text" id="name" value="name" />
</form>
</body>
</html>
[实践OK]Linux下用Grep -E参数实现$grep -E ^[a-Z] supervisord.conf显示非注释项,ABC def abc,加上正则表达式实现,多个函数查找的方法,及实现查看所查找单词的前三行后两行的环绕搜索,grep一个多行单独IP间隔包含文字里的IP列表出来,grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用。
Php/Js/Shell/Go jackxiang 2010-12-28 20:14
cat xxxx.txt|grep -Ev "无锡|腾讯云|华为云|微软云|阿里云|百度云|金山云" #grep 正则接合v排除的查询
api-itv-xxxx-cn-master-php-db578496b-zxxnj 6/6 Running 0 65m
kubectl get po -l pro=itv_api|grep -E "Running +0" #加号+:匹配1个或多个前面的字符,它和星号*的作用相似,但它不匹配0个字符的情况。比如,"ab+c"将匹配"abc"、“abbc”、“abbb...c”等。
不用加正则参数也成,直接用egrep:
rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep
cat videoupload.php |grep upload --color //给加点颜色。
背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
配上shell 文件 findfunPath.sh如下:
简单示例:
二)查看所查找单词的前三行后两行的环绕搜索:
[root@iZ25dcp92ckZ multepoolserver]# grep -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569- threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570- //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571- if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573- loger(errOut);
574- return -1;
--
591- writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592- //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593- if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595- loger(errOut);
596- return -1;
三)grep一个多行单独IP间隔包含文字里的IP列表出来:
四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./ -A 7|grep root
./answer.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf: root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
api-itv-xxxx-cn-master-php-db578496b-zxxnj 6/6 Running 0 65m
kubectl get po -l pro=itv_api|grep -E "Running +0" #加号+:匹配1个或多个前面的字符,它和星号*的作用相似,但它不匹配0个字符的情况。比如,"ab+c"将匹配"abc"、“abbc”、“abbb...c”等。
不用加正则参数也成,直接用egrep:
rpm -qf /bin/egrep
grep-2.20-3.el6_7.1.x86_64
rpm -ql grep-2.20-3.el6_7.1.x86_64|grep grep
/bin/egrep
/bin/fgrep
/bin/grep
cat videoupload.php |grep upload --color //给加点颜色。
背景:实现一次性查找多个函数的awk实现,以及grep一个文件里的所有IP行:
-n :grep 行输出,--line-number print line number with output lines
一)Grep -E参数,加上正则表达式实现,多个函数查找,如下:
grep -Erin 'atoi|itoa|atol|ltoa|intval' ./
配上shell 文件 findfunPath.sh如下:
#!/bin/bash
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
简单示例:
findfunPath.sh /usr/local/pro/
二)查看所查找单词的前三行后两行的环绕搜索:
[root@iZ25dcp92ckZ multepoolserver]# grep -rin -B 3 -A 2 "pthread_create Failed" ./multepoolser.c
569- threadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
570- //if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&i)){
571- if(pthread_create(&handleEpollRd[i],NULL,pthread_handle_message, (void *)&threadNum[i])){
572: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
573- loger(errOut);
574- return -1;
--
591- writeThreadNum[i]=i;//给数组赋值,传入线程编号值,后传入线程里。
592- //if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, NULL )){
593- if(pthread_create(&saveUpFilePart2Diskk[i],NULL,sync_additional_writing_worker, (void *)&writeThreadNum[i])){
594: sprintf(errOut,"pthread_create Failed : %s - %m\n",strerror(errno));
595- loger(errOut);
596- return -1;
三)grep一个多行单独IP间隔包含文字里的IP列表出来:
四)grep查找时显示找到那行的后面N行-A,和前面N行参数-B的实际应用之查找域名里的root有哪些路径:
grep -Er "common.jackxiang.com|vote.jackxiang.com|answer.jackxiang.com|scratch.jackxiang.com|api.itv.jackxiang.com|common.itv.jackxiang.com|api.itv.cctv.com|common.itv.cctv.com" ./ -A 7|grep root
./answer.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./api.itv.jackxiang.com.conf: root /data/www/api.itv.jackxiang.com/;
./vote.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./scratch.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
./common.jackxiang.com.conf- root /data/www/api.jackxiang.com/;
php-filter过滤器- filter_input_array() 和如何正确运用PHP filter判断过滤数据。
Php/Js/Shell/Go jackxiang 2010-11-9 19:14
在PHP出现至今,一直在不断的更新版本,增加新的功能,供我们大家使用,满足我们的需求。PHP 5.2以及更高的版本,PHP filter被绑定于系统,它可以对数据进行自动的过滤和判断。
第一种、PHP filter判断一个变量的内容是否符合要求
使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_VALIDATE_EMAIL);
第二种、PHP filter根据要求过滤一个变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_SANITIZE_EMAIL);
第三种、PHP filter判断输入的变量的内容是否符合要求
使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。
假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。
echo filter_input(INPUT_POST,
‘email’, FILTER_VALIDATE_EMAIL);
第四种、PHP filter根据要求过滤输入的变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。
如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’源码天空,系统会把email格式中不允许的东西去除,输出’boy’。
echo filter_input
(INPUT_POST, ‘email’,
FILTER_SANITIZE_EMAIL);
以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。
来自:http://www.codesky.net/article/200912/140526.html
阅读全文
第一种、PHP filter判断一个变量的内容是否符合要求
使用函数filter_var,第一个参数是要判断的变量。第二个参数是判断的要求,FILTER_VALIDATE_EMAIL表示判断是否符合email格式。如果变量是类似’boy@163.com’的数据,系统就会完整的输出‘boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出空字符串。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_VALIDATE_EMAIL);
第二种、PHP filter根据要求过滤一个变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。如果变量是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果变量没有设置内容,系统输出空字符串。如果是’boy阿三’,系统会把email格式中不允许的东西去除,输出’boy’。
$email = ‘boy@163.com’;
echo filter_var($email,
FILTER_SANITIZE_EMAIL);
第三种、PHP filter判断输入的变量的内容是否符合要求
使用函数filter_input。第一个参数表示从那里获得的数据,INPUT_POST表示通过POST方法传递过来,还可以使用INPUT_GET, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV,代表相应的途径。第二个参数就是数据的名称。第三个参数代表过滤的要求,FILTER_VALIDATE_EMAIL表示判断数据是否符合email格式。
假设通过表单的POST过来的一个字段email。如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy’,就会输出false。如果没有填写表单中的email字段,系统输出null,也就是空。
echo filter_input(INPUT_POST,
‘email’, FILTER_VALIDATE_EMAIL);
第四种、PHP filter根据要求过滤输入的变量的内容
和上面唯一的不同是第二个参数使用FILTER_SANITIZE_EMAIL,输出的结果会不同。假设通过表单的POST过来的一个字段email。
如果是类似’boy@163.com’的数据,系统就会完整的输出’boy@163.com’。如果是错误的格式,比如’boy-afds3′,只要是数字和字母和划线等email格式中可以出现的内容,系统同样会完整的输出’boy-afds3′。如果没有填写表单中的email字段,系统输出null,也就是空。如果是’boy阿三’源码天空,系统会把email格式中不允许的东西去除,输出’boy’。
echo filter_input
(INPUT_POST, ‘email’,
FILTER_SANITIZE_EMAIL);
以上就是PHP filter的具体功能介绍,希望对又需要的朋友有所帮助。
来自:http://www.codesky.net/article/200912/140526.html
阅读全文
用PHP的方法shell的awk方法把QQ号码后两位屏蔽为*的方法
Php/Js/Shell/Go jackxiang 2010-11-9 14:55
方法零,直接截取:
方法一,替换:
方法二,正则匹配:
php reg.php
Array
(
[0] => Array
(
[0] => 372647693
)
[1] => Array
(
[0] => 3726476
)
)
取array的下标1即是$out3[1][0]后,加上**,即可!
方法2:
php reg.php
3726476**
方法3:
php reg.php
3726476**
shell的awk方法实现:
方法一,替换:
方法二,正则匹配:
php reg.php
Array
(
[0] => Array
(
[0] => 372647693
)
[1] => Array
(
[0] => 3726476
)
)
取array的下标1即是$out3[1][0]后,加上**,即可!
方法2:
<?php
$st['FQQ']='372647693';
$parttern="/^(\d)(\d+)(\d{2})$/";
$replace="\$1$2**";
$qq=preg_replace($parttern,$replace,$st['FQQ']);
echo $qq;
?>
$st['FQQ']='372647693';
$parttern="/^(\d)(\d+)(\d{2})$/";
$replace="\$1$2**";
$qq=preg_replace($parttern,$replace,$st['FQQ']);
echo $qq;
?>
php reg.php
3726476**
方法3:
<?php
$qq="372647693";
$result = preg_replace('/^(.+).{2}$/', '\1**', $qq);
echo $result;
?>
$qq="372647693";
$result = preg_replace('/^(.+).{2}$/', '\1**', $qq);
echo $result;
?>
php reg.php
3726476**
shell的awk方法实现:
cat xyz_zizuan.txt |awk '{print substr($1,1,length($1)-2) "**"}' > xyz_zizuan2.txt
[实践OK]shell年月日时分秒日志封装函数有必要,一行实现输出shell的年月日时分秒[2019/06/18 11:23:55],shell时间,shell创建文件,linux shell编写以日期时间为文件名的脚本学习笔记
Php/Js/Shell/Go jackxiang 2010-10-28 17:14
echo [$(date +%Y/%m/%d\ %H:%M:%S)]
[2019/06/18 11:23:55]
sh funlog.sh
[2019/06/18 11:28:32]: INFO a message
=============================================================================
shell时间:
会生成俩文件:
/root/test_logtime.2819:26
来源:http://liubin.blog.51cto.com/282313/166927
[2019/06/18 11:23:55]
sh funlog.sh
[2019/06/18 11:28:32]: INFO a message
=============================================================================
shell时间:
a=`date +%Y%m%d`
echo $a;
echo $a;
# sh data.sh
20101028
20101028
#!/bin/sh
#log
MYDATE=`date +%d%m%y`
#append MYDATE to the variable LOGFILE that holds the actual filename of the log
LOGFILE=/root/test_log.$MYDATE
#create the file
>$LOGFILE
MYTIME=`date +%d%R`
LOGFILE2=/root/test_logtime.$MYTIME
#create the file
>$LOGFILE2
#log
MYDATE=`date +%d%m%y`
#append MYDATE to the variable LOGFILE that holds the actual filename of the log
LOGFILE=/root/test_log.$MYDATE
#create the file
>$LOGFILE
MYTIME=`date +%d%R`
LOGFILE2=/root/test_logtime.$MYTIME
#create the file
>$LOGFILE2
会生成俩文件:
ls /root/test_log.281010
/root/test_log.281010ls /root/test_logtime.2819:26
/root/test_logtime.2819:26
来源:http://liubin.blog.51cto.com/282313/166927
[个人原创]Linux vim 查看16进制之:%!xxd,XXd hexdump 查看16进制的方法,配合vi使用更棒
Php/Js/Shell/Go jackxiang 2010-10-20 11:23
[~/shell]# xxd -g 1 concat.sh
-g 1,2:1和2的区别就是:1 2分别是:66 6669 明白了吧,呵呵!
主要用途:可以用来查看PHP在windows下的utf8记事本编码的bom,会导致session,cookie,输出图片出现异常的bom,大名鼎鼎啊,ef bb bf 就是utf-8 bom,如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
如,注意efbb这个就是bom啦:
[~/shell]# hexdump bom.txt -C
00000000 ef bb bf 64 66 64 66 64 0a |...dfdfd.|
---------------------------------------------------------------------------------------------------------------------------------------------
[~/shell]# xxd -g 2 bom.txt
0000000: efbb bf64 6664 6664 0a ...dfdfd.
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
vi在linux下查看16进制文件的方法。
xxd
Creates a hex dump of the given file; it can also do the
reverse, so it can be used for binary patching
用法很简单:
在vi的命令状态下
:%!xxd ——将当前文本转换为16进制格式。(实践OK,但在windows下还是wxHexEditor界面打开好用)
:%!xxd -r ——将当前文件转换回文本格式。
于是乎:
将当前文本转换为16进制格式,Vi命令行模式,输入:
:%!xxd
将当前文件转换回文本格式,Vi命令行模式,输入:
:%!xxd -r
哈哈,就在这一转16进制后又转回来的时候,你就发现bom,露出了原型,0000000: efbb bfef bbbf 6466 6466 640a ......dfdfd.到转回来后出现<feff>dfdfd,哈哈哈哈,原形毕露了吧!
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[~/shell]# xxd -g 1 test.sh
0000000: 66 69 6c 65 6e 61 6d 65 3d 24 31 0a 73 74 72 69 filename=$1.stri
0000010: 6e 67 31 3d 65 78 69 73 74 0a 73 74 72 69 6e 67 ng1=exist.string
0000020: 32 3d 78 69 0a 63 6f 6d 6d 61 6e 64 3d 22 63 61 2=xi.command="ca
0000030: 74 20 24 66 69 6c 65 6e 61 6d 65 20 7c 20 67 72 t $filename | gr
0000040: 65 70 20 24 73 74 72 69 6e 67 31 20 7c 20 67 72 ep $string1 | gr
0000050: 65 70 20 24 73 74 72 69 6e 67 32 22 0a 65 76 61 ep $string2".eva
0000060: 6c 20 24 63 6f 6d 6d 61 6e 64 0a l $command.
---------------------------------------------------------------------------------------------------------------------------------------------
[~/shell]# xxd -g 2 test.sh
0000000: 6669 6c65 6e61 6d65 3d24 310a 7374 7269 filename=$1.stri
0000010: 6e67 313d 6578 6973 740a 7374 7269 6e67 ng1=exist.string
0000020: 323d 7869 0a63 6f6d 6d61 6e64 3d22 6361 2=xi.command="ca
0000030: 7420 2466 696c 656e 616d 6520 7c20 6772 t $filename | gr
0000040: 6570 2024 7374 7269 6e67 3120 7c20 6772 ep $string1 | gr
0000050: 6570 2024 7374 7269 6e67 3222 0a65 7661 ep $string2".eva
0000060: 6c20 2463 6f6d 6d61 6e64 0a l $command.
---------------------------------------------------------------------------------------------------------------------------------------------
当然你也可以这样:
[~/shell]# hexdump test.sh -C
00000000 66 69 6c 65 6e 61 6d 65 3d 24 31 0a 73 74 72 69 |filename=$1.stri|
00000010 6e 67 31 3d 65 78 69 73 74 0a 73 74 72 69 6e 67 |ng1=exist.string|
00000020 32 3d 78 69 0a 63 6f 6d 6d 61 6e 64 3d 22 63 61 |2=xi.command="ca|
00000030 74 20 24 66 69 6c 65 6e 61 6d 65 20 7c 20 67 72 |t $filename | gr|
00000040 65 70 20 24 73 74 72 69 6e 67 31 20 7c 20 67 72 |ep $string1 | gr|
00000050 65 70 20 24 73 74 72 69 6e 67 32 22 0a 65 76 61 |ep $string2".eva|
00000060 6c 20 24 63 6f 6d 6d 61 6e 64 0a |l $command.|
0000006b
今天,在写shell的时候,需要读取一个sh文件的内容,然后给予拼接字符串后执行这个字符串,出现换行的情况,于是,经过苦心查找,原来是读取vi编辑文件的后面有换行符,通过php的trim对其做了处理,OK,以前一直没有注意,原来Linux的vi一直都在干这个事情,哈哈哈,特别写下这个记录!
----------------------------------------------------------------------------------------------------------------------------------------------------
Linux下vi一个jackxiang.txt,然后,sz下来,用编辑器:FlexHEX.ext打开Jackxiang.txt,换行符的查看:
换行符(\n) 相当于ASCII 换行字符(十六进制0A),
因此,在文本模式下打开的文件作为新行字符读入CR/LF 对,并且作为CR/LF 写入新行字符。
原来是vi编辑器自己在行尾加了个\n换行符。用od命令可看的很清楚:od -A d -t c jackxiang.txt
PHP用trim去掉换行符,即可! "\n" (ASCII 10 (0x0A)), a new line (line feed).
阅读全文
----------------------------------------------------------------------------------------------------------------------------------------------------
Linux下vi一个jackxiang.txt,然后,sz下来,用编辑器:FlexHEX.ext打开Jackxiang.txt,换行符的查看:
16进制:6A 61 63 6B 78 69 61 6E 67 0A
原文:jackxiang
原文:jackxiang
换行符(\n) 相当于ASCII 换行字符(十六进制0A),
因此,在文本模式下打开的文件作为新行字符读入CR/LF 对,并且作为CR/LF 写入新行字符。
原来是vi编辑器自己在行尾加了个\n换行符。用od命令可看的很清楚:od -A d -t c jackxiang.txt
Onecent:/usr/local/tads/htdocs/*****_2010/bin # od -A d -t c jackxiang.txt
0000000 j a c k x i a n g \n
0000010
0000000 j a c k x i a n g \n
0000010
PHP用trim去掉换行符,即可! "\n" (ASCII 10 (0x0A)), a new line (line feed).
阅读全文
[个人原创]awk取得绝对路径和文件名拼接的方法
Php/Js/Shell/Go jackxiang 2010-9-21 17:19
原因很简单,需要某个目录下的shell文件同时推到后台执行:
引申:
结果如下:
TTTTT:/usr/local/tads/htdocs/*/data/20100920 #
导入到文件:
其实际在shell编程过程中,往往需要用到绝对地址的时候,就不用这个,如下:
路径已经在里面了!
awk -v var=$(pwd) 'BEGIN{print var}'
引申:
ls -lart GrepQQCommand_*|awk -v PWD=$PWD '{print PWD "/" $9}'
结果如下:
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ak
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef
TTTTT:/usr/local/tads/htdocs/*/data/20100920 #
ls -lart GrepQQCommand_*|awk -v PWD=$PWD '{print "nohup sh " PWD "/" $9 "&"}'
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ak&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef&
导入到文件:
s -lart GrepQQCommand_*|awk -v PWD=$PWD '{print "nohup sh " PWD "/" $9 "&"}' > ccc.sh
然后:sh ccc.sh即可。其实际在shell编程过程中,往往需要用到绝对地址的时候,就不用这个,如下:
ls -lart /usr/local/tads/htdocs/*****_2010/data/20100921/GrepQQCommand_*
-rwxrwxrwx 1 root users 284064 Sep 22 15:39 /usr/local/tads/htdocs/*****_2010/data/20100921/GrepQQCommand_aa
-rwxrwxrwx 1 root users 284064 Sep 22 15:39 /usr/local/tads/htdocs/*****_2010/data/20100921/GrepQQCommand_aa
路径已经在里面了!
比序列化反序列化快的var_export 存入DB后反回位数组的方法
Php/Js/Shell/Go jackxiang 2010-8-11 10:52
版权归膘哥,来源:
膘叔(19129540) 10:45:16
var_export后是存成字符串了。
接合swoole实践:
输出:
curl http://127.0.0.1:9501/abc
Swoole\Http\Request::__set_state(array(
'fd' => 1,
'header' =>
array (
'user-agent' => 'curl/7.29.0',
'host' => '127.0.0.1:9501',
'accept' => '*/*',
),
'server' =>
array (
'request_method' => 'GET',
'request_uri' => '/abc',
'path_info' => '/abc',
'request_time' => 1649747144,
'request_time_float' => 1649747144.16464,
'server_protocol' => 'HTTP/1.1',
'server_port' => 9501,
'remote_port' => 62006,
'remote_addr' => '127.0.0.1',
'master_time' => 1649747143,
),
'cookie' => NULL,
'get' => NULL,
'files' => NULL,
'post' => NULL,
'tmpfiles' => NULL,
))
Hello, world!
回忆未来(372647693) 10:58:07
最后,═ 云下遮雨 11:28:47 给出了个解决方案:
eval( '$c='.$b.';');
eval( "\$c={$b};" );
eval( "\$c=".$b.";" );
我尝试了一下,确实还回位原来的数组了,代码如下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
指出了膘哥的一个小错误:
═ 云下遮雨 11:38:46
eval( "\$c=\$b" ); 这样就是错的,相当于 $c=$b
膘叔(19129540) 10:45:16
$a = array (1, 2, array ("a", "b", "c"));
$b = var_export ($a,TRUE);
eval( "\$c=\$b;" );
echo '<pre>';
print_r( $c );
echo '</pre>';
膘叔(19129540) 10:45:35$b = var_export ($a,TRUE);
eval( "\$c=\$b;" );
echo '<pre>';
print_r( $c );
echo '</pre>';
var_export后是存成字符串了。
接合swoole实践:
输出:
curl http://127.0.0.1:9501/abc
Swoole\Http\Request::__set_state(array(
'fd' => 1,
'header' =>
array (
'user-agent' => 'curl/7.29.0',
'host' => '127.0.0.1:9501',
'accept' => '*/*',
),
'server' =>
array (
'request_method' => 'GET',
'request_uri' => '/abc',
'path_info' => '/abc',
'request_time' => 1649747144,
'request_time_float' => 1649747144.16464,
'server_protocol' => 'HTTP/1.1',
'server_port' => 9501,
'remote_port' => 62006,
'remote_addr' => '127.0.0.1',
'master_time' => 1649747143,
),
'cookie' => NULL,
'get' => NULL,
'files' => NULL,
'post' => NULL,
'tmpfiles' => NULL,
))
Hello, world!
回忆未来(372647693) 10:58:07
<?php
$a = array (1, 2, array ("a", "b", "c"));
$b = var_export ($a,TRUE);
eval( "\$c=\$b;" );
var_dump($c);
$a = array (1, 2, array ("a", "b", "c"));
$b = var_export ($a,TRUE);
eval( "\$c=\$b;" );
var_dump($c);
string(94) "array (
0 => 1,
1 => 2,
2 =>
array (
0 => 'a',
1 => 'b',
2 => 'c',
),
)"
是个string啊。。。0 => 1,
1 => 2,
2 =>
array (
0 => 'a',
1 => 'b',
2 => 'c',
),
)"
最后,═ 云下遮雨 11:28:47 给出了个解决方案:
eval( '$c='.$b.';');
eval( "\$c={$b};" );
eval( "\$c=".$b.";" );
我尝试了一下,确实还回位原来的数组了,代码如下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<?php
$a = array (1, 2, array ("a", "b", "c"));
$b = var_export ($a,TRUE);
//eval( "\$c=".$b.";" );
eval( "\$c={$b};" );
print_r($c);
//print_r( $c );
?>
$a = array (1, 2, array ("a", "b", "c"));
$b = var_export ($a,TRUE);
//eval( "\$c=".$b.";" );
eval( "\$c={$b};" );
print_r($c);
//print_r( $c );
?>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[~]# php var_export.php
Array
(
[0] => 1
[1] => 2
[2] => Array
(
[0] => a
[1] => b
[2] => c
)
)
Array
(
[0] => 1
[1] => 2
[2] => Array
(
[0] => a
[1] => b
[2] => c
)
)
指出了膘哥的一个小错误:
═ 云下遮雨 11:38:46
eval( "\$c=\$b" ); 这样就是错的,相当于 $c=$b
写js代码的时候特别注意指明输出浏览器的编码和页面保存编码一致,否则报错
Php/Js/Shell/Go jackxiang 2010-4-7 10:59
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<script type="text/javascript">
var arr2 = [];
var str = "篮球,排球,乒乓球";
arr2 = str.split(",");
alert(arr2[0]);
</script>
</head>
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<script type="text/javascript">
var arr2 = [];
var str = "篮球,排球,乒乓球";
arr2 = str.split(",");
alert(arr2[0]);
</script>
</head>
如果设置:
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
在ie8下报错( var str = "篮球,排球,乒乓球"; ),Firefox下没有问题(输出:绡悆),其实也是默认输出gbk的,但是不报错,为此,我们必须统一为utf8后,就可以在两种浏览器下显示出篮球了,哈哈哈
--------
编码不一致,往往容易出现一些莫名其妙的报错,我们往往发现写对了但是就是不知道啥原因,那你可能就可得查查你的js文件的编码和浏览器输出的编码是否一致了。
[实践OK]用php实现上传文件时显示进度条(保证可以运行),用PHP Session和Javascript实现文件上传进度条。
Php/Js/Shell/Go jackxiang 2010-3-15 17:40
本来这篇文章早应该写了,由于其他原因一直没有时间完成。这两天抽空写了一个简单的版本,发出来大家一块学习吧。阅读全文
[简单技巧]阅读了下MVC框架渲染html的了部分代码,觉得用PHP extract() 函数可能更加好一些:PHP中extract()函数的妙用。
Php/Js/Shell/Go jackxiang 2010-3-11 11:47
拜读了一下:TMView**.class.php里面的:
foreach($vars as $key => $value)
{
$$key=$value; //借尸还魂的运用:把controller层的塞入的变量又给还原回来
}
其实可以改写为一行:
特别的地方,其实这个函数还考虑到了防止变量覆盖问题,可以有参数的喔:
$a就没有被覆盖,同时可以通过函数第3个参数:dup,配合_a: $dup_a=cat了,有规律可循,操作更加灵活!
输出:
compact() 它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。
结果,经过处理后,$result 为:
——————————————————————————————————————————————————————————
PHP中extract()函数的妙用
背景:在看一哥们写代码时,发现多了一个data变量,通过zend编辑器看这变量一直没找到,原来是
早些时候在看一框架关于POST的代码时,看到一个非常好用的函数:extract(),
它的主要作用是将数组展开,键名作为变量名,元素值为变量值,
可以说为数组的操作提供了另外一个方便的工具,
比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交上来的内容不能不用一一赋值,直接使用下面代码:
form.html
在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php
是不是很方便呢?呵呵,下面是PHP手册里的详细解释:
extract
(PHP 4, PHP 5)
extract — 从数组中将变量导入到当前的符号表
说明
int extract ( array $var_array [, int $extract_type [, string $prefix ]] )
本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。
Note: 自版本 4.0.5 起本函数返回被提取的变量数目。
Note: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引进的。
Note: EXTR_REFS 是版本 4.3.0 中引进的。
extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:
EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。
注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
extract() 返回成功导入到符号表中的变量数目。
Warning
不要对不能信任的数据使用 extract(),例如用户的输入($_GET,…)。如果这样做,举例说,要临时运行依赖于 register_globals 的老代码,要确保使用不会覆盖的 extract_type 值,例如 EXTR_SKIP,并且要留意应该按照 php.ini 中由 variables_order 定义的顺序来提取。
extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。
Example#1 extract() 例子
$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $wddx_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $wddx_color,$wddx_size 和 $wddx_shape。
必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。
来自:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0723/3090.html
foreach($vars as $key => $value)
{
$$key=$value; //借尸还魂的运用:把controller层的塞入的变量又给还原回来
}
其实可以改写为一行:
extract($vars);
特别的地方,其实这个函数还考虑到了防止变量覆盖问题,可以有参数的喔:
<?php
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, 'dup');
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;";
?>
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, 'dup');
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;";
?>
$a就没有被覆盖,同时可以通过函数第3个参数:dup,配合_a: $dup_a=cat了,有规律可循,操作更加灵活!
输出:
$a = Original; $b = Dog; $c = Horse; $dup_a = Cat;
compact() 它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。
结果,经过处理后,$result 为:
——————————————————————————————————————————————————————————
PHP中extract()函数的妙用
背景:在看一哥们写代码时,发现多了一个data变量,通过zend编辑器看这变量一直没找到,原来是
早些时候在看一框架关于POST的代码时,看到一个非常好用的函数:extract(),
它的主要作用是将数组展开,键名作为变量名,元素值为变量值,
可以说为数组的操作提供了另外一个方便的工具,
比方说,可以很方便的提取$_POST或者$_GET的元素,对表单提交上来的内容不能不用一一赋值,直接使用下面代码:
form.html
在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php
是不是很方便呢?呵呵,下面是PHP手册里的详细解释:
extract
(PHP 4, PHP 5)
extract — 从数组中将变量导入到当前的符号表
说明
int extract ( array $var_array [, int $extract_type [, string $prefix ]] )
本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。
Note: 自版本 4.0.5 起本函数返回被提取的变量数目。
Note: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引进的。
Note: EXTR_REFS 是版本 4.3.0 中引进的。
extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:
EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。
EXTR_SKIP
如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME
如果有冲突,在变量名前加上前缀 prefix 。
EXTR_PREFIX_ALL
给所有变量名加上前缀 prefix 。自 PHP 4.0.5 起这也包括了对数字索引的处理。
EXTR_PREFIX_INVALID
仅在非法/数字的变量名前加上前缀 prefix 。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS
仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS
仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS
将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
如果没有指定 extract_type ,则被假定为 EXTR_OVERWRITE。
注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
extract() 返回成功导入到符号表中的变量数目。
Warning
不要对不能信任的数据使用 extract(),例如用户的输入($_GET,…)。如果这样做,举例说,要临时运行依赖于 register_globals 的老代码,要确保使用不会覆盖的 extract_type 值,例如 EXTR_SKIP,并且要留意应该按照 php.ini 中由 variables_order 定义的顺序来提取。
extract() 的一种可能用法是将 wddx_deserialize() 返回的结合数组中的内容导入到符号表变量中去。
Example#1 extract() 例子
$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $wddx_size 也不会被建立。EXTR_OVERWRITE 将使 $size 的值为“medium”,EXTR_PREFIX_ALL 将建立新变量 $wddx_color,$wddx_size 和 $wddx_shape。
必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID。
来自:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0723/3090.html