php流程控制 break continue

 更新时间:2016年11月25日 16:14  点击:1426

break
break 结束当前 for,foreach,while,do-while 或者 switch 结构的执行。

continue

结束当前循环,跳转到下次例:

while(1){

  if( $mrs['lm_name']=='首页' || $mrs['lm_name']=='论坛'){continue;}

}

break 可以接受一个可选的数字参数来决定跳出几重循环。


<?php
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each($arr)) {
if ($val == 'stop') {
break; /* You could also write 'break 1;' here. */
}
echo "$val<br />\n";
}

/* Using the optional argument. */

$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br />\n";
break 1; /* Exit only the switch. */
case 10:
echo "At 10; quitting<br />\n";
break 2; /* Exit the switch and the while. */
default:
break;
}
}
?> 
 
 

一直用smarty的cache,但感觉还是要自己做一个,才有感觉。网上有很多牛人的功能比较完备,打算先自己搞简单的再慢慢丰满。这两天做了一个比较简单的,在hi.baidu.net/alex_wang58记录一下。

一、用到的相关技术关键词:PHP, Apache,
                                               mod_rewrite (RewriteCond,RewriteRule)地址重写,
                                               ob系列函数缓冲
                                               file_put_contents生成html

、流程:用户发出请求url?id=x ,判断文章是否存在
                        (1)存在则直接转到对应的Html页面。
                        (2)不存在通过php读取数据库数据,然后生成html文件,并存放到指定目录。

三、实现方法
(1)地址重写用Apahce的mod_rewrite模块中的RewriteRule指令实现重写(mod_rewrite的开启和简单规则见本博另一篇http://hi.baidu.com/alex%5Fwang5 ... 0346ffb3fb952e.html )。
(2)判断文章是否存在用Apahce 的mod_rewrite模块中的RewriteCond指令
(3)生成html文件:
           ob_star()打开缓冲,将读取文章的php包含进来,然后用file_put_contents将获得的缓冲内容写入指定HTMl文件。
四、代码


/Test 目录下的 .htaccess 文件内容:

RewriteEngine On
RewriteRule ^index.html$ /news.php [L]
RewriteCond %{REQUEST_FILENAME}  !-s
RewriteRule ^html/news_([0-9]+).html$ getnews.php?id=$1 [L]

对news.php的访问将通过 localhost/Test/index.html 实现由第二句 RewriteRule ^index.html$ Test/news.php [L] 实现

news.php =============================> news.php将列出文章标题链接。
复制PHP内容到剪贴板
PHP代码:

<?php
header
("Content-Type:text/html; charset=gbk"); 
//以防出现乱码
mysql_connect("localhost","root",""
);
mysql_query('SET NAMES gbk'); 
//我的数据库用的gbk编码,请根据自己实际情况调整
mysql_select_db("test"
);

$sql "SELECT `id`,`title` FROM `arc` order by `id` DESC"
;
$rs mysql_query($sql
);
while(
$row mysql_fetch_array($rs
) ){
echo 
"<a href='/Test/html/news_$row[id].html'>$row[title]</a><br>"
;
}
?>


比如生成了<a href='/Test/html/news_3.html'>php静态页实现</a>
当点击链接发出对 http://localhost/Test/html/news_3.html 的请求时
Apache将会判断 news_3.html  是否存在,由 .htaccess中的第三句
RewriteCond %{REQUEST_FILENAME}  !-s
实现:


     RewriteCond  是“定向
重写发生条件”。REQUEST_FILENAME 这个参数是“客户端请求的文件名”
'-s'  (是一个非空的常规文件[size]) 测试指定文件是否存在而且是一个尺寸大于0的常规的文件.  表示匹配条件的反转。
所以 RewriteCond 这句就表示当请求链接不存在时 执行下面的 RewriteRule 规则。

所以当请求的
news_3.html 不存在时会重写地址让 getnews.php?id=3 来处理(否则如果news_3.html 存在则直接就加载该html文件)。

getnews.php ===================>功能:判断参数传输的完整性,并调用相应文件生成html文件。

复制PHP内容到剪贴板
PHP代码:

<?php
$id 
=$_GET['id'
];
$root =& $_SERVER['DOCUMENT_ROOT'
];
$filename "news_".$id.".html"
;
$file $root."/Test/html/".$filename
;
ob_start
();
include(
$root."/Test/newsDetail.php"
);
file_put_contents($file,ob_get_contents
());
ob_end_flush
(); 
?>



newsDetail.php ====================> 从数据库中读取数据,产生新闻内容,内容被
getnews.php捕获
复制PHP内容到剪贴板
PHP代码:

<?php
header
("Content-Type:text/html; charset=gbk"
);
if( isset(
$_GET['id'
]) ){
$id = & $_GET['id'
];
}else{
header("Location: [url]http://127.0.0.1/lean/Test/html/news_failed.html[/url]"
);
exit();
}
mysql_connect("localhost","root",""
);
mysql_query('SET NAMES gbk'
);
mysql_select_db("test"
);
$id =$_GET['id'
];

$sql "SELECT `news` FROM `arc` WHERE `id`=$id"
;
$rs mysql_query($sql
);
while(
$row mysql_fetch_array($rs
) ){
echo 
$row['news'
];
}
?>


这样将会在/Test/html 目录下产生以 news_文章ID.html 命名的html文件。

PS: 一开始在判断是否存在相应html页面时采用的是 php 内置的 file_exists() 判断,而不用Apache的
RewriteCond,也即没有 RewriteCond %{REQUEST_FILENAME}  !-s。看似可行,但结果会产生“循环重定向”的问题。
       当
news_3.html 不存在时 我们需要用 getnews.php生成news_3.html ,生成完毕后需要转向到 news_3.html ,于是又形成了一次请求mod_rewrite又启动把 news_3.html重写为 getnews.php?id=3 这就形成了死循环了。所以把文件存在性的判断交给 RewriteCond ,指定的html文件不存在时才启用重写规则。这样循环重定向的问题就没有了。
       一开始没有采用fopen打开
newsDetail.php,然后再将生成的内容fwrite成html文件,然后include输出静态页面。后来在fhjr999的提醒下,改为:将newDetail.php包含进getnews.php,通过ob系列函数将生成的内容放入缓冲,然后再生成html文件。ob的效率是前者的20倍左右。
PHP实例剖析:计数器
作者:Sucre_tiger
本款计数器用文本计数,没有用到数据库,可以实现如下功能:
利用一个文本文件实现多个页的计数减少服务器的I/O占用率在需要纪录的文件里,只需加入很少的几行代码
基本思路如下:
服务器程序从文本文件中读取该页被浏览的次数,(因为所有文件向服务器提出请求时,他们的环境变量REQUEST_URI都代表他来自于何处... ...,所以,以请求文件的环境变量REQUEST_URI来辨别到底是那一页正被浏览。),将这个次数加一储存,并在调用这页的用户的计算机上显示出来。
请先看我的数据文本中纪录的数据样本,(红色为浏览次数,其前面为相应的被浏览的文件)
Counter.dat/script/s2.php|3|/script/s1.php|11| /script/counter.php|5| /testhtml/s2.php|7|/testhtml/s3.php|6|
Now,Let’s go!
counter.php
<html><head>
<title>计数器</title>
<head>
<body>
<?php
/* 定义储存数据的文本文件 */
$counterFile="counter.dat";
/* 定义一个标记,用来辨别现在需纪录的数据是否已经文本数据中 */
$sign=False;
/* 将数据以数组的方式读入变量 $sounterData 备用, */
$counterData=file($counterFile);
/* 用count()函数计算共有多少个纪录 */
/* 用explode()函数把$counterData[$i]按符号"|"分开,并以数组的方式送回到变量$varArray里 */
/* 函数implode()与explode()刚刚相反,把数组$varArray以符号"|"连接起来送回到$counterData */
/* 还利用了环境变量$PATH_INFO
for($i=0;$i<=count($counterData)-1;$i )
 {
  $varArray=explode("|",$counterData[$i]);
  if ($varArray[0]==$GLOBALS["REQUEST_URI"])
   {
    $varArray[1] ;
    print($varArray[1]);
    $counterData[$i]=implode("|", $varArray);
    $sign=True;
    /* 找到本纪录所在的位置后, 用break 退出循环 */ 
    break;
   }
 }
/* 在这里,利用implode()这个函数的功能,将数据整理好了,一起写入文本文件中 */
/* 这样,对服务器的I/O占用就降到了最低点
6。bbsd和cq66服务器端改造
bbsd中,关于用户的模块应该比较好改,只要将写.PASSWD文件的操作换为
操作数据库的UserManage类的成员函数即可,但可能要先判断什么数据更改,
要调用哪个函数。并发操作的一致性,则由数据库的加锁功能保证,mysql应该
支持这种的锁吧。文章方面可能比较麻烦,也是将原来对文件的操作转换成操作
数据库的BoardManage类的成员函数即可。
cq66模式应该比较好改动,可能就是原来取文章的协议要变化一下。取文章
标题的时候,同时也将文章的长度发送过去,然后客户端可以根据显示区的大小,
逐步请求文章的内容,请求文章的时候要给出请求的范围。
关于系统模块层,可能做成so的形式会不会较好,(so是不是相当于dll,
容不容易做的,有没有必要?),同时系统模块层应不应该保存一些局部数据呢?
还是做成公用函数一样的接口呢?回想UserManage类,可能没必要区分特权指令,
所有操作都要提供操作对象的id,而权限检查交到上面的服务层来完成?
7。初步测试计划
要测试,等先要把东西做出来,要做东西,先要有别的东西。。。。。
首先将167系统装好,配好mysql,然后学学mysql的 C API 接着建好表,
要做这个计划,先要将短学期的5000行代码写完,然后是复习考研,复习之余将编译器作业作好,再有时间而且没有mm来找我,就可以开始做了。。。。。

4。用户模块设计
对于底层数据库,调用mysql的C API函数来进行数据库的修改,内部保存
一定的状态变量(例如用户名,还是留给上一层完成?),对上一层,则提供
用户管理的接口。
Class UserManage {
private:
char myuserid[20]; // 用户的id,未登陆前为空
time logintime; // 用户登陆时间,并用于计算停留时间
char loginhost[20]; //上站地点。
public:
int NewUser( char *userid, char *passwd );
新建一个用户,判断是否已经有,其他资料暂时为空,
firstlogintime,权限等设缺省值。
int UserLogin( char *userid, char *passwd );
用户登陆,验证密码,
int ChangePasswd( char *oldpasswd, char *newpasswd );
修改密码,要求原密码一致。
int ChangePriData( char *newname, char *newemail,
char *newaddr );
改变基本数据,泥称,email,住址。。。。
int ModifyNumData( int addlogin, int addpost );
修改文章数,上站次数,等数据。。。。注意调用对象。
int UserLogout();
用户退出,修改lastlogin,staytime,loginhost等
// 普通查询命令
int QueryCommonData( const char * userid, int& loginnum,
char * username, int& postnum,
time& lastlogin, char *lasthost );
查询网友基本信息。
// 特权指令,函数在完成功能前,先判断权限。
int QueryPriData( const char * userid, char *email,
char *addr );
查询基本信息,普通人只能查自己,有特权才能查其他人。
int ModifyUserLevel( BOOL isAdd, unsigned long level );
修改用户的权限,
int ModifyUserId( char *oldid, char *newid );
char *newemail, char *newaddr );
修改用户的基本数据。
int ModifyUserNumdata( char *userid, int addlogin, int addpost );
修改用户的文章数等数据。
int ModifyUserPasswd( char *userid, char *newpasswd );
修改用户的密码。
}
以上各个函数难度不大,都是执行相应的sql语句,访问mysql数据库,
是否将一般指令归到特权指令中去呢?权限的检查,是放在这一层还是上一层?
这更多的是看考虑的着重点,是看程序的清晰性还是代码的简练,可能还是
看代码吧,毕竟要考虑访问量,另外,上层服务层是否也应该考虑权限检查
问题呢?
[!--infotagslink--]

相关文章

  • 浅谈Spring Cloud Netflix-Ribbon灰度方案之Zuul网关灰度

    这篇文章主要介绍了浅谈Spring Cloud Netflix-Ribbon灰度方案之Zuul网关灰度,想了解Ribbon灰度的同学可以参考下...2021-04-09
  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 最炫Python烟花代码全解析

    2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • python-for x in range的用法(注意要点、细节)

    这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • python实现b站直播自动发送弹幕功能

    这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
  • gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • mybatis的Configuration详解

    这篇文章主要介绍了mybatis的Configuration详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • python Matplotlib基础--如何添加文本和标注

    这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26
  • Json格式详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成...2021-11-05
  • iOS设置UIButton文字显示位置和字体大小、颜色的方法

    这篇文章给大家分享了iOS如何设置UIButton的文字显示位置和字体的大小、颜色,文中给出了示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起看看吧。...2020-06-30
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25