用PHP创建动态图形

 更新时间:2016年11月25日 17:36  点击:1458
PHP有一个令人惊讶的能力——你可以利用它的服务器端脚本创建动态图形。这项功能的基础是GD库,它是由Thomas Boutell设计的ANSI C库,这个库支持除.GIF文件之外的绝大多数常见图形文件格式(不过该库的设计者许诺当LZW专利在2004年7月7日到期后就立即添加.GIF支持)。
PHP4.3以及它的更高版本集成了GD库。如果你使用的是老版本的PHP,你需要手工安装图形支持。这儿有许多与之有关的信息。
折线图
为了演示如何用PHP创建动态图形,我们建立一些自定义图形。第一个例子是画在网格上的折线图,如图A所示。
图A
我们把这个页面叫着grid.php(相关附件:清单A)。为了调用Web页动态产生的图形,你只需要访问这个PHP页,它将该图形传递到浏览器。IMG元素可以很好的完成这项工作。下面是实现这个功能的例子代码:
<imgsrc="grid.php" />
现在,我们开始编写用于创建图形的代码。下面是grid.php中源代码片断:
<?
//添加图形的值
$graphValues=array(0,80,23,11,190,245,50,80,111,240,55);
首先,我们定义图形的值。在这个例子中,图形值直接写到代码中的一个数组中,不过你可以很容易改写代码,让代码从XML文件、表格或者数据库中获取这些值。这些值的范围从0到250(以象素为单位的图形尺寸)。这些值将决定每个网格上线段的初始象素位置。如果你想使用数值0和100(用百分比表示),你只需把这些值乘以2.5来决定网格上的象素位置。
然后,我们发送一个PNG头并定义图像的高度和宽度:
// Define .PNG image
header("Content-type: image/png");
$imgWidth=250;
$imgHeight=250;
我们发送一个图形头来“欺骗”浏览器,使它认为我们的PHP页面是一幅真正的图像,这样它才可以正确显示在屏幕上。服务器将以二进制数据流的形式把程序产生的信息发送到浏览器。
PNG(Portable Network Graphic,便携式网路图形)标准是一种无损的图形格式,它由于GIF的 LZW算法专利这一法律问题而在1995年提出来的。
现在,我们例化图形对象并定义我们在图形中用到的颜色:
//创建图像、定义颜色
$image=imagecreate($imgWidth, $imgHeight);
$colorWhite=imagecolorallocate($image, 255, 255, 255);
$colorGrey=imagecolorallocate($image, 192, 192, 192);
$colorBlue=imagecolorallocate($image, 0, 0, 255);
我们设置白色背景,灰色画框以及蓝色折线。你可以通过创建新变量并赋不同的RGB值来轻松的修改或者添加颜色。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Paging Test</TITLE>
<META NAME="Generator" CONTENT="TextPad 4.0">
<META NAME="Author" CONTENT="?">
<META NAME="Keywords" CONTENT="?">
<META NAME="Description" CONTENT="?">
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
<?php
// How to split the result into pages, like 'limits' in MySQL?
// ===========================================================
// Tutorial by Neil Craig (neilc@netactive.co.za)
// Date: 2001-06-05
// With this example, I will explain paging of database queries where the
// result is more than the developer want to print to the page, but wish to
// split the result into seperate pages.
// The table "SAMPLE_TABLE" accessed in this tutorial has 4 fields:
// PK_ID, FIELD1, FIELD2 and FIELD3. The types don't matter but you should
// define a primary key on the PK_ID field.
$display_rows = 5; // The rows that should be display at a time. You can
// modify this if you like.
// Connect to the Oracle database
putenv("ORACLE_SID=purk");
putenv("ORACLE_HOME=/export/oracle8i");
putenv("TNS_ADMIN=$ORACLE_HOME/network/admin");
$OracleDBConn = OCILogon("purk","purk","lengana.world");
// This query counts the records
$sql_count = "SELECT COUNT(*) FROM SAMPLE_TABLE";
// Parse the SQL string & execute it
$row_count=OCIParse($OracleDBConn, $sql_count); OCIExecute($row_count);
// From the parsed & executed query, we get the amount of records found.
下面是通过createNode()函数,添加商品, 然后显示添加后的结果
<?xml version="1.0" encoding="GB2312" ?>
<shop>
<name>华联</name>
<address>北京长安街-9999号</address>
<desc>连锁超市</desc>
<telphone>123456789</telphone>
<cat id="food">
<goods id="food11">
<name>food11</name>
<price>12.90</price>
<leaveword author="hahawen" date="2004-12-05">这个商品不错</leaveword>
</goods>
<goods id="food12">
<name>new food12</name>
<price>22.10</price>
</goods>
<goods id="food13">
<name>food13</name>
<price>100</price>
</goods>
</cat>
<cat>
<goods id="tel21">
<name>tel21</name>
<price>1290</price>
</goods>
</cat>
<cat id="coat">
<goods id="coat31">
<name>coat31</name>
<price>112</price>
</goods>
<goods id="coat32">
<name>coat32</name>
<price>45</price>
</goods>
</cat>
<special id="hot">
<goods>
<name>hot41</name>
<price>99</price>
</goods>
</special>
</shop>
  下面是通过removeNode()函数,删除商品, 然后显示删除后的结果
<?xml version="1.0" encoding="GB2312" ?>
<shop>
<name>华联</name>
<address>北京长安街-9999号</address>
<desc>连锁超市</desc>
<telphone>123456789</telphone>
<cat id="food">
<goods id="food11">
<name>food11</name>
<price>12.90</price>
<leaveword author="hahawen" date="2004-12-05">这个商品不错</leaveword>
</goods>
<goods id="food13">
<name>food13</name>
<price>100</price>
</goods>
</cat>
<cat>
<goods id="tel21">
<name>tel21</name>
<price>1290</price>
存储过程(procedure.sql):
  create procedure hello
      @yourname varchar(50) = "无名士"
  as
  select @yourname + ",你好!"
  go
PHP3程序(procedure.php3):
  <?
  $server = mssql_connect("localhost","sa","") or die("无法连接数据库服务器!");
  $db = mssql_select_db("test",$server) or die("无法连接test数据库!");
  echo "<table border="1" cellspacing="0" cellpadding="0">";
  echo "<tr>";
  $query = "exec hello @yourname="朋友"";
  $rst = mssql_query($query,$db) or die("无法执行SQL:$query");
  $fields_num = mssql_num_fields($rst);
  $i=0;
  while($i<$fields_num){
          $fields[$i] = mssql_field_name($rst,$i);
          echo "<th>" . $fields[$i] . "</th>";
          $i++;
  }
  echo "</tr>";
  while ($record=mssql_fetch_array($rst)) {
       echo "<tr>";
       $i=0;
       while($i<$fields_num){
       $value = $record[$fields][$i]];
       if($value=="")
          echo "<td> </td>";
       else
          echo "<td>" . $value    . "</td>";
       $i++;
       }
       echo "</tr>";
  }
  mssql_free_result($rst);
  echo "</table>";
  
  mssql_close($server) or die("无法与数据库服务器断开连接!");
  ?>

关于 PHP 的数据库 API 对于不同的数据库有不同的函数,一直以来就有人尝试使用 PHP 的面向对象的功能进行一些封装。其中有比较著名的ADODB,PHPLIB。后来举世瞩目的 PEAR 项目中的 PEAR DB 更是其中的佼佼者。这些用面向对象对数据库 API 进行的封装的包一般称为数据库抽象层。
本文介绍的是 PEAR 中对 PEAR DB 进行融合 Metabase 库的一些优秀功能之后产生的注重效率,而且简单易用,功能非常强大的 MDB 的一个非常好的介绍。作者就是 MDB 的主创人员。
想获得我最近关注的 PHP/PEAR 的最新原创和译文,请访问我的主页
Write once - run anywhere
一次编写??随处运行
PEAR MDB Database Abstraction Layer
PEAR MDB 数据库抽象层
作者:Lukas Smith
译者:taowen
While this is a Java marketing phrase it is also a key feature of PHP. Many business models depend on operation system independence to ensure that products can be sold to a wide range of customers. So why lock yourself in with a specific database vendor? Database abstraction layers allow you to develop your application independent of a database. But often they eat more performance than you are willing to give or they do not abstract enough to eliminate all database specific code.
这是Java的一句行销口号,但是它同时也是PHP的关键特性之一。许多商业模型依赖于操作系统无关性来保证产品能够销售给广泛的客户群体。因而,为什么要把你自己绑在某种数据库厂商的身上呢?数据库抽象层使得你能够与数据库独立的开发你的应用程序。但是,通常情况下它们对性能的影响超过了你所希望的,要么他们并不足够抽象以消除所有和特定数据库相关的代码。
What will this article teach me?
这篇文章将教给我什么?
This article will give a good introduction to the database abstraction package PEAR MDB. The focus will be explaining the more advanced features of MDB like data type abstraction and the XML based schema management that go beyond what other similar packages offer. A basic level of understanding of PHP and SQL is recommended.
这篇文章将对数据库抽象包 PEAR MDB 有一个很好的介绍。文章的焦点将是对 MDB 超越类似包所提供的更先进的特性,例如数据类型抽象和基于 XML 的 schema 管理。对 PHP 和 SQL 的基本理解是推荐的。
[!--infotagslink--]

相关文章

  • ps动态环绕动画效果怎么制作

    ps动态环绕动画效果是现在很多人都非常喜欢的,大多数人还不知道ps动态环绕动画效果怎么制作下面文章就给大家介绍下ps怎么制作科技感十足的动态环绕动画效果,一起来看看...2017-07-06
  • vue 实现动态路由的方法

    这篇文章主要介绍了vue 实现动态路由的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-06
  • Vue实现动态查询规则生成组件

    今天我们来给大家介绍下在Vue开发中我们经常会碰到的一种需求场景,本文主要介绍了Vue动态查询规则生成组件,需要的朋友们下面随着小编来一起学习学习吧...2021-05-27
  • PS怎么排除重叠图形

    PS排除重叠形状是什么意思?很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍介绍一下,不会的朋友可以参考本文,来看看吧。 步骤:1、在PS中,选择“矩形工具...2016-12-31
  • JavaScript动态创建div属性和样式示例代码

    1.创建div元素: Javascript代码 复制代码 代码如下: <scripttypescripttype="text/javascript"> functioncreateElement(){ varcreateDiv=document.createElement("div"); createDiv.innerHTML="Testcreateadiveleme...2013-10-13
  • c#动态调用Webservice的两种方法实例

    这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25
  • SQL Server中执行动态SQL

    本文详细讲解了SQLServer中执行动态SQL的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2022-05-19
  • C#中动态显示当前系统时间的实例方法

    想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
  • jQuery为动态生成的select元素添加事件的方法

    下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
  • JS创建Tag标签的方法详解

    这篇文章主要介绍了JS创建Tag标签的方法,结合具体实例形式分析了javascript动态操作页面HTML元素实现tag标签功能的步骤与相关操作技巧,需要的朋友可以参考下...2017-06-15
  • jQuery动态添加与删除tr行实例代码

    最近由于项目的需要,需要动态的添加和删除table中的tr,感觉用JS可以实现,但是在网上找了一下,单纯的自己写JS,感觉太麻烦,而且也不好维护。于是想到了最近学的jQuery。这篇文章给大家用实例介绍了jQuery动态添加与删除tr行的方法,有需要的朋友们可以参考借鉴。...2016-10-20
  • C#实现动态显示及动态移除图片方法

    这篇文章主要介绍了C#实现动态显示及动态移除图片方法,对于C#的初学者了解图像操作有一定的帮助,需要的朋友可以参考下...2020-06-25
  • 用C++面向对象的方式动态加载so的方法

    下面小编就为大家带来一篇用C++面向对象的方式动态加载so的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • PS如何创建变形文字 ps给文字变形的方法

    PS怎么创建变形文字?ps中想要给输入的文字变形,该怎么调整文字的显示形态呢?下面我们就来看看ps给文字变形的方法,需要的朋友可以参考下 我们在图层上输入文字后,可以...2017-07-06
  • idea 无法创建Scala class 选项的原因分析及解决办法汇总

    这篇文章主要介绍了idea 无法创建Scala class 选项的解决办法汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Springboot使用thymeleaf动态模板实现刷新

    这篇文章主要介绍了Springboot使用thymeleaf动态模板实现刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-31
  • vue2 中如何实现动态表单增删改查实例

    本篇文章主要介绍了vue2 中如何实现动态表单增删改查实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-06-15
  • php创建无限级树型菜单

    写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多程序运行效率很有帮助.。 大概步骤如下: step1:到数据库取数据,放到一个数组, step2:把数据转化为一个树型状的数组, step3:把这个树型状的数组转为html代码。...2015-11-08
  • R语言学习ggplot2绘制统计图形包全面详解

    这篇文章主要为大家详细介绍了R语言学习ggplot2绘制统计图形包的全面知识讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-11-06