PHP数组适用unset删除重建索引
1.unset删除元素后不会重建数组的索引。
array_values()可以实现索引重建
阅读全文...
用thinkphp编写的带有form表单的页面,如果你打开两次同一个表单,以第一次找开的提交信息,他就会提示你“表单令牌错误”的信息!
解决办法:
阅读全文...
如果你使用jquery的form表单中serialize提交数据到后台,例如:$('#form').serialize()。在php处理端你不用任何处理,跟普通的from提交一样,使用$_GET[‘varname’]或$_POST[‘varname’]就能取到数据。
jquery里form的serialize实际是只是把表单中的数据组装成"varname=val&var2=val2"这种样子,看到这个你应该知道PHP端不需要处理了吧。
//以下代码实现从客户端获取IP,操作系统,浏览器的信息
class clientGetObj //类
{
function getBrowse() //取浏览器版本函数
{
global $_SERVER;
if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 8.0"))
return "Internet Explorer 8.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 7.0"))
return "Internet Explorer 7.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 6.0"))
return "Internet Explorer 6.0";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/3"))
return "Firefox 3";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/2"))
return "Firefox 2";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome"))
return "Google Chrome";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Safari"))
return "Safari";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Opera"))
return "Opera";
else return "未知";
}
function getIP () //取IP函数
{
global $_SERVER;
if (getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
} else if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} else if (getenv('REMOTE_ADDR')) {
$ip = getenv('REMOTE_ADDR');
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
function getOS () //取操作系统类型函数
{
global $_SERVER;
$agent = $_SERVER['HTTP_USER_AGENT'];
$os = false;
if (eregi('win', $agent) && strpos($agent, '95')){
$os = 'Windows 95';
}
else if (eregi('win 9x', $agent) && strpos($agent, '4.90')){
$os = 'Windows ME';
}
else if (eregi('win', $agent) && ereg('98', $agent)){
$os = 'Windows 98';
}
else if (eregi('win', $agent) && eregi('nt 5.1', $agent)){
$os = 'Windows XP';
}
else if (eregi('win', $agent) && eregi('nt 5', $agent)){
$os = 'Windows 2000';
}
else if (eregi('win', $agent) && eregi('nt', $agent)){
$os = 'Windows NT';
}
else if (eregi('win', $agent) && ereg('32', $agent)){
$os = 'Windows 32';
}
else if (eregi('linux', $agent)){
$os = 'Linux';
}
else if (eregi('unix', $agent)){
$os = 'Unix';
}
else if (eregi('sun', $agent) && eregi('os', $agent)){
$os = 'SunOS';
}
else if (eregi('ibm', $agent) && eregi('os', $agent)){
$os = 'IBM OS/2';
}
else if (eregi('Mac', $agent) && eregi('PC', $agent)){
$os = 'Macintosh';
}
else if (eregi('PowerPC', $agent)){
$os = 'PowerPC';
}
else if (eregi('AIX', $agent)){
$os = 'AIX';
}
else if (eregi('HPUX', $agent)){
$os = 'HPUX';
}
else if (eregi('NetBSD', $agent)){
$os = 'NetBSD';
}
else if (eregi('BSD', $agent)){
$os = 'BSD';
}
else if (ereg('OSF1', $agent)){
$os = 'OSF1';
}
else if (ereg('IRIX', $agent)){
$os = 'IRIX';
}
else if (eregi('FreeBSD', $agent)){
$os = 'FreeBSD';
}
else if (eregi('teleport', $agent)){
$os = 'teleport';
}
else if (eregi('flashget', $agent)){
$os = 'flashget';
}
else if (eregi('webzip', $agent)){
$os = 'webzip';
}
else if (eregi('offline', $agent)){
$os = 'offline';
}
else {
$os = 'Unknown';
}
return $os;
}
}
php输出图片可以适用GD组件来进行。
输出英文字母使用 imagestring — 水平地画一行字符串。
<?php
// 建立一幅 100X30 的图像
$im = imagecreate(100, 30);
// 白色背景和蓝色文本
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);
// 把字符串写在图像左上角
imagestring($im, 5, 0, 0, "Hello world! ", $textcolor);
// 输出图像
header("Content-type: image/png");
imagepng($im);
?>
输出中文的时候就不行了,下面的代码就只能输出英文。
<?php
// 建立一幅 100X30 的图像
$im = imagecreate(100, 30);
// 白色背景和蓝色文本
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);
// 把字符串写在图像左上角
imagestring($im, 5, 0, 0, "Hello world! 你好", $textcolor);
// 输出图像
header("Content-type: image/png");
imagepng($im);
?>
翻了下PHP手册,有时候手册是很强大的,就好比闲来无事翻字典,你会多认识好多字一样。
imagettftext — 用 TrueType 字体向图像写入文本,可以先导入中文字体在输出。
<?php
// Set the content-type
header("Content-type: image/png");
// Create the image
$im = imagecreatetruecolor(400, 30);
// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);
// The text to draw
$text = 'Testing...测试';
// Replace path by your own font path
$font = 'yh.ttf';
// Add some shadow to the text
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);
// Add the text
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);
// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>
效果
但要保证php文件是以utf8格式保存的,不然会输出如下乱码,
本函数同时需要 GD 库和 FreeType 库。
原因应该是内部进行了utf8和gbk转码工作,等有机会我再细分析下。
1、通过API获取实时数据
请求地址
http://finance.yahoo.com/d/quotes.csv?s=<股票名称>&f=<数据列选项>
参数
例如 汇率API
http://download.finance.yahoo.com/d/quotes.html?s=USDCNY=X&f=sl1d1t1ba&e=.html
2、通过API获取历史数据
请求地址
http://ichart.yahoo.com/table.csv?s=<string>&a=<int>&b=<int>&c=<int>&d=<int>&e=<int>&f=<int>&g=d&ignore=.csv
参数
一定注意月份参数,其值比真实数据-1。如需要9月数据,则写为08。
3、通过API获取深沪股票数据
雅虎的API是国际性的,支持查询国内沪深股市的数据,但代码稍微变动一下,如浦发银行的代号是:600000.SS。规则是:上海市场末尾加.ss,深圳市场末尾加.sz
| a | Ask | a2 | Average Daily Volume | a5 | Ask Size |
| b | Bid | b2 | Ask (Real-time) | b3 | Bid (Real-time) |
| b4 | Book Value | b6 | Bid Size | c | Change & Percent Change |
| c1 | Change | c3 | Commission | c6 | Change (Real-time) |
| c8 | After Hours Change (Real-time) | d | Dividend/Share | d1 | Last Trade Date |
| d2 | Trade Date | e | Earnings/Share | e1 | Error Indication (returned for symbol changed / invalid) |
| e7 | EPS Estimate Current Year | e8 | EPS Estimate Next Year | e9 | EPS Estimate Next Quarter |
| f6 | Float Shares | g | Day’s Low | h | Day’s High |
| j | 52-week Low | k | 52-week High | g1 | Holdings Gain Percent |
| g3 | Annualized Gain | g4 | Holdings Gain | g5 | Holdings Gain Percent (Real-time) |
| g6 | Holdings Gain (Real-time) | i | More Info | i5 | Order Book (Real-time) |
| j1 | Market Capitalization | j3 | Market Cap (Real-time) | j4 | EBITDA |
| j5 | Change From 52-week Low | j6 | Percent Change From 52-week Low | k1 | Last Trade (Real-time) With Time |
| k2 | Change Percent (Real-time) | k3 | Last Trade Size | k4 | Change From 52-week High |
| k5 | Percebt Change From 52-week High | l | Last Trade (With Time) | l1 | Last Trade (Price Only) |
| l2 | High Limit | l3 | Low Limit | m | Day’s Range |
| m2 | Day’s Range (Real-time) | m3 | 50-day Moving Average | m4 | 200-day Moving Average |
| m5 | Change From 200-day Moving Average | m6 | Percent Change From 200-day Moving Average | m7 | Change From 50-day Moving Average |
| m8 | Percent Change From 50-day Moving Average | n | Name | n4 | Notes |
| o | Open | p | Previous Close | p1 | Price Paid |
| p2 | Change in Percent | p5 | Price/Sales | p6 | Price/Book |
| q | Ex-Dividend Date | r | P/E Ratio | r1 | Dividend Pay Date |
| r2 | P/E Ratio (Real-time) | r5 | PEG Ratio | r6 | Price/EPS Estimate Current Year |
| r7 | Price/EPS Estimate Next Year | s | Symbol | s1 | Shares Owned |
| s7 | Short Ratio | t1 | Last Trade Time | t6 | Trade Links |
| t7 | Ticker Trend | t8 | 1 yr Target Price | v | Volume |
| v1 | Holdings Value | v7 | Holdings Value (Real-time) | w | 52-week Range |
| w1 | Day’s Value Change | w4 | Day’s Value Change (Real-time) | x | Stock Exchange |
| y | Dividend Yield |
. |
Any character except newline. |
\. |
A period (and so on for \*, \(, \\, etc.) |
^ |
The start of the string. |
$ |
The end of the string. |
\d,\w,\s |
A digit, word character [A-Za-z0-9_], or whitespace. |
\D,\W,\S |
Anything except a digit, word character, or whitespace. |
[abc] |
Character a, b, or c. |
[a-z] |
a through z. |
[^abc] |
Any character except a, b, or c. |
aa|bb |
Either aa or bb. |
? |
Zero or one of the preceding element. |
* |
Zero or more of the preceding element. |
+ |
One or more of the preceding element. |
{n} |
Exactly n of the preceding element. |
{n,} |
n or more of the preceding element. |
{m,n} |
Between m and n of the preceding element. |
??,*?,+?,{n}?, etc. |
Same as above, but as few as possible. |
(expr) |
Capture expr for use with \1, etc. |
(?:expr) |
Non-capturing group. |
(?=expr) |
Followed by expr. |
(?!expr) |
Not followed by expr. |
在线php正则检测 http://regexpal.com/
这两天用网站header信息查看工具看了一下头部信息发现如下
http://www.quancha.cn/header/www.quancha.cn.html
HTTP/1.0 200 OK
Date: Wed, 23 Nov 2011 01:27:05 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: ThinkPHP2.1
Set-Cookie: PHPSESSID=q1vvtpiv3s9mo6nmkkvher8bl2; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-cache
其中一行表示用thinkphp开发的这样容易被人利用已知漏洞攻击
去掉方法
话说重写:
网站结构如下:
index.php
source/src_{模块名}.php
template/tpl_{模块名}.php
通过首页统一入口来访问各个模块文件,
比如,最简单的统一入口访问代码:
define('ROOT', dirname(__FILE__));
$mod = isset($_GET['mod']) ? $_GET['mod'] : 'index';
$src = ROOT . 'source/src_' . $mod . '.php' ;
$tpl = ROOT . 'template/src_' . $mod . '.php' ;
file_exists($src) && include($src) ;
file_exists($tpl) && include($tpl) ;
现在访问一个地址:index.php?mod=news ;则会访问source/src_news.php 文件。
现在要让url重写,访问 /news 这个url能实现一样的效果,
Linux下的Apache和Nginx,
windows下的ISAPI_Rewrite模块重写,
重写要求,如果我访问的是不存在的文件,重定向到index.php,通过获取实际访问的url,来判断该调用哪个文件,如果我访问 /news?page=1 这个URL,重定向后:
三个服务器访问后的结果:
Apache 关于开启rewrite模块后,会产生三个头部:
$_SERVER['REDIRECT_STATUS'] => 200 (证明重写成功)
$_SERVER['REDIRECT_QUERY_STRING'] => page=1
$_SERVER['REDIRECT_URL'] => /news
而IIS的rewrite模块重写后,会有
$_SERVER['REDIRECT_STATUS'] => 200
$_SERVER['HTTP_X_REWRITE_URL'] => /news
Nginx重写后有:
$_SERVER['REDIRECT_STATUS'] => 200
所以,如果采用 $_SERVER['REDIRECT_URL'] 或 $_SERVER['HTTP_X_REWRITE_URL']都是不可取的,因为Nginx重写后,不产生重写URL,三个服务器并没有交集,如果还考虑其他服务器比如 lighttpd,cheroke等,可能产生的头部更加不一致。
通常需要考虑的就是PHP的 $_SERVER['REQUEST_URI']
现在看看这几个服务器产生的 REQUEST_URI是否一致:
apache下:
$_SERVER['REQUEST_URI'] => /news
Nginx下:
$_SERVER['REQUEST_URI'] => /news
IIS下:
$_SERVER['REQUEST_URI'] => /index.php/news
这他妈是怎么回事?干嘛加个/index.php这个玩意呢?我没有搞懂,不过IIS的重写不完全支持.htaccess语法,所以,不知道是否是我配置的问题,但是我绞尽脑汁也弄不掉这个/index.php
所以,干脆用IIS专用的 $_SERVER['HTTP_X_REWRITE_URL'] 来替换 $_SERVER['REQUEST_URI']
暂时世界清静了。
要提取完整的重写后的URL地址,还没这么简单,需要考虑子目录下重写的情况,下回放出完整的无bug的提取重写url的函数,依靠此函数,将函数分割,然后形成$controller, $action .. 等参数