日志分类:WEB程序开发

JS编程建议之JS代码在页面中的位置

时间:2014年03月08日作者:小侃评论次数:0

按照传统的做法,所有<script>元素都应该放在页面的<head>元素中,例如:

  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <title>Example HTML Page</title>
  5.         <script type=”text/javascript”></script>
  6.         <script type=”text/javascript”></script>
  7.     </head>
  8.     <body>
  9.          <!– 这里放内容 –>
  10.     </body>
  11. </html>

这种用法的目的就是把所有外部文件(包括CSS文件和JavaScritp文件)的引用都放在相同的地方。可是,在文档的<head>元素中包含所有JavaScritp文件,意味着必须等到全部JavaScript代码都被下载、解析和执行完成以后,才能开始呈现页面的内容(浏览器在遇到<body>时才开始呈现内容)。对于那些很多JavaScritp代码的页面来说,这无疑会导致浏览器在呈现页面时出现明显诞迟,而延迟期间的浏览器窗口中将是一片空白。为了避免这个问题,现代Web应用程序一般都把全部JavaScritp引用放在<body>元素中页面内容的后面,如下例所示:

  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <title>Example HTML Page</title>
  5.     </head>
  6.     <body>
  7.         <!– 这里放内容 –>
  8.         <script type=”text/javascript”></script>
  9.         <script type=”text/javascript”></script>
  10.     </body>
  11. </html>

这样,在解析包含的JavaScrip代码之前,页面的内容将会完全呈现在浏览器中。而用户也会因为浏览器窗口显示空白页面的时间缩短而感到打开页面的速度加快了。

ip to long 原理

时间:2013年08月01日作者:小侃评论次数:0

经常遇到把类似220.12.23.77 这样的ip转换成一个长整数的要求
PHP中还有专门的函数 ip2long    long2ip,

ip to  long 简单算法是这样的

function IpToInt($Ip) {
 $array=explode(‘.’,$Ip);
 $Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];
 return $Int;
}

代码很简单,但是有人不知道为什么要不停的乘以256,我来解释一下子
ip to  long 的过程是这样的,先把ip转为2进制,再把4个2进制数连起来,
再把这个得到的2进制数转为10进制数,就是想要的数。

ip是4字节32位的,255转为2进制就是8个1,11111111,
220    11011100
12       00001100
23      00010111
77      01001101
把这4个连起来 11011100000011000001011101001101
再把它转为10进制,得到3691779917

也可以这样,位操作,道理是一样的
202<<24
96<<16
134<<8
133

探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法

时间:2013年08月01日作者:小侃评论次数:0

【造成原因】:Because PHP’s integer type is signed, and many IP addresses will result in negative integers.
【解决办法】:其官方手册中提到,可以“you need to use the “%u” formatter of sprintf() or printf() to get the string representation of the unsigned IP address”
即,printf( ‘%u’, ip2long( ‘IP地址’ ) );
或者将其先转换为二进制然后在转换为十进制,bindecdecbinip2long( ‘IP地址’ ) ) );
【测试】
$strIp = ‘182.118.0.0’;

echo ip2long($strIp); //此时输出的-1233780736
echo ‘<br/>’;
echo bindec( decbin( ip2long( $strIp ) ) ); // 输出3061186560,与MySQL函数输出一致~

【注】:
number bindec ( string $binary_string ); //二进制转换为十进制
string decbin ( int $number ); //十进制转换为二进制

FreeBSD下安装PHP5

时间:2011年12月17日作者:小侃评论次数:0

本来是一件很简单的事情。

cvsup -gL 2 -h cvsup.freebsd.org /usr/share/examples/cvsup/ports-supfilecd /usr/ports/lang/php5(或者用:/usr/ports/www/mod_php5)make install clean
但是结果却发现pivot无法运行,报一个错误,说是什么函数找不到。google了一下才知道,这个函数在一个叫做pcre(Perl Compatible Regular Expressions)的库提供的。Windows版下的PHP5安装程序中已经默认包含了,但是用ports安装的默认选项是没有包括它的。只好查资 料,反复地把PHP5装了卸,卸了装,但是总是不对,不论是装php5还是装mod_php5(后来看了mod_php5的Makefile,发现它也是 依赖php5的安装的)。也试过用一些选项重新编译Apache几次,始终不管用。这个pcre似乎既不在PHP5里,也不在Apache里。

事实证明它的确不包含在那二者中,而是一个单独的安装。-_-|||

cd /usr/ports/devel/pcremake install cleancd /usr/ports/lang/php5vi Makefile(在其中的CONFIGURE_ARGS=一项末尾增加–with-pcre-regex后保存退出)make install clean
即可使PHP5增加pcre支持。

BTW:安装成功后,pivot仍然出现登录后任何操作都需要重登录的问题,经查,是因为文件权限问题,chmod一下即可。

在线修改php.ini 内容的值

时间:2011年12月17日作者:小侃评论次数:0

临时修改php.ini文件的实现方法:

ini_set(“项目”,”值”);

ini_set(“output_buffering”,”0″);
ob_start();

 

标签:分类:WEB程序开发

php中的输出控制方法

时间:2011年12月17日作者:小侃评论次数:0

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?>

缓冲输出

 

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>

按照php手册里的说法

该函数将当前为止程序的所有输出发送到用户的浏览器。

上面的这段代码,应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后,所有的输出同时呈现出来。

好,我们来改一下这段代码,改成

 

<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>

嘿,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。

我再来改一改。

 

<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();//修改部分
 flush();
 sleep(1);
}
?>

运行一下,是不是发现$i也隔一秒输出一次了?这是为什么呢?
别急,我们来看看php.ini。

打开php.ini,搜索output_buffering,我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样,这个设置的作用就是把输出缓冲一下,缓冲大小为4096bytes.

在我们的第一段代码里,之所以没有按预期的输出,正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束,输出是不会被发送出去的。

而第二段代码中的ob_end_clean()和ob_end_flush()的作用,就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。

第三段代码中,用了一句ob_flush(),它的作用就是把缓冲的数据发送出去,但是并不会终止缓冲,所以它必须在每次flush()前使用。

如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我们就必须把php.ini里的output_buffering设得足够小,例如设为0。需要注意的是,如果你打算在脚本中使用ini_set(”output_buffering”,”0″)来设置,那么请停下来吧,这种方法是不行的。因为在脚本一开始的时候,缓冲设置就已经被载入,然后缓冲就开始了。

可能你会问了,既然ob_flush()是把缓冲的数据发送出去,那么为什么还需要用flush()???直接用下面这段代码不行吗??

 


 

请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。

那是不是flush()在这里就是不可缺少的呢?不是的,我们还有另外一种方法,使得当有数据输出的时候,马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。(当你把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都不需要了)

 

<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?><?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)

{
 echo $i;
 sleep(1);
}
?>

 

请注意看上面的ob_implicit_flush(true),这个函数强制每当有输出的时候,即刻把输出发送到浏览器。这样就不需要每次输出(echo)后,都用flush()来发送到浏览器了。

PHP5中类(CLASS)的新特征

时间:2011年12月17日作者:小侃评论次数:0

php5新添加了好多的新函数和特征,但是在目前最新的chm的手册中都没有体现,要到在线的手册中查找,烦啊!!!

 

废话不多说了,来看看php5中全新的class对比php2的class有什么新的特征。

 

1/ 加了访问权限的控制:使用private/public/protected的特征

 

2/ 加入了接口和抽象类的概念,interface/abstract,可惜的是类的继承还是树形的单继承。

 

3/ 可以定义final 函数,不能在父类中覆盖这个函数

 

4/ 终于可以在类中定义 静态的变量,在php中只能在函数中定义,

 

static $aa = nulll;

另外还提供了 const 方法

const mystatic = ‘aaaaaa’;

 

5/ 新提供了一个self内部方法

echo self::mystatic;

 

6/ 加入了如下的内部特征

__construct()   初始化

__destruct();   卸载

__get();          组织返回类中的某些变量值。

__set();          组织给类中的某些变量值赋值。

__call();         调用不存在的类的函数的时候得处理方法

__clone();        copy对象用

__sleep();        序列化的时候用

__weekup();      反序列的时候用

 

7/ 默认的object的赋值采用了应用的方式,如:

$object2 = $object1

$object2 得到的是$object1的引用,不是在内存中copy副本

 

8/ 提供了 reflection API ,主要用来显示class/function 本省的结构和统计信息,这个是一个全新的东西,很难说清楚,(虽然很强大,但是我个人还是没有找到“这位英雄可以用武的地方”)

 

9/ 对class对象提供了一个枚举的功能,可以用for循环来处理对象中的全局的变量。

 

10/ 提供了一个__autoload();函数,用来自动的加载类声明文件

php导出CSV的方法

时间:2011年12月17日作者:小侃评论次数:0

制作网站时,经常会遇到检索数据列表的情况。通常用户希望下载这些列表数据并存储到客户端。当然下载这些数据的时候是需要固定的格式,以便于用Excel等软件阅览。说的简单一些就是CSV/Excel数据导出 。

注意事项:

输出文档的基本格式为:列1,列2,列3,……,列n\n

格式化数据的同时要对特殊的字符进行过滤。譬如“,”如果不转换为全角“,”会导致数据格式的混乱。

实现方法:

举例:检索数据库表,将结果保存为字符串,进行格式和特殊字符的过滤后,导出到客户端的CSV文件。

OrderSearchEdit_saveCSV.php

<?php
include($_SERVER[’DOCUMENT_ROOT’] . “/ftcart/OrderInfoManager.class.php”);
include($_SERVER[’DOCUMENT_ROOT’] . “/ftcart/CommonUtil.php”);
include($_SERVER[’DOCUMENT_ROOT’] . “/ftcart/CommonConst.php”);
include($_SERVER[’DOCUMENT_ROOT’] . “/ftcart/CommonErrorMsg.php”);
include($_SERVER[’DOCUMENT_ROOT’] . “/webadmin.php”);

$searchcase = new OrderInfoManager();
$nowTime = microtime_float();
$searchcase = unserialize($_SESSION[“ORDER_SEARCH_CASE”]);
$listcsv = $searchcase->doCSV();// 调用doCSV()方法
$filename = $nowTime;
//$filename = str_replace(“:”,””,$nowTime);
//$filename = trim($filename);
//echo $filename;
header(“Content-Disposition: attachment; filename=”.$filename.”.csv”);
header(’Content-Type:APPLICATION/OCTET-STREAM’);
echo “注文No.,注文日,氏名,住所,支払い方法,合計金額,発送 “;
echo $listcsv;
?>
doCSV()方法:

function doCSV(){
global $db;
$nowdate = getNowDateYYYYMMDD();
$SQL = “#####”;
$rs=$db->query($SQL);
$result;
$payment_method;
$delivery_status;
if ((! DB::isError($rs))) {
while ($row = $rs->fetchRow()){
$row = Common_record($row);
if($row[’payment_method_id’]==0){$payment_method=”銀行振り込み”;}
else if($row[’payment_method_id’]==1){$payment_method=”郵便局”;}
else if($row[’payment_method_id’]==2){$payment_method=”代引き”;}
else{$payment_method=””;}

if($row[’actual_send_date’]>$nowdate){$delivery_status=”未発送”;}

 

else if($row[’actual_send_date’]<$nowdate){$delivery_status=”発送済”;}
//格式化并过滤特殊字符
$result .= $row[’order_id’].”,”.
$row[’create_date’].”,”.
$row[’order_first_name’].”  “.
$row[’order_last_name’].”,”.
str_replace(“,”,”,”,$row[’order_address’]).”,”.
$payment_method.”,”.
$row[’amount’].”,”.
$delivery_status.” “;
}
return $result;
}
}

这样就ok啦,在你的导出数据html页面做一个<input type=”button” onclick=”do_CSV()”>然后在JS里面写一个提交form的do_CSV(),并将form action到OrderSearchEdit_saveCSV.php就完成了。应该注意的是由于OrderSearchEdit_saveCSV.php中声明的是一个Content-Type:APPLICATION/OCTET-STREAM所以当前页面不会被刷新。这点可能大家都知道,不过我是刚学到的,所以记录一下。

 

 

标签:,分类:WEB程序开发

PHP的GD库函数一览

时间:2011年12月17日作者:小侃评论次数:0

PHP的GD库函数一览

GetImageSize

作用:取得图片的大小[即长与宽]

用法:array GetImageSize(string filename, array [imageinfo]);

ImageArc

作用:画弧线

用法:int ImageArc(int im, int cx, int cy, int w, int h, int s, int e, int col);

ImageChar

作用:写出横向字符

用法:int ImageChar(int im, int font, int x, int y, string c, int col);

ImageCharUp

作用:写出竖式字符

用法:int ImageCharup(int im, int font, int x, int y, string c, int col);

ImageColorAllocate

作用:匹配颜色

用法:int ImageColorAllocate(int im, int red, int green, int blue);

ImageColorTransparent

作用:指定透明背景色

用法:int ImageColorTransparent(int im, int [col]);

ImageCopyResized

作用:复制新图并调整大小

用法:int ImageCopyResized(int dst_im, int src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int d** srcW, int srcH);

ImageCreate

作用:建立新图

用法:int ImageCreate(int x_size, int y_size);

ImageDashedLine

作用:绘虚线

用法:int ImageDashedLine(int im, int x1, int y1, int x2, int y2, int col);

ImageDestroy

作用:结束图形

用法解释:int ImageDestroy(int im);

ImageFill

作用:图形着色

用法:int ImageFill(int im, int x, int y, int col);

ImageFilledPolygon

作用:多边形区域着色

用法:int ImageFilledPolygon(int im, array points, int num_points, int col);

ImageFilledRectangle

作用:矩形区域着色

用法:int ImageFilledRectangle(int im, int x1, int y1, int x2, int y2, int col);

ImageFillToBorder

作用:指定颜色区域内着色

用法:int ImageFillToBorder(int im, int x, int y, int border, int col);

ImageFontHeight

作用:取得字型的高度

用法:int ImageFontHeight(int font);

ImageFontWidth

作用:取得字型的宽度

用法:int ImageFontWidth(int font);

ImageInterlace

作用:使用交错式显示与否

用法:int ImageInterlace(int im, int [interlace]);

ImageLine

作用:绘实线

用法:int ImageLine(int im, int x1, int y1, int x2, int y2, int col);

ImageLoadFont

作用:载入点阵字型

用法:int ImageLoadFont(string file);

ImagePolygon

作用:绘多边形

用法:int ImagePolygon(int im, array points, int num_points, int col);

ImageRectangle

作用:绘矩形

用法:int ImageRectangle(int im, int x1, int y1, int x2, int y2, int col);

ImageSetPixel

作用:绘点

用法:int ImageSetPixel(int im, int x, int y, int col);

ImageString

作用:绘横式字符串

用法:int ImageString(int im, int font, int x, int y, string s, int col);

ImageStringUp

作用:绘直式字符串

用法:int ImageStringUp(int im, int font, int x, int y, string s, int col);

ImageSX

作用:取得图片的宽度

用法:int ImageSX(int im);

ImageSY

作用:取得图片的高度

用法:int ImageSY(int im);

ImageTTFBBox

作用:计算 TTF 文字所占区域

用法:array ImageTTFBBox(int size, int angle, string fontfile, string text);

ImageTTFText

作用:写 TTF 文字到图中

用法:array ImageTTFText(int im, int size, int angle, int x, int y, int col, string fontfile, string text);

ImageColorAt

作用:取得图中指定点颜色的索引值

用法:int ImageColorAt(int im, int x, int y);

ImageColorClosest

作用:计算色表中与指定颜色最接近者

用法:int ImageColorClosest(int im, int red, int green, int blue);

ImageColorExact

作用:计算色表上指定颜色索引值

用法:int ImageColorExact(int im, int red, int green, int blue);

ImageColorResolve

作用:计算色表上指定或最接近颜色的索引值

用法:int ImageColorResolve(int im, int red, int green, int blue);

ImageColorSet

作用:设定色表上指定索引的颜色

用法:boolean ImageColorSet(int im, int index, int red, int green, int blue);

ImageColorsForIndex

作用:取得色表上指定索引的颜色

用法:array ImageColorsForIndex(int im, int index);

ImageColorsTotal

作用:计算图的颜色数

用法:int ImageColorsTotal(int im);

ImagePSLoadFont

作用:载入 Posts.c.r.i.p.t 字型

用法:int ImagePSLoadFont(string filename);

ImagePSFreeFont

作用:卸下 Posts.c.r.i.p.t 字型

用法:void ImagePSFreeFont(int fontindex);

ImagePSEncodeFont

作用:Posts.c.r.i.p.t 字型转成向量字

用法:int ImagePSEncodeFont(string encodingfile);

ImagePSText

作用:写 Posts.c.r.i.p.t 文字到图中

用法:array ImagePSText(int image, string text, int font, int size, int foreground, int background, int x, int y, int space, int tightness, float angle, int antialias_steps);

ImagePSBBox

作用:计算 Posts.c.r.i.p.t 文字所占区域

用法: array ImagePSBBox(string text, int font, int size, int space, int width, float angle);

ImageCreateFromPNG

作用:取出 PNG 图型

用法:int ImageCreateFromPng(string filename);

ImagePNG

作用:建立 PNG 图型

用法:int ImagePng(int im, string [filename]);

ImageCreateFromGIF

作用:取出 GIF 图型

用法:int ImageCreateFromGif(string filename);

ImageGIF

作用:建立 GIF 图型

用法:int ImageGif(int im, string [filename]);

 

标签:,,分类:WEB程序开发

PHP访问C#建立的Webservice

时间:2011年12月17日作者:小侃评论次数:0

最近遇到要使用PHP访问WebService。问了一下PHP程序员,用过的人少。自己配置。
在XP上配置不成功,在Win2003上安装一个5.2,安装时记得选择支持Soap。安装完后把IIS里解释PHP的DLL路径改正确。
把PHP.ini文件拷贝到Windows目录下,把Soap的Dll文件php_soap.dll拷贝到System32目录下。重启IIS。新建一个PHP文件。
1/* soap.php */
2/* 连接的是C#实现的Webservice */
3$client = new SoapClient( http://xx.xxx.xx.com/service.asmx?wsdl );
4$client->YourFunctionName(
5array(
6  “Parameter1″=>”Value1”,
7  “Parameter2″=>”Value2”) );
8print $client->YourFunctionNameResult;
9
这样就得到结果了。
SoapClient语法详见php.net。用它也可以建立PHP的WebService。