PHP新手上路(十四)

13.1 生成图像

  PHP可以操作处理图像。如果你已经安装了GD库,你甚至可以利用PHP生成图像。
<?
Header("Content-type: image/gif");
$string=implode($argv," ");
$im = imagecreatefromgif("images/button1.gif");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImageGif($im);
ImageDestroy($im);
?>

(译者注:以上代码段缺少注释,请读者参考PHP Manual的图像处理函数部分)

  这段代码在其他页面中通过以下标记<img src=http://www.163design.net/p/a/"button.php3?text">调用,然后以上的那段button.php3代码取得text值并在另外取得的图像文件中加上该值--在以上的代码中该图像文件是images/button1.gif--最后输出到浏览器。假如你想在表单域中使用图像按钮,但是又不希望在每次按钮上的文字改变后不得不重新生成新的图像,就可以利用这样简单的方法动态生成图像文件。

13.2 Cookies

  PHP支持基于HTTP的cookies。在需要时你可以像使用一般变量一样方便的使用cookie。Cookies是浏览器保存于客户端的一些信息片段,由此你可以知道是否一台特定PC上的任何人都访问过你的站点,浏览者者在你的站点上的踪迹等等。使用cookies的典型例子就是对浏览者偏好的甄别。Cookies由函数setcookie()设定。与输出HTTP标头的函数header()一样,setcookie()必须在任何实际内容杯输出到浏览器之前调用。以下是一个简单例子:

<?
if (empty($VisitedBefore))
{
// 如果没有设定cookie,为cookie赋上当前时间值
// 函数中的最后一个参数声明了该cookie保存的时间
// 在这个例子中是1年
// time()函数返回自1970年1月1日以来的以秒数计的时间
SetCookie("VisitedBefore",time(), time()+(60*60*24*365));
}
else
{
// 欢迎浏览者再次光临
echo "Hello there, welcome back<BR>";
// 读取cookie并判断
if ( (time() - $VisitedBefore) >= "(60*60*24*7)" )
echo "Why did you take a week to come back. You should be here more often!? ";
}
?>

13.3 常用函数

我们简单来看看一些常用的函数。

数组

array - 生成数组
count - 数组元素个数
sort - 数组排序,另有其他几种排序函数可供使用
list - 列出数组元素
each - 返回下一个key/value对
current - 返回当前数组元素
next,prev - 传回当前数组元素前后指针

日期和时间

checkdate - 验证日期/时间格式
date - 生成日期/时间格式
time - 当前时间信息
strftime - 格式化日期/时间

目录、文件系统

chdir - 改变目录
dir - 目录类别
opendir, readdir, closedir - 开启、读取、关闭目录
fopen, fclose - 开启、关闭文件
fgets, fgetss - 逐行读取内容
file - 将整个文件读入一个数组变量中

正则表达式

ereg - 匹配正则表达式
eregi - 大小写非敏感匹配正则表达式
ereg_replace -匹配正则表达式并替换
eregi_replace -大小写非敏感匹配正则表达式并替换
split - 依规则切开字符串并以数组形势存储

字符串

AddSlashes - 加上斜杠后使用字符串
echo - 输出一个或多个字符串
join, implode - 将数组元素合并为字符串
htmlentities, htmlspecialchars - 将HTML特殊字符转换为HTML标记形式
split - 依规则切开字符串并以数组形势存储

13.4 扩展我们的范例主页

  我们将使用以上提到的一些函数和思想为我们的范例主页添加更多的动态内容。我们可以在每个页面的顶部加上导航栏,同时使得当前页自动的不被链接显示;同时还可以添加一个用户验证表单以便上传音乐、图像等文件并自动更新页面。

导航栏

  实际上就是在footer.inc文件中加上一段代码。假设你的web站点中所有后缀为.php3的文件都会出现在导航栏中,以下就是被存为include/navbar.inc的代码:

<?
/* 输出该导航栏,链接所有除当前页的站内.php3文件 */
# 读取目录
$d = dir("./");
echo "<P ALIGN="CENTER"> | n";
while($entry = $d->read())
{
// 忽略无文件情况
if ( !is_file($entry) )
continue;
/* 将文件名与扩展名分开。由于.是正则表达式特殊字符,应该用引出 */
list($filenm, $fileext) = split(".",$entry, 2);
// 忽略非.php3文件情况
if( $fileext != "php3" )
continue;
/* 现在我们已经把.php3文件都选出,下面搜寻文件中的第一行(标题)
类似$title="something";
并将以上标题内容分开,用作链接文字 */
$linknm = "";
$fp=fopen($entry,"r");
while($buffer=fgets($fp, 4096))
{
$buffer = trim($buffer);
// 我们已经把每个文件的标题放在文件的第一行以便搜索
// 但是当你改变变量名称时可能会带来大麻烦
if (ereg("title *= *"", $buffer))
{
/* 我们已经取得了标题内容并可以在此基础上
进行去除空格等处理。
必须以PHP代码方式处理,比如$title = "blah blah" */
eval($buffer);
// 然后将链接文字显示为标题文字
$linknm = $title;
break;
}
}
fclose($fp);
if ( $entry == basename($PHP_SELF) )
echo "$linknm";
else
echo "<A HREF="$entry">$linknm</A>";
echo " | ";
}
$d->close();
echo " </P>n";
?>

照片收藏夹

  我们将引用基于HTTP的验证、文件系统函数和文件上传功能维护放置图像文件的目录。
同时我们需要建立一个可以列出在该目录下所有照片的页面。

文件上传

<?
include("include/common.inc");
// 我们在这里再做一次用户验证
if(!isset($PHP_AUTH_USER))
{
Header("WWW-Authenticate: Basic realm="$MySiteName"");
Header("HTTP/1.0 401 Unauthorized");
echo "Sorry, you are not authorized to upload filesn";
exit;
}
else
{
if ( !($PHP_AUTH_USER==$MyName && $PHP_AUTH_PW==$MyPassword ) )
{
// 如果是错误的用户名称/密码对,强制再次认证
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.<P>";
exit;
}
}
if ( $cancelit )
{
// 当浏览者按下"取消"按钮则转向首页面
header ( "Location: front_2.php3" );
exit;
}
function do_upload () {
global $userfile, $userfile_size, $userfile_name, $userfile_type;
global $local_file, $error_msg;
global $HTTP_REFERER;
if ( $userfile == "none" ) {
$error_msg = "You did not specify a file for uploading.";
return;
}
if ( $userfile_size > 2000000 )
{
$error_msg = "Sorry, your file is too large.";
return;
}
// Wherever you have write permission below...
$upload_dir = "photos";
$local_file = "$upload_dir/$userfile_name";
if ( file_exists ( $local_file ) ) {
$error_msg = "Sorry, a file with that name already exists";
return;
};
// 你还可以由此检查文件名称/类型对以确定是何种文件:gif,jpg,mp3…
rename($userfile, $local_file);
echo "The file is uploaded<BR>n";
echo "<A HREF="$HTTP_REFERER">Go Back</A><BR>n";
}
$title = "Upload File";
include("include/header.inc");
if (empty($userfile) || $userfile=="none")
{
// 输出以下表单
?>
<FORM ACTION="<? echo "$PHP_SELF"; ?>" ENCTYPE="multipart/form-data" METHOD=POST>
<INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="2000000">
<INPUT TYPE="FILE" NAME="userfile" SIZE="24" MAXLENGTH="80">
<BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Upload File!" NAME="sendit">
<INPUT TYPE="SUBMIT" VALUE="Cancel" NAME="cancelit"><BR>
</FORM>
<I><FONT SIZE="2">(You may notice a slight delay while we upload your file.)</FONT></I>
<?
} else {
if ( $error_msg ) { echo "<B>$error_msg</B><BR><BR>"; }
if ( $sendit ) {
do_upload ();
}
}
include("include/footer.inc");
?>

照片图库

<?
include("include/common.inc");
$title = "Gallery";
include("include/header.inc");
?>
<P>
Here are some of our family photos. This PHP script can really
be made better, by splitting into multiple pages.
</P>
<?
$d = dir("photos");
while($entry = $d->read())
{
if (is_file("photos/$entry"))
echo "<IMG SRC="photos/$entry">n";
}
$d->close();
?>
<?
include("include/footer.inc");
?>

  另外,你可以在文件上传的表单中加上一个输入元素去描述该上传的文件。这个元素将被存储在文件中,然后被以上的照片图库的那段代码所读出并显示出来。

== 全文完 ==

时间: 2024-10-03 06:06:39

PHP新手上路(十四)的相关文章

PHP新手上路(四)

4.1 数据类型 PHP支持整数.浮点数.字符串.数组和对象.变量类型通常不由程序员决定而由PHP运行过程决定(真是好的解脱!).当然,如果你喜欢的话,你也可以使用cast或者函数settype()将某种类型的变量转换成指定的类型. 数值 数值类型可以是整数或是浮点数.你可以用以下的语句来为一个数值赋值: $a = 1234; # 十进制数 $a = -123; # 负数 $a = 0123; # 八进制数 (等于十进制数的83) $a = 0x12; # 十六进制数(等于十进制数的18) $a

Silverlight+WCF 新手实例 象棋 主界面-在线用户区(二十四)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 演示已更新到此节介绍:Silverlight+WCF 新手实例 象棋 介绍III(二十三)   这节我们来实现在线用户区的显示,把上两节介绍那张图再弄来,看在线用户区是哪块:   一眼扫过看到了,是第四区,现在开始了,还是上次下棋区域一样的逻辑,往Index.xaml里拉一个Board控件,然后后台写两行代码代码一下. 当然了,得新建一个用户控件:就叫:OnlineUser.xaml,好,空白的在线用户建完了,下面还是两步实

新手上路

问题描述 请问下在这论坛上面怎么下载东西我看了半天都没看到需要积分下载还是什么的 解决方案 解决方案二:有下载频道,去下载频道去下.有的需要积分,有的不需要积分.下载积分.解决方案三:先后找到下面图中的2个按钮:http://hi.csdn.net/attachment/201111/9/139605_1320815592s41G.jpg解决方案四:飘过哈·解决方案五:新手上路危险啊.解决方案六: 解决方案七:我们一样,呵呵,互相鼓励,共同进步解决方案八:新手上路了,大家让开点,被被碰着啦!快闪

c语言-新手上路,求教一个C语言问题

问题描述 新手上路,求教一个C语言问题 C语言,输出n个学生成绩,并把输出的成绩从大到小排序,求代码...... 解决方案 这个书上有吧..... 解决方案二: 代码还是要自己写.不要这样 解决方案三: c语言中的一个问题关于C语言的一个问题一个C语言问题---------------------- 解决方案四: 就用if语句就行了,把学生成绩定为数组,然后从第一个开始与下一个比较,如果前面的小于后面的就交换,就是冒泡法排序. 解决方案五: ? //依次输入10个学生的成绩 #include?"

新手RoR十分钟初体验Step By Step

http://yulimin.javaeye.com/blog/35929 关键字: rails   Ruby Rails RoR     新手RoR十分钟初体验Step By Step 声明一下,这是个新手启动的体验文章,高手不要看了...:) 1.安装RubyWindows用户去 http://rubyforge.org/ 的 http://rubyforge.org/projects/rubyinstaller/ 下载 One-Click Installer - Windows 安装即可,

PHP新手上路基础教程目录

基础教程 PHP新手上路基础入门教程目录清单,本教程由网页教学网收集整理希望对初学PHP的朋友有所帮助,当您转载时别忘了加上本站的连接,谢谢! PHP新手上路基础简介 为什么要选择PHP 从一个简单的程序来了解PHP PHP入门之数据类型 建设一个简单交互的网站(一) 用include和require进行模块化,从HTML到PHP 建设一个简单交互的网站(二) 计数器 反馈表单 站内搜索引擎 建设一个简单交互的网站(三) 密码验证 建设一个简单交互的网站(四) 文件上传 建设一个简单交互的网站(

开发者论坛一周精粹(第十六期):阿里云全球十四个节点评测分析及服务器地域选择攻略

第十六期(2017年7月24日-2017年7月30日 ) 随着阿里云的不断发展,本来首页关于数据中心的图片上只有几个点,而到了现在在海内外均已经部署了非常多的数据中心了,导致小编我为了整理这篇文章,真的是苦不堪言,怎么会那么多数据中心呢! 那么问题又来了,那么多数据中心到底有什么区别?应该如何考虑数据中心的选择?怎么买最优惠? 阿里云全球十四个节点评测分析及服务器地域选择攻略 https://bbs.aliyun.com/read/322581.html 未实名的.com/.net域名即将被暂停

新手上路 看阳台上都能种点啥

你还在沉迷于网络的http://www.aliyun.com/zixun/aggregation/5781.html">开心农场吗?在代女士的眼里这项游戏已经OUT了,要玩就玩真的.没有菜地?没关系,小小的阳台也可以绿意盎然.在阳台上种蔬菜好处多多,不仅能观赏.食用,还能起到净化室内空气.调节空气湿度的作用.那么,阳台种菜需要注意啥?为此,记者采访了种菜达人代女士,让我们跟她一起,实现"有点田"的生活理想吧! 新手上路 看阳台上都能种点啥 阳台能种什么菜?这由两方面决定

十四个方法提高博客的页面访问量

看到别人翻译的一篇文章,是讨论如何提高博客访问量的,提到的有几个方法蛮有新意,不过不赞成原文的"在聚合中只输出摘要"的方法. 十四个方法提高博客的页面访问量 作者:Darren Rowse,翻译:Lucifer 如何增加Blog的访问量已经是老生长谈了,其实对于blogger来说另一个统计数也至关重要:页面浏览量. 很多的网站流量统计服务会同时提供这两项数据- "访问量"计数的是访问者的数目,而页面浏览量算的则是这些访问者所浏览的你blog上的网页的数目. 对不同b

十四 定义列表 Definition Lists

十四 定义列表 Definition Lists前面讲述了无序列表和有序列表,但一些像Peter Cushing's Doctor,经常忘记定义列表.这也许是因为它们和无序列表.有序列表比起来比较特殊而且没有用处.但一些列表条件和表述(像术语表),就必须使用定义列表. dl元素像ul和ol元素,建立列表,不过比它们两个多了一个dt元素用来definition term定义条件,接下来的dd定义表述definition description. 一个dt不仅仅只跟一个dd,互相之间可以有好多个.例