CODE |
存入q程Q?br /> ---------------------- 面 q接 存储 ---------------------- GBK => latin1 => utf-8 --------------- ------------- | | +------- 该过E得到的utf-8是一串不知所云的qQ但MySQL固执的认串码为UTF-8 | +------ MySQLGBK误认为是latin1 dq程Q?br /> ---------------------- 面 q接 存储 ---------------------- GBK <= latin1 <= utf-8 --------------- ------------- | | +------- 正是q串ql过逆过E{换回正确的GBK~码Q只是MySQL认ؓ是latin1而已 | +------ MySQL误认ؓ是latin1的GBK~码传回了页面,刚好得到正确的编码?!--c2--> |
CODE |
存入q程Q?br /> ---------------------- 面 q接 存储 ---------------------- GBK => GBK => utf-8 ------------ ------------- | | +------- 该过E得到的utf-8是由GBK转换而来的,是正的utf-8~码 | +------ 面字符集等于连接字W集QMySQL认ؓ面传递给它的是GBK~码Q它的想法正好符合事实?br /> dq程Q?br /> ---------------------- 面 q接 存储 ---------------------- GBK <= GBK <= utf-8 --------------- ------------- | | +------- 用“utf-8转GBK函数”将正确的utf-8~码转换回GBK | +------ 面字符集等于连接字W集Q显C没有Q何问题?!--c2--> |
CODE |
存入q程Q?br /> ---------------------- 面 q接 存储 ---------------------- GBK => latin1 => GBK ------------ ------------- | | +------- 字符被“latin1转GBK函数”{换的成了qQ但MySQL认ؓ它是GBKQ所以工h法正常显C?br /> | +------ MySQL认ؓ面传递给它的是latin1~码Q它在后箋q程中画蛇添_正的GBK转换Zؕ码?br /> dq程Q?br /> ---------------------- 面 q接 存储 ---------------------- GBK <= latin1 <= GBK --------------- ------------- | | +------- “GBK转latin1函数”将q转换为GBKQ但MySQL却认为它们是latin1 | +------ 错误的latin1~码其实是正的GBK~码Q页面显C正常,但工hCZ正常?!--c2--> |
CODE |
$str = "中文试"; $str_tran = iconv('latin1', 'utf-8', $str); echo $str_tran; // 昄qQ既不是GBK也不是utf-8和latin1 echo "<br>-----------<br>"; $str_re_tran = iconv('utf-8', 'latin1', $str_tran); echo $str_re_tran; // 昄 “中文测试?!--c2--> |
CODE |
$str = "中文试"; #$str_tran = iconv('utf-8', 'gbk', $str); // 错误Q!Q?!--c2--> |
在smarty的模板设计部分我单的把smarty在模板中的一些常用设|做了简单的介绍Q这一节主要来介绍一下如何在smarty中开始我们程
序设计?/font>
PHP代码:
首先来介l一下在上一节中我们使用的过?php文g中的一些元素。同P我们拿上一节中最开始的那个index.php文g来说明一下:
================================================
index.php
================================================
<?php
/*********************************************
*
* 文g名: index.php
* 作?用: 昄实例E序
*
* 作?者: 大师?
* EmailQ?teacherli@163.com
*
*********************************************/
include_once("./comm/Smarty.class.php"); //包含smartycL?
$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates("./templates"); //讄模板目录
$smarty->templates_c("./templates_c"); //讄~译目录
//****大家注意Q这里我是我新加入的****//
$smarty->cache("./cache"); //讄~存目录
$smarty->cache_lifetime = 60 * 60 * 24; //讄~存旉
$smarty->caching = true; //讄~存方式
//----------------------------------------------------
//左右边界W,默认为{}Q但实际应用当中Ҏ与JavaScript
//相冲H,所以徏议设?lt;{}>或其它?
//----------------------------------------------------
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
$smarty->assign("name", "李晓?); //q行模板变量替换
//~译q显CZ?/templates下的index.tpl模板
$smarty->display("index.tpl");
?>
我们可以看到Qsmarty的程序部分实际就是符合php语言规范的一l代码,我们依次来解释一下:
1?**/语句Q?
包含的部分ؓE序头注释。主要的内容应该为对E序的作用,版权与作者及~写旉做一个简单的介绍Q这在smarty中不是必
需的,但从E序的风格来Ԍq是一个好的风根{?
2。include_once语句Q?
它将安装到网站的smarty文g包含到当前文件中Q注意包含的路径一定要写正?
3?smarty = new Smarty():
q一句新Z个Smarty对象$smarty,单的一个对象的实例化?
4?smarty->templates(""):
q一句指?smarty对象使用tpl模板时的路径Q它是一个目录,在没有这一句时QSmarty默认的模板\径ؓ当前目录的templates
目录Q实际在写程序时Q我们要这一句写明,q也是一U好的程序风根{?
5?smarty->templates_c(""):
q一句指?smarty对象q行~译时的目录。在模板设计我们已l知道Smarty是一U编译型模板语言Q而这个目录,是它编?
模板的目录,q里要注意,如果站点位于*nix服务器上Q请保teamplates_c里定义的q个目录h可写可读权限Q默认情况下它的~译目录
是当前目录下的templates_cQ出于同L理由我们其明确的写出来?
6?smarty->left_delimiter?smarty->right_delimiter:
指明在查找模板变量时的左叛_割符。默认情况下?{"?}"Q但在实际中因ؓ我们要在模板中?lt;script>,Script中的函数?
义难免会使用{}Q虽然它有自q解决办法Q但习惯上我们将它重新定义ؓ"<{"?}>"或是"<!--{"?}-->"或其它标志符Q注意,如果在这?
定义了左叛_割符后,在模板文件中相应的要使每一个变量用与定义相同的符P例如在这里指定ؓ"<{"?}>"Qtpl模板中也要相应的?
{$name}变成<{$name}>,q样E序才可以正的扑ֈ模板变量?
7?smarty->cache("./cache"):
告诉Smarty输出的模板文件缓存的位置。上一我们知道Smarty最大的优点在于它可以缓存,q里是讄~存的目录。默认情
况下为当前目录下的cache目录Q与templates_c目录相当Q在*nixpȝ中我们要保它的可读可写性?
8. $smarty->cache_lifetime = 60 * 60 * 24:
q里以Uؓ单位q行计算~存有效的时间。第一ơ缓存时间到期时当Smarty的caching变量讄为true时缓存将被重建。当它的
取gؓ-1时表C徏立v的缓存从不过期,?时表C在E序每次执行时缓存L被重新徏立。上面的讄表示cache_lifetime讄Z天?
9. $smarty->caching = 1:
q个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以?个|0QSmarty默认|表示不对模板q行~存Q?Q表C?
Smarty用当前定义的cache_lifetime来决定是否结束cacheQ?Q表CSmarty用在cache被徏立时使用cache_lifetimeq个倹{习惯上?
用true与false来表C是否进行缓存?
10. $smarty->assign("name", "李晓?)Q?
该数的原型ؓassign(string varname, mixed var),varname为模板中使用的模板变量,var指出要将模板变量替换的变量名Q其
W二U原形ؓassign(mixed var),我们要在后面的例子详l的讲解q个成员函数的用方法,assign是Smarty的核心函C一Q所有对模板?
量的替换都要使用它?
11. $smarty->display("index.tpl"):
该函数原形ؓdisplay(string varname),作用为显CZ个模ѝ简单的Ԍ它将分析处理q的模板昄出来Q这里的模板文g?
用加路径Q只要用一个文件名可以了Q它路径我们已经?smarty->templates(string path)中定义过了?
E序执行完后我们可以打开当前目录下的templates_c与cache目录Q就会发现在下边多出一?%的目录,q些目录是Smarty的编译与
~存目录Q它q序自动生成,不要直接对这些生成的文gq行修改?
以上我简单的把SmartyE序中的一些常用的基本元素介绍了一下,在后边的例子中你可以看到它们将被多ơ的使用?
接下来介l一个section循环块与foreach循环块,本来它应该属于模杉K分,但是׃它们是smarty的精华所在,而且与smartyE序设计
部分联系非常紧密Q所以就在本节单独拿出来讲一下?
1. foreachQ用于@环简单数l,它是一个选择性的section循环Q它的定义格式ؓ:
{foreach from=$array item=array_id}
{foreachelse}
{/foreach}
其中Qfrom 指出要@环的数组变量Qitem循环的变量名Uͼ循环ơ数由from所指定的数l变量的个数所军_。{foreachelse}用来?
E序中传递过来的数组为空时的处理Q下面是一个简单的例子Q?
===========================================
example6.tpl
===========================================
<html>
<head><title>q是一个foreach使用的例?lt;/title></head>
<body>
q里输Z个数l:<br>
{foreach from=$newsArray item=newsID}
新闻~号Q{$newsID}<br>
新闻内容Q{$newsTitle}<br><hr>
{foreachelse}
对不P数据库中没有新闻输出Q?
{/foreach}
</body>
</html>
==========================================
example6.php
==========================================
六。smarty的程序设计部分:
在smarty的模板设计部分我单的把smarty在模板中的一些常用设|做了简单的介绍Q这一节主要来介绍一下如何在smarty中开始我们程
序设计?/p>
PHP代码:
首先来介l一下在上一节中我们使用的过?php文g中的一些元素。同P我们拿上一节中最开始的那个index.php文g来说明一下:
================================================
index.php
================================================
<?php
/*********************************************
*
* 文g名: index.php
* 作?用: 昄实例E序
*
* 作?者: 大师?
* EmailQ?teacherli@163.com
*
*********************************************/
include_once("./comm/Smarty.class.php"); //包含smartycL?
$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates("./templates"); //讄模板目录
$smarty->templates_c("./templates_c"); //讄~译目录
//****大家注意Q这里我是我新加入的****//
$smarty->cache("./cache"); //讄~存目录
$smarty->cache_lifetime = 60 * 60 * 24; //讄~存旉
$smarty->caching = true; //讄~存方式
//----------------------------------------------------
//左右边界W,默认为{}Q但实际应用当中Ҏ与JavaScript
//相冲H,所以徏议设?lt;{}>或其它?
//----------------------------------------------------
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
$smarty->assign("name", "李晓?); //q行模板变量替换
//~译q显CZ?/templates下的index.tpl模板
$smarty->display("index.tpl");
?>
我们可以看到Qsmarty的程序部分实际就是符合php语言规范的一l代码,我们依次来解释一下:
1?**/语句Q?
包含的部分ؓE序头注释。主要的内容应该为对E序的作用,版权与作者及~写旉做一个简单的介绍Q这在smarty中不是必
需的,但从E序的风格来Ԍq是一个好的风根{?
2。include_once语句Q?
它将安装到网站的smarty文g包含到当前文件中Q注意包含的路径一定要写正?
3?smarty = new Smarty():
q一句新Z个Smarty对象$smarty,单的一个对象的实例化?
4?smarty->templates(""):
q一句指?smarty对象使用tpl模板时的路径Q它是一个目录,在没有这一句时QSmarty默认的模板\径ؓ当前目录的templates
目录Q实际在写程序时Q我们要这一句写明,q也是一U好的程序风根{?
5?smarty->templates_c(""):
q一句指?smarty对象q行~译时的目录。在模板设计我们已l知道Smarty是一U编译型模板语言Q而这个目录,是它编?
模板的目录,q里要注意,如果站点位于*nix服务器上Q请保teamplates_c里定义的q个目录h可写可读权限Q默认情况下它的~译目录
是当前目录下的templates_cQ出于同L理由我们其明确的写出来?
6?smarty->left_delimiter?smarty->right_delimiter:
指明在查找模板变量时的左叛_割符。默认情况下?{"?}"Q但在实际中因ؓ我们要在模板中?lt;script>,Script中的函数?
义难免会使用{}Q虽然它有自q解决办法Q但习惯上我们将它重新定义ؓ"<{"?}>"或是"<!--{"?}-->"或其它标志符Q注意,如果在这?
定义了左叛_割符后,在模板文件中相应的要使每一个变量用与定义相同的符P例如在这里指定ؓ"<{"?}>"Qtpl模板中也要相应的?
{$name}变成<{$name}>,q样E序才可以正的扑ֈ模板变量?
7?smarty->cache("./cache"):
告诉Smarty输出的模板文件缓存的位置。上一我们知道Smarty最大的优点在于它可以缓存,q里是讄~存的目录。默认情
况下为当前目录下的cache目录Q与templates_c目录相当Q在*nixpȝ中我们要保它的可读可写性?
8. $smarty->cache_lifetime = 60 * 60 * 24:
q里以Uؓ单位q行计算~存有效的时间。第一ơ缓存时间到期时当Smarty的caching变量讄为true时缓存将被重建。当它的
取gؓ-1时表C徏立v的缓存从不过期,?时表C在E序每次执行时缓存L被重新徏立。上面的讄表示cache_lifetime讄Z天?
9. $smarty->caching = 1:
q个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以?个|0QSmarty默认|表示不对模板q行~存Q?Q表C?
Smarty用当前定义的cache_lifetime来决定是否结束cacheQ?Q表CSmarty用在cache被徏立时使用cache_lifetimeq个倹{习惯上?
用true与false来表C是否进行缓存?
10. $smarty->assign("name", "李晓?)Q?
该数的原型ؓassign(string varname, mixed var),varname为模板中使用的模板变量,var指出要将模板变量替换的变量名Q其
W二U原形ؓassign(mixed var),我们要在后面的例子详l的讲解q个成员函数的用方法,assign是Smarty的核心函C一Q所有对模板?
量的替换都要使用它?
11. $smarty->display("index.tpl"):
该函数原形ؓdisplay(string varname),作用为显CZ个模ѝ简单的Ԍ它将分析处理q的模板昄出来Q这里的模板文g?
用加路径Q只要用一个文件名可以了Q它路径我们已经?smarty->templates(string path)中定义过了?
E序执行完后我们可以打开当前目录下的templates_c与cache目录Q就会发现在下边多出一?%的目录,q些目录是Smarty的编译与
~存目录Q它q序自动生成,不要直接对这些生成的文gq行修改?
以上我简单的把SmartyE序中的一些常用的基本元素介绍了一下,在后边的例子中你可以看到它们将被多ơ的使用?
接下来介l一个section循环块与foreach循环块,本来它应该属于模杉K分,但是׃它们是smarty的精华所在,而且与smartyE序设计
部分联系非常紧密Q所以就在本节单独拿出来讲一下?
1. foreachQ用于@环简单数l,它是一个选择性的section循环Q它的定义格式ؓ:
{foreach from=$array item=array_id}
{foreachelse}
{/foreach}
其中Qfrom 指出要@环的数组变量Qitem循环的变量名Uͼ循环ơ数由from所指定的数l变量的个数所军_。{foreachelse}用来?
E序中传递过来的数组为空时的处理Q下面是一个简单的例子Q?
===========================================
example6.tpl
===========================================
<html>
<head><title>q是一个foreach使用的例?lt;/title></head>
<body>
q里输Z个数l:<br>
{foreach from=$newsArray item=newsID}
新闻~号Q{$newsID}<br>
新闻内容Q{$newsTitle}<br><hr>
{foreachelse}
对不P数据库中没有新闻输出Q?
{/foreach}
</body>
</html>
==========================================
example6.php
==========================================
<?php
新闻~号Q?<br>
新闻内容Q第1条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第2条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第3条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第4条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第5条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第6条新?lt;br><hr>
</body>
</html>foreachq可以用foreachelse来匹配,用foreachelse来表C当传递给foreach的数lؓI值时E序要执行的操作Q具体的使用ҎQ请参?
手册的说明?
2. section:
section的生是决foreach的不的Q与foreach一P它用于设计模板内的@环块Q它较ؓ复杂Q可极大E序上满程序需要,所以在E序中我习惯使用它而不使用foreach,基本原Ş为:
{section name = name loop = $varName[, start = $start, step = $step, max = $max, show = true]}
name: section的名Uͼ不用?
$loop: 要@环的变量Q在E序中要使用assign对这个变量进行操作?
$start: 开始@环的下标Q@环下标默认由0开?
$step: 每次循环时下标的增数
$max: 最大@环下?
$show: booleancdQ决定是否对q个块进行显C,默认为trueq里有个名词需要说明:
循环下标Q实际它的英文名UCؓindexQ是索引的意思,q里我将它译?下标"Q主要是Z好理解。它表示在显C个@环块时当前的循环索引Q默认从0开始,?start的媄响,如果?start设ؓ5Q它也将?开始计敎ͼ在模板设计部分我们用过它,q是当前
{section}的一个属性,调用方式为Smarty.section.sectionName.index,q里的sectionName指的是函数原型中的name属性?
{section}块具有的属性|分别为:
1. index: 上边我们介绍?循环下标"Q默认ؓ0
2. index_prev: 当前下标的前一个|默认?1
3. index_next: 当前下标的下一个|默认?
4. first: 是否为第一下@?
5. last: 是否为最后一个@?
6. iteration: 循环ơ数
7. rownum: 当前的行Piteration的另一个别?
8. loop: 最后一个@环号Q可用在section块后l计section的@环次?
9. total: 循环ơ数Q可用在section块后l计循环ơ数
10. show: 在函数的声明中有它,用于判断section是否昄它们的具体属性大家可以参考手册,在程序中可灵zM用它的这些属性,模板部分我就使用qindex属性,大家可以回过头去看看?
同样Q{section}也可以配合用{sectionelse}Q用来表CZ入的数组变量为空时对模板q行的处理?
我们把上边的那个例子使用{section}来替代{foreach}来实现现L功能Q注意,在这个例子中我只tpl模板中的{foreach}?
{section}来实玎ͼphpE序文g中没有Q何改动,同时加了{sectionelse}处理块:
===========================================
example7.tpl
===========================================
<html>
<head><title>q是一个foreach使用的例?lt;/title></head>
<body>
q里输Z个数l:<br>
{section name=loop, loop=$News}
新闻~号Q{$News[loop].newsID}<br>
新闻标题Q{$News[loop].newsTitle}<br><hr>
{sectionelse}
对不P没有M新闻输入Q?
{/section}
</body>
</html>
==========================================
example6.php
==========================================
<?php
/*********************************************
*
* 文g名: example7.php
* 作?用: 昄实例E序2
*
* 作?者: 大师?
* EmailQ?teacherli@163.com
*
*********************************************/
include_once("./comm/Smarty.class.php");$smarty = new Smarty();
$smarty->templates("./templates");
$smarty->templates_c("./templates_c");
$smarty->cache("./cache");
$smarty->cache_lifetime = 0;
$smarty->caching = true;
$smarty->left_delimiter = "{";
$smarty->right_delimiter = "}";
$array[] = array("newsID"=>1, "newsTitle"=>"W?条新?);
$array[] = array("newsID"=>2, "newsTitle"=>"W?条新?);
$array[] = array("newsID"=>3, "newsTitle"=>"W?条新?);
$array[] = array("newsID"=>4, "newsTitle"=>"W?条新?);
$array[] = array("newsID"=>5, "newsTitle"=>"W?条新?);
$array[] = array("newsID"=>6, "newsTitle"=>"W?条新?);$smarty->assign("newsArray", $array);
//~译q显CZ?/templates下的index.tpl模板
$smarty->display("example6.tpl");
?>=================================================
example7.php 输出文g
=================================================
<html>
<head><title>foreach使用的例?lt;/title></head>
<body>
q里输Z个数l:<br>新闻~号Q?<br>
新闻内容Q第1条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第2条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第3条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第4条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第5条新?lt;br><hr>新闻~号Q?<br>
新闻内容Q第6条新?lt;br><hr>
</body>
</html>q里的{section}块的对于变量的命名方式感觉有些别扭,不过没关p,你只要记住模板变量用:
$loopName[name].varq种模式p了,loopName为loop处赋予的变量名,[name]为name处赋予的字符Ԍ.后ؓZ要在E序数组中设定要与值相对应的下标名U就行了?
好了Qsmarty学习指南---E序设计就写到q里Q对于一般的应用Q这些知识已l够用了Q其它的一些高U技巧大家请参看手册中的例子Q下一节将讲讲Smarty在实际应用中的例子,分别以php内置的mysql语句Qphplib中的DBc,ADODBQPear中DBcL分别讲一下各个类库在同一个例子中的实现?
我在一|页向另一|页POST数据nameQؓ什么输?name时却得不CQ何?
在PHP4.2以后的版本中register_global默认为off
若想取得从另一面提交的变?
Ҏ一:在PHP.ini中找到register_globalQƈ把它讄为on.
Ҏ?在接收网|前面放上q个extract($_POST);extract($_GET);(注意extract($_SESSION)前必要有Session_Start()).
Ҏ?一个一个读取变?a=$_GET["a"];$b=$_POST["b"]{,q种Ҏ虽然ȝQ但比较安全.
2Q调试你的程?/p>
在运行时必须知道某个变量Z倹{我是这样做的,建立一文gdebug.php,其内容如?
PHP代码:
<?PHP
Ob_Start();
Session_Start();
Echo "<pre>";
Echo "本页得到的_GET变量?";
Print_R($_GET);
Echo "本页得到的_POST变量?";
Print_R($_POST);
Echo "本页得到的_COOKIE变量?";
Print_R($_COOKIE);
Echo "本页得到的_SESSION变量?";
Print_R($_SESSION);
Echo "</pre>";
?>
然后在php.ini中设|:include_path = "c:/php"Qƈdebug.php攑֜此文件夹,以后可以在每个|页里包含此文gQ查看得到的变量名和?
3Q如何用session
凡是与session有关?之前必须调用函数session_start();
为session付值很??
PHP代码:
<?php
Session_start();
$Name = "q是一个Session例子";
Session_Register("Name");//注意,不要写成QSession_Register("$Name");
Echo $_SESSION["Name"];
//之后$_SESSION["Name"]?q是一个Session例子"
?>
在php4.2之后,可以为session直接付?
PHP代码:
<?PHP
Session_Start();
$_SESSION["name"]="value";
?>
取消session可以q样:
PHP代码:
<?php
session_start();
session_unset();
session_destroy();
?>
取消某个session变量在php4.2以上q有BUG.
注意:
1:在调用Session_Start()之前不能有Q何输?例如下面是错误的.
==========================================
1?br /> 2?3?Session_Start();//之前在第一行已l有输出
4?.....
5??>
==========================================
提示1:
凡是出现" ........headers already sent.......... ",是Session_Start()之前向浏览器输出信息.L输出正?QCOOKIE也会出现q种错误,错误原因一P
提示2:
如果你的Session_Start()攑֜循环语句?q且很难定之前哪里向浏览器输出信息,可以用下面这U方?
1?<?PHP Ob_Start(); ?>
........q里是你的程?.....
2:q是什么错?/p>
Warning: session_start(): open(/tmp\sess_7d190aa36b4c5ec13a5c1649cc2da23f, O_RDWR) failed:....
因ؓ你没有指定session文g的存放\?
解决Ҏ:
(1)在c盘徏立文件夹tmp
(2)打开php.ini,扑ֈsession.save_path,修改为session.save_path= "c:/tmp"
4:Z么我向另一|页传送变量时,只得到前半部?以空格开头的则全部丢?/p>
PHP代码:
<?php
$Var="hello php";//修改?Var=" hello php";试试得到什么结?br /> $post= "receive.php?Name=".$Var;
header("location:$post");
?>
receive.php的内?
PHP代码:
<?PHP
Echo "<pre>";
Echo $_GET["Name"];
Echo "</pre>";
?>
正确的方法是:
PHP代码:
<?php
$Var="hello php";
$post= "receive.php?Name=".urlencode($Var);
header("location:$post");
?>
在接攉面你不需要用Urldecode(),变量会自动编?
5:如何截取指定长度汉字而不会出C"?>"l尾,出部分?..."代替
一般来?要截取的变量来自Mysql,首先要保证那个字D长度要_?一般ؓchar(200),可以保持100个汉字,包括标点.
PHP代码:
<?PHP
$str="q个字符好长呀,^_^";
$Short_Str=showShort($str,4);//截取前面4个汉?l果?q个字符...
Echo "$Short_Str";
Function csubstr($str,$start,$len)
{
$strlen=strlen($str);
$clen=0;
for($i=0;$i<$strlen;$i++,$clen++)
{
if ($clen>=$start+$len)
break;
if(ord(substr($str,$i,1))>0xa0)
{
if ($clen>=$start)
$tmpstr.=substr($str,$i,2);
$i++;
}
else
{
if ($clen>=$start)
$tmpstr.=substr($str,$i,1);
}
}
return $tmpstr;
}
Function showShort($str,$len)
{
$tempstr = csubstr($str,0,$len);
if ($str<>$tempstr)
$tempstr .= "..."; //要以什么结?修改q里可?
return $tempstr;
}
6:规范你的SQL语句
在表|字段前面加上"`",q样׃会因用关键字而出现错误,当然我ƈ不推荐你使用关键?
例如
$Sql="INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', '2003-07-11 00:00:00')"
"`"怎么输入? 在TAB键上?
7:如何使Html/PHP格式的字W串不被解释,而是照原hC?/p>
PHP代码:
<?PHP
$str="<h1>PHP</h1>";
Echo "被解释过? ".$str."<br>l过处理?";
Echo htmlentities(nl2br($str));
?>
8:怎么在函数里取得函数外的变量?/p>
PHP代码:
<?PHP
$a="PHP";
foo();
Function foo()
{
global $a;//删除q里看看是什么结?br /> Echo "$a";
}
?>
9:我怎么知道pȝ默认支持什么函?/p>
PHP代码:
<?php
$arr = get_defined_functions();
Function php() {
}
echo "<pre>";
Echo "q里昄pȝ所支持的所有函?和自定以函数php\n";
print_r($arr);
echo "</pre>";
?>
10:如何比较两个日期相差几天
PHP代码:
<?PHP
$Date_1="2003-7-15";//也可以是:$Date_1="2003-7-15 23:29:14";
$Date_2="1982-10-1";
$d1=strtotime($Date_1);
$d2=strtotime($Date_2);
$Days=round(($d1-$d2)/3600/24);
Echo "偶已l奋斗了 $Days 天^_^";
?>
11:Z么我升PHP?原来的程序出现满屏的 Notice: Undefined variable:
q是警告的意?׃变量未定义引L.
打开php.ini,扑ֈ最下面的error_reporting,修改为error_reporting = E_ALL & ~E_NOTICE
对于Parse error错误
error_reporting(0)无法关闭.
如果你想关闭M错误提示,打开php.ini,扑ֈdisplay_errors,讄为display_errors = Off.以后M错误都不会提C?
那什么是error_reporting?
12:我想在每个文件最前,最后面都加上一文g.但一个一个添加很ȝ
1:打开php.ini文g
讄 include_path= "c:"
2:写两个文?
auto_prepend_file.php ?auto_append_file.php 保存在c?他们自动依附在每个php文g的头部和N.
3:在php.ini中找?
Automatically add files before or after any PHP document.
auto_prepend_file = auto_prepend_file.php;依附在头?br /> auto_append_file = auto_append_file.php;依附在尾?/p>
以后你每个php文gq当于
PHP代码:
<?php
Include "auto_prepend_file.php" ;
.......//q里是你的程?/p>
Include "auto_append_file.php";
?>
13:如何利用PHP上传文g
PHP代码:
<html><head>
<title>上蝲文g表单</title></head>
<body>
<form enctype="multipart/form-data" action="" method="post">
请选择文gQ?<br>
<input name="upload_file" type="file"><br>
<input type="submit" value="上传文g">
</form>
</body>
</html>
<?
$upload_file=$_FILES['upload_file']['tmp_name'];
$upload_file_name=$_FILES['upload_file']['name'];
if($upload_file){
$file_size_max = 1000*1000;// 1M限制文g上传最大容?bytes)
$store_dir = "d:/";// 上传文g的储存位|?br /> $accept_overwrite = 1;//是否允许覆盖相同文g
// 查文件大?br /> if ($upload_file_size > $file_size_max) {
echo "对不P你的文g定w大于规定";
exit;
}
// 查读写文?br /> if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {
Echo "存在相同文g名的文g";
exit;
}
//复制文g到指定目?br /> if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {
echo "复制文gp|";
exit;
}
}
Echo "<p>你上传了文g:";
echo $_FILES['upload_file']['name'];
echo "<br>";
//客户端机器文件的原名U?
Echo "文g?MIME cd?";
echo $_FILES['upload_file']['type'];
//文g?MIME cdQ需要浏览器提供该信息的支持Q例如“image/gif”?
echo "<br>";
Echo "上传文g大小:";
echo $_FILES['upload_file']['size'];
//已上传文件的大小Q单位ؓ字节?
echo "<br>";
Echo "文g上传后被临时储存?";
echo $_FILES['upload_file']['tmp_name'];
//文g被上传后在服务端储存的时文件名?
echo "<br>";
$Erroe=$_FILES['upload_file']['error'];
switch($Erroe){
case 0:
Echo "上传成功"; break;
case 1:
Echo "上传的文件超q了 php.ini ?upload_max_filesize 选项限制的?"; break;
case 2:
Echo "上传文g的大超q了 HTML 表单?MAX_FILE_SIZE 选项指定的倹{?; break;
case 3:
Echo "文g只有部分被上?;break;
case 4:
Echo "没有文g被上?;break;
}
?>
14:如何配置GD?/p>
下面是我的配|过E?br /> 1:用dos命o(也可以手动操?拯dlls文g多w所有dll文g到system32目录? copy c:\php\dlls\*.dll c:\windows\system32\
2:打开php.ini
讄extension_dir = "c:/php/extensions/";
3:
extension=php_gd2.dll;把extension前面的逗号LQ如果没有php_gd2.dllQphp_gd.dll也一?保证实存在q一文gc:/php/extensions/php_gd2.dll
4:q行下面E序q行试
PHP代码:
<?php
Ob_end_flush();
//注意,在此之前不能向浏览器输出M信息,要注意是否设|了 auto_prepend_file.
header ("Content-type: image/png");
$im = @imagecreate (200, 100)
or die ("无法创徏囑փ");
$background_color = imagecolorallocate ($im, 0,0, 0);
$text_color = imagecolorallocate ($im, 230, 140, 150);
imagestring ($im, 3, 30, 50, "A Simple Text String", $text_color);
imagepng ($im);
?>
点击q里查看l果
15:什么是UBB代码
UBB代码是HTML的一个变U?是Ultimate Bulletin Board (国外一个BBSE序Q国内也有不地方用这个程?采用的一U特D的TAG.
即ɼ止使用 HTMLQ你也可以用 UBBCode? 来实?也许你更希望使用 UBBCode? 而不?HTML, 即论坛允许使用 HTML, 因ؓ使用h代码较少也更安全.
[回顾]:上集介绍?调试E序","如何使用session","规范SQL语句"{?5个问题(Php高手带\--问题汇总解{[1]Q。本集l作?6条常见问题的解答?/p>
16:我想修改MySQL的用?密码
首先要声明一点,大部分情况下Q修改MySQL是需要有mysql里的root权限的,
所以一般用h法更改密码,除非h理?
Ҏ一
使用phpmyadminQ这是最单的了,修改mysql库的user表,
不过别忘了用PASSWORD函数?/p>
Ҏ?
使用mysqladminQ这是前面声明的一个特例?
mysqladmin -u root -p password mypasswd
输入q个命o后,需要输入root的原密码Q然后root的密码将改ؓmypasswd?
把命令里的root改ؓ你的用户名,你就可以改你自己的密码了?
当然如果你的mysqladminq接不上mysql serverQ或者你没有办法执行mysqladminQ?
那么q种Ҏ是无效的?
而且mysqladmin无法把密码清I?
下面的方法都在mysql提示W下使用Q且必须有mysql的root权限Q?
Ҏ?
mysql> INSERT INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES
切地说q是在增加一个用P用户名ؓjeffreyQ密码ؓbiscuit?
在《mysql中文参考手册》里有这个例子,所以我也就写出来了?
注意要用PASSWORD函数Q然后还要用FLUSH PRIVILEGES?/p>
Ҏ?
和方法三一P只是使用了REPLACE语句
mysql> REPLACE INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES
Ҏ?
使用SET PASSWORD语句Q?
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
你也必须使用PASSWORD()函数Q?
但是不需要用FLUSH PRIVILEGES?/p>
Ҏ?
使用GRANT ... IDENTIFIED BY语句
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
q里PASSWORD()函数是不必要的,也不需要用FLUSH PRIVILEGES?
注意Q?PASSWORD() [不是]以在Unix口o加密的同h法施行口令加密?
17:我想知道他是通过哪个|站q接到本?br /> PHP代码:
<?php
//必须通过q接q入才有输出
Echo $_SERVER['HTTP_REFERER'];
?>
18:数据攑օ数据库和取出来显C在面需要注意什?br /> 入库?/p>
$str=addslashes($str);
$sql="insert into `tab` (`content`) values('$str')";
出库?/p>
$str=stripslashes($str);
昄?/p>
$str=htmlspecialchars(nl2br($str)) ;
<?php
//$content来自数据?/p>
$content=nl2br(htmlspecialchars($content));
$content=str_replace(" "," ",$content);
$content=str_replace("\n","<br>\n",$content);
?>
19:如何d当前地址栏信?br /> PHP代码:
<?php
$s="http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME']}";
$se='';
foreach ($_GET as $key => $value) {
$se.=$key."=".$value."&";
}
$se=Preg_Replace("/(.*)&$/","$1",$se);
$se?$se="?".$se:"";
echo $s."?$se";
?>
20:我点d退按钮,Z么之前填写的东西不见
q是因ؓ你用了session.
解决办法:
PHP代码:
<?php session_cache_limiter('private, must-revalidate');session_start();
.....................?>
21:怎么在图片里昄IP地址
PHP代码:
<? Header("Content-type: image/png");
$img = ImageCreate(180,50);
$ip = $_SERVER['REMOTE_ADDR'];
ImageColorTransparent($img,$bgcolor);
$bgColor = ImageColorAllocate($img, 0x2c,0x6D,0xAF); // 背景颜色
$shadow = ImageColorAllocate($img, 250,0,0); // 阴媄颜色
$textColor = ImageColorAllocate($img, oxff,oxff,oxff); // 字体颜色
ImageTTFText($img,10,0,78,30,$shadow,"d:/windows/fonts/Tahoma.ttf",$ip);
//昄背景
ImageTTFText($img,10,0,25,28,$textColor,"d:/windows/fonts/Tahoma.ttf","your ip is".$ip);
// 昄IP
ImagePng($img);
imagecreatefrompng($img);
ImageDestroy($img);
?>
22:如何取得用户的真实IP
PHP代码:
<? function iptype1 () {
if (getenv("HTTP_CLIENT_IP"))
{
return getenv("HTTP_CLIENT_IP");
}
else
{
return "none";
}
}
function iptype2 () {
if (getenv("HTTP_X_FORWARDED_FOR"))
{
return
getenv("HTTP_X_FORWARDED_FOR");
}
else {
return "none";
}
}
function iptype3 () {
if (getenv("REMOTE_ADDR"))
{
return getenv("REMOTE_ADDR");
}
else {
return "none";
}
}
function ip() {
$ip1 = iptype1();
$ip2 = iptype2();
$ip3 = iptype3();
if (isset($ip1) && $ip1 != "none" && $ip1 != "unknown")
{
return $ip1;
}
elseif (isset($ip2) && $ip2 != "none" && $ip2 != "unknown")
{
return $ip2;
}
elseif (isset($ip3) && $ip3 != "none" && $ip3 != "unknown")
{
return $ip3;
}
else
{ return "none"; }
}
Echo ip();
?>
23:如何从数据库d三天内的所有记?br /> 首先表格里要有一个DATETIME字段记录旉,
格式?2003-7-15 16:50:00'
SELECT * FROM `xltxlm` WHERE TO_DAYS(NOW()) - TO_DAYS(`date`) <= 3;
24:如何q程链接Mysql数据?/p>
在增加用Lmysql表里有一个host字段Q修改ؓ"%",或者指定允许连接的ip地址,q样Q你可以远E调用了?br /> $link=mysql_connect("192.168.1.80:3306","root","");
25:正则到底怎么?/p>
正则表达式中的特D字W?/p>
26:用Apache?主页出现q
Ҏ一:
AddDefaultCharset ISO-8859-1 改ؓ AddDefaultCharset off
Ҏ?
AddDefaultCharset GB2312
27:Z么单引号,双引号在接受面变成(\'\")
解决Ҏ:
Ҏ一:在php.ini中设|?magic_quotes_gpc = Off
Ҏ? $str=stripcslashes($str)
28:怎么让程序一直运行下?而不是超q?0U就停止
set_time_limit(60)//最长运行时间一分钟
set_time_limit(0)//q行到程序自q?或手动停?/p>
29:计算当前在线人数
例子一:用文本实?br /> PHP代码:
<?php
//首先你要有读写文件的权限
//本程序可以直接运?W一ơ报?以后可?/p>
$online_log = "count.dat"; //保存人数的文?
$timeout = 30;//30U内没动作?认ؓ掉线
$entries = file($online_log);
$temp = array();
for ($i=0;$i<count($entries);$i++) {
$entry = explode(",",trim($entries[$i]));
if (($entry[0] != getenv('REMOTE_ADDR')) && ($entry[1] > time()))
{
array_push($temp,$entry[0].",".$entry[1]."\n"); //取出其他览者的信息,q去掉超时?保存q?temp
}
}
array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."\n");
//更新览者的旉
$users_online = count($temp); //计算在线人数
$entries = implode("",$temp);
//写入文g
$fp = fopen($online_log,"w");
flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网l文件系l中正常工作
fputs($fp,$entries);
flock($fp,LOCK_UN);
fclose($fp);
echo "当前?.$users_online."人在U?;
?>
30:什么是模板,怎么?br /> 我用的是phplib模板
下面是其中几个函数的使用
$T->Set_File("随便定义","模板文g.tpl");
$T->Set_Block("在set_file中定义的","<!-- 来自模板 -->","随便定义");
$T->Parse("在Set_Block中定义的","<!-- 来自模板 -->",true);
$T->Parse("随便输出l果","在Set_File中定义的");
讄循环格式?
<!--(多于一个空? BEGIN $handle(多于一个空?-->
如何模板生成静态网?/p>
PHP代码:
<?php
//q里使用phplib模板
............
............
$tpl->parse("output","html");
$output = $tpl->get("output");// $output 为整个网内?/p>
function wfile($file,$content,$mode='w') {
$oldmask = umask(0);
$fp = fopen($file, $mode);
if (!$fp) return false;
fwrite($fp,$content);
fclose($fp);
umask($oldmask);
return true;
}
// 写到文g?/p>
Wfile($FILE,$output);
header("location:$FILE");//重定向到生成的网?/p>
}
?>
phplib下蝲地址 smarty下蝲地址
31:怎么用php解释字符
比如:输入2+2*(1+2),自动输出8 可以用eval函数
PHP代码:
<form method=post action="">
<input type="text" name="str"><input type="submit">
</form>
<?php
$str=$_POST['str'];
eval("\$o=$str;");
Echo "$o";
?>
到此Qphp的问题解{就为大家介l完毕,希望能对各位有所帮助?br />