代码片段:


输出:
From main function:
10
jackxiang
From fun function:
4
jackxiang

此例说明:在函数中,数组参数退化为指针,所以函数fun中的sizeof(a)的内容永远输出为4。
平时我们爱使用Curl来实现Http协议的接口调试,包括Post,Get,Etc。
然而,近来发现Suse enterprise sp2的64位机上没有这个Curl的PHP扩展,
于是,想了想,我使用了PHP的方法来实现了对其它接口的访问,包括Cookie头的发送,简单Demo如下:
vi file_get_contents.php


接收简单Demo代码,test3.php:

测试结果:

root@172.25.38.**:/home/jackxiang/php# php file_get_contents.php                

得证。EOF
                                            
突然问道让你回答:PHP除开Post,Get外还有什么提交方式?
相册-耀京-腾讯(50314234)  16:35:28
cookie
博客-武建(569676660)  16:35:59
socket
RD-解超-赶集(75744317)  16:36:11
socket应该是正解吧。。。
博客-路人甲(285882507)  16:36:14
SESSION
-----
蒙了,下来才想起,经常调试Flash图片的上传流不就是一个非Get,非Post的方式嘛。
HTTP_RAW_POST_DATA PHP输入流


越来越发现缺少思考,或者说总结归纳不够罢。
====================================================================

来处网上 http://www.5iphp.com/zh-hans/content/483.html:
通过Flash POST 图片的二进制数据给php,由php生成图片保存。

开始想到用$_POST来接受。后来发现行不通。
查阅了很多资料 明白了所以然,这里做一个笔记:

于PHP默认只识别application/x-www.form-urlencoded标准的数据类型。
因此,对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析,如果用$_POST数组来接收就会失败!
故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。

另外还有一项 php://input 也可以实现此这个功能

php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype="multipart/form-data"。

我在Flash中使用JPGEncoder把BitMapData转成二进制,然后post给php

php页面代码如下:

http://www.jackxiang.com/post/4411/
务必参考:http://www.perfgeeks.com/?p=150

时间上面的文章如下,可能根据实际情况做下代码变通:
在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input

对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。

“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.
翻译过来,是这样:
“php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”
我们应该怎么去理解这段概述呢?!我把它划分为三部分,逐步去理解。

    读取POST数据
    不能用于multipart/form-data类型
    php://input VS $HTTP_RAW_POST_DATA

读取POST数据

PHPer们一定很熟悉$_POST这个内置变量。$_POST与php://input存在哪些关联与区别呢?另外,客户端向服务端交互数据,最常用的方法除了POST之外,还有GET。既然php://input作为PHP输入流,它能读取GET数据吗?这二个问题正是我们这节需要探讨的主要内容。
经验告诉我们,从测试与观察中总结,会是一个很凑效的方法。这里,我写了几个脚本来帮助我们测试。

@file 172.25.38.70:/phpinput_server.php 打印出接收到的数据
@file 172.25.38.70:/phpinput_post.php 模拟以POST方法提交表单数据
@file 172.25.38.70:/phpinput_xmlrpc.php 模拟以POST方法发出xmlrpc请求.
@file 172.25.38.70:/phpinput_get.php 模拟以GET方法提交表单表数

phpinput_server.php与phpinput_post.php






我们可以通过使用工具ngrep抓取http请求包(因为我们需要探知的是php://input,所以我们这里只抓取http Request数据包)。我们来执行测试脚本phpinput_post.php
结果:
HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:00:58 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 175
Connection: close
Content-Type: text/html; charset=utf-8

-------$_POST------------------
array(2) {
  ["name"]=>
  string(9) "jackxiang"
  ["idnum"]=>
  string(4) "7788"
}

-------php://input-------------
name=jackxiang&idnum=7788

仔细观察,我们不难发现
1,$_POST数据,php://input 数据与httpd entity body数据是“一致”的
2,http请求中的Content-Type是application/x-www-form-urlencoded ,它表示http请求body中的数据是使用http的post方法提交的表单数据,并且进行了urlencode()处理。


我们再来看看脚本phpinput_xmlrpc.php的原文件内容,它模拟了一个POST方法提交的xml-rpc请求。




结果如下:
HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 03:56:41 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 151
Connection: close
Content-Type: text/html; charset=utf-8


-------$_GET------------------
array(0) {
}

-------php://input-------------
<?xml version="1.0"> <methodcall> <name>jt_userinfo</name> </methodcall>


同样,我样也可以很容易地发现:
1,http请求中的Content-Type是text/xml。它表示http请求中的body数据是xml数据格式。
2,服务端$_POST打印出来的是一个空数组,即与http entity body不一致了。这跟上个例子不一样了,这里的Content-Type是text/xml,而不是application/x-www-form-urlencoded
3,而php://input数据还是跟http entity body数据一致。也就是php://input数据和$_POST数据不一致了。

我们再来看看通过GET方法提交表单数据的情况,php://input能不能读取到GET方法的表单数据?在这里,我们稍加改动一下phpinput_server.php文件,将$_POST改成$_GET。







同样,我们执行下一phpinput_get.php测试脚本,它模拟了一个通常情况下的GET方法提交表单数据。
HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 03:59:38 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 149
Connection: close
Content-Type: text/html; charset=utf-8


-------$_GET------------------
array(2) {
  ["name"]=>
  string(9) "jackxiang"
  ["idnum"]=>
  string(4) "7788"
}

-------php://input-------------

比较POST方法提交的http请求,通常GET方法提交的请求中,entity body为空。同时,不会指定Content-Type和Content-Length。但是,如果强硬数据http entity body,并指明正确地Content-Type和Content-Length,那么php://input还可是读取得到http entity body数据,但不是$_GET数据。

所根据,上面几个探测,我们可以作出以下总结:
1,Content-Type取值为application/x-www-form-urlencoded时,php会将http请求body相应数据会填入到数组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。(其实,除了该Content-Type,还有multipart/form-data表示数据是表单数据,稍后我们介绍)
2,php://input数据,只要Content-Type不为multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与http entity body部分数据是一致的。该部分相一致的数据的长度由Content-Length指定。
3,仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。
4,php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。

这也帮助我们理解了,为什么xml_rpc服务端读取数据都是通过file_get_contents(‘php://input’, ‘r’)。而不是从$_POST中读取,正是因为xml_rpc数据规格是xml,它的Content-Type是text/xml。

php://input碰到了multipart/form-data

上传文件的时候,表单的写法是这样的

那么,enctype=multipart/form-data这里的意义,就是将该次http请求头部(head)中的Content-Type设置为multipart/form-data。请查阅RFC1867对它的描述。multipart/form-data也表示以POST方法提交表单数据,它还伴随了文件上传,所以会跟application/x-www-form-urlencoded数据格式不一样。它会以一更种更合理的,更高效的数据格式传递给服务端。我们提交该表单数据,并且打印出响应结果,如下:

-------$_POST------------------
array(1) {
  ["n"]=>
  string(9) "jackxiang"
}

-------php://input-------------


同时,我们通过ngrep抓取的相应的http请求数据包如下:
multipart/form-data; boundary=---------------------------7db9cf5042a
-----------------------------7db9cf5042a
Content-Disposition: form-data; name="n"

jackxiang
-----------------------------7db9cf5042a
Content-Disposition: form-data; name="f"; filename="yxp.jpg"
Content-Type: image/bmp

BM�





从响应输出来比对,$_POST数据跟请求提交数据相符,即$_POST = array(‘n’ => ‘perfgeeks’)。这也跟http请求body中的数据相呼应,同时说明PHP把相应的数据填入$_POST全局变量。而php://input输出为空,没有输出任何东西,尽管http请求数据包中body不为空。这表示,当Content-Type为multipart/form-data的时候,即便http请求body中存在数据,php://input也为空,PHP此时,不会把数据填入php://input流。所以,可以确定: php://input不能用于读取enctype=multipart/form-data数据。

我们再比较这次通过ngrep抓取的http请求数据包,我们会发现,最大不同的一点是Content-Type后面跟了boundary定义了数据的分界符,bounday是随机生成的。另外一个大不一样的,就是http entity body中的数据组织结构不一样了。

上一节,我们概述了,当Content-Type为application/x-www-form-urlencoded时,php://input和$_POST数据是“一致”的,为其它Content-Type的时候,php://input和$_POST数据数据是不一致的。因为只有在Content-Type为application/x-www-form-urlencoded或者为multipart/form-data的时候,PHP才会将http请求数据包中的body相应部分数据填入$_POST全局变量中,其它情况PHP都忽略。而php://input除了在数据类型为multipart/form-data之外为空外,其它情况都可能不为空。通过这一节,我们更加明白了php://input与$_POST的区别与联系。所以,再次确认,php://input无法读取enctype=multipart/form-data数据,当php://input遇到它时,永远为空,即便http entity body有数据。
php://input VS $http_raw_post_data

相信大家对php://input已经有一定深度地了解了。那么$http_raw_post_data是什么呢?$http_raw_post_data是PHP内置的一个全局变量。它用于,PHP在无法识别的Content-Type的情况下,将POST过来的数据原样地填入变量$http_raw_post_data。它同样无法读取Content-Type为multipart/form-data的POST数据。需要设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。

把脚本phpinput_server.php改变一下,可以验证上述内容
@php phpinput_post.php
@php phpinput_get.php
@php phpinput_xmlrpc.php
如下:

HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:07:52 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 6
Connection: close
Content-Type: text/html; charset=utf-8

0



HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:07:59 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 6
Connection: close
Content-Type: text/html; charset=utf-8

1



HTTP/1.1 200 OK
Date: Fri, 22 Jul 2011 04:08:26 GMT
Server: Apache/2.0.59 (Unix) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Vary: Accept-Encoding
Content-Length: 6
Connection: close
Content-Type: text/html; charset=utf-8

1


得出的结果输出都是一样的,即都为1,表示php://input和$HTTP_RAW_POST_DATA是相同的。至于对内存的压力,我们这里就不做细致地测试了。有兴趣的,可以通过xhprof进行测试和观察。

以此,我们这节可以总结如下:
1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GET方法提交过来的数据。但是,一般GET方法提交数据时,http request entity body部分都为空。
2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。
学习笔记

1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST
2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA
3,  只有Coentent-Type不为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。
4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。
5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini
6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。
Tags:
现在你想看函数里的变量和值,你只需要在js里某个地输入:debugger; 即可,否则,你要想看变量是不可能的,或者加断点也成。

断点继续运行:F8
单步进入嵌套调用的函数体实现内部:F11
单步跳过:F10
单步退出:Shift+F11

从知道函数入口的函数中嵌套的函数在另外一个文件,可以通过单步进入查看进入后,就能知道另外一个文件的Js文件的名称,知道文件名后是快速解决Js问题的基础,如下图:
点击在新窗口中浏览此图片
阅读全文
其实协议是一个规化,代码是一个实现,久而久之,规划成为了规则,如:RFC协议就是一个大家在开发浏览器必须遵守的协议(http的(RFC 1867):让HTML表单可以提交文件。它对HTML表单的扩展),而也具有开放性,为此,各种程序都可以实现这个协议,程序为协议而生,协议为功能而用,下面我们来实现一个通过PHP的Socket来模拟一次浏览器上传一张图片的提交代码,如下:

模拟浏览器遵循的Http协议发送图片程序,boundary开始时有一个 --,结束时:也有有 --,真正结束后有\r\n\r\n:



PHP接收发送过来的图片程序:


测试返回:

为何出现这样的情况呢?查找代码片段imageaaa,这个修改为file即可,修改后如下所示,上传成功:

说明是Ok的,查下upload目录下,果然是在这个图片的,证明PHP是完全可以通过fsocket来模拟Http上传图片协议来实现浏览器上传的。
阅读全文
写CDB类库的时候,就有一个查询是要求写出一个,具有可变参数个数的函数,类似于sprintf,fsql定义了数据格式,v1, v2等变量定义了要替换的值,然后将替换后的字符串作为数据库查询进行执行.
先举一个实现后的例子:
queryf("select * from glove_user where name = '%s' and site = '%s'", 'glove', 'glovely.info');
这其实就是一个select语句,其中不同的地方就是第一个参数中的name的值%s用后面的’glove’来替换,site的值%s用后面的’glovely.info’来替换,这些可以替换的参数是不限定个数的.
也就是说这个函数像我们用的sprintf一样,是带有不定个数的参数的.阅读全文
我用的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 |
+----+-------------+--------------+-------+----------------------------------------------+----------+---------+------+------+-----------------------------+
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
(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
通过vi的%s/$/;/g 来给一个100M的大文件进行替换,vim赶紧很吃力。
于是通过sed来实现该功能,如下:
sed -i "s/$/;/g" sqlcheckout.sql

或者删除某文件以某字符开头的行:

sed '/^FScoreDetailId/d'  sqlcheckoutResultTestResult.txt
<!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>
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}'

简单示例:
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出现至今,一直在不断的更新版本,增加新的功能,供我们大家使用,满足我们的需求。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 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;
?>


php reg.php
3726476**

方法3:

<?php
$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
[~/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进制格式。
:%!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,换行符的查看:
16进制:6A 61 63 6B 78 69 61 6E 67 0A
原文: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

PHP用trim去掉换行符,即可!  "\n" (ASCII 10 (0x0A)), a new line (line feed).
阅读全文
原因很简单,需要某个目录下的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


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&


导入到文件:

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

路径已经在里面了!
版权归膘哥,来源:
膘叔(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
var_export后是存成字符串了。

回忆未来(372647693)  10:58:07

<?php
$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啊。。。

最后,═ 云下遮雨  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 );

?>








+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


[~]# php var_export.php

Array
(
    [0] => 1
    [1] => 2
    [2] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

)


指出了膘哥的一个小错误:
═ 云下遮雨  11:38:46
eval( "\$c=\$b" ); 这样就是错的,相当于 $c=$b

<!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>



如果设置:
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
在ie8下报错( var str = "篮球,排球,乒乓球"; ),Firefox下没有问题(输出:绡悆),其实也是默认输出gbk的,但是不报错,为此,我们必须统一为utf8后,就可以在两种浏览器下显示出篮球了,哈哈哈

--------
编码不一致,往往容易出现一些莫名其妙的报错,我们往往发现写对了但是就是不知道啥原因,那你可能就可得查查你的js文件的编码和浏览器输出的编码是否一致了。
本来这篇文章早应该写了,由于其他原因一直没有时间完成。这两天抽空写了一个简单的版本,发出来大家一块学习吧。阅读全文
拜读了一下:TMView**.class.php里面的:

    
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就没有被覆盖,同时可以通过函数第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
分页: 17/18 第一页 上页 7 8 9 10 11 12 13 14 15 16 17 18 下页 最后页 [ 显示模式: 摘要 | 列表 ]