写了一个jquery.imagesview插件,支持图片拖动、缩放类似ACDSEE效果

     做项目的时候客户总是比较关心前台界面,这不最近又遇到一个难缠的客户。要求在前台的缩略图点开后查看高分辨率的图片,并且最好能像ACDSEE那样方便浏览,支持拖动、按比例放大缩小。

     这样的效果记得在SINA的某个栏目看到过,影响中好像是FLASH做的,我很多年没碰过FLASH了,对现在的ACTION脚本不是很熟悉,于是想到结合JQUERY来实现,JQUERY的ThickBox支持图片浏览但不是客户要的效果,在GOOGLE搜索了半天没找到一个好用的JS代码,只好自己来写了。

     先看效果(点下面的图片和连接即可


同样支持文字连接

支持 IE 7+、FireFox 1.5+ (PC, Mac)、Safari2+、Opera9+、Chrome0.3+

     

   我测试了一下应该在 谷歌浏览器、IE7、FIREFOX3.0 下都能看到效果的,呵。。

   为了给大家展示这个效果可费了我不少时间,主要是这个博客不支持在内容里定义CSS样式文件。

       而且CNBLOGS后台编辑对 Chrome 支持不是很好,只好开N个浏览器来回折腾~~

   看不到效果的只好看下面这张图了:

 


   相关文件(文章最后的附件中都有这些文件): 

————————————————————————————————        imagesview.css   –样式文件

   imagesview.js   –ImageView JS文件 

   toolsico.gif      –按钮图标

   loadingAnimation.gif  –加载动画

   jquery.js      –JQUERY脚本库,请使用jQuery 1.2.6 以上版,否则拖动有点问题

  

   使用方法:

————————————————————————————————  

   页面头部引用 imagesview.css、imagesview.js、jquery.js即可(两个GIF图片文件和CSS文件放在同一目录)

   图片连接: <a href=”images/rs4.jpg” class=”imagesview” title=”ImageView code by jinks.zhang”><img src=”images/rs4a.jpg” /></a>

   文字连接:<a href=”images/rs4.jpg” class=”imagesview” title=”ImageView code by jinks.zhang”>同样支持文字连接</a>

   其中 class=”imagesview”  是必须的,title=”。。”  这里是标题,可以不定义。

 

   所有相关文件附件中提供下载:
          附件: jquery.imagesview.rar

mysql数据库大小的限制

使用PHP实现的程序.花了一个下午去完成…
只是做出来让大家参考一下…献丑了….

程序思路:
一\与MYSQL数据库结合.先在MYSQL数据库另起一个库.记录数据库的库名,对应的用户名,限制的大小.等…..
二\系统检测数据库大小,然后对比记录着的资料.对比是否超过流量.如果超过流量就使用MYSQL的ROOT权.限制用户对该数据库的权限…(删除UPDATE\INST..等)
三\如果达到80%.就向管理员\用户各发送一个EMAIL通知..
四\前台程序控制数据库资料的整理…

系统分二个部份.

第一部份.是系统定时检测数据库大小,再根据检测结果与数据库资料.判断数据库是否超大….该部份操作需要有MYSQL高权限用户去完成(建议ROOT).用该文件需要定时运行.,但该文件可以放在网站访问不到的保密地方…

所有文件.打包下载.
http://www.xingkong.biz/mysql_limit.zip

  CODE: [Copy to clipboard]  
<?php
//设置部分
$id=mysql_connect(‘localhost’,’user’,’password’);   //最好是使用root,或者高权限用户

//FUN部份
function PMA_backquote($a_name, $do_it = TRUE)   // 取自phpmyadmin,用来格式化数据库名
{
        if ($do_it
            && !empty($a_name) && $a_name != ‘*’) {

            if (is_array($a_name)) {
                 $result = array();
                 reset($a_name);
                 while(list($key, $val) = each($a_name)) {
                     $result[$key] = ‘`’ . $val . ‘`’;
                 }
                 return $result;
            } else {
                return ‘`’ . $a_name . ‘`’;
            }
        } else {
            return $a_name;
        }
} // end of the ‘PMA_backquote()’ function

function limit($user,$db)   //达到限制限制用户权限后运行的程序
{
        $query=’REVOKE INSERT ,UPDATE ,CREATE ON “‘.$db.'”.* FROM “‘.$user.’@localhost’;//将insert update create的权限移走。01/17修正大BUG
        $result      = @mysql_query($query);//changed! only 1 query….
        //相应的权限代码可以再更改.
        //echo ‘lim.debug’;exit;
}

function warning($name,$email)   //超过80%时通知用户
{
        $admin_email=’admin@admin.com’;     //管理员EMAIL地址。请更改
        $message=’MYSQL用户:’.$name.’的数据库已超过系统允许的大小的80% /n 请及时整理数据’;   //通知的内容可以更改
        @mail($admin_email,’MYSQL报告’,$message,’from:mysql@admin.com’);
        @mail($email,’MYSQL大小警告’,$message,’from:mysql@admin.com’);
        //echo ‘warning.debug’;exit;
}

//以下一段内容来自phpMyAdmin的查询每个数据库大小的程序
$dbs     = mysql_list_dbs() ;
while ($a_db = mysql_fetch_object($dbs)) {        //查询数据名,以后一段代码来自phpmyadmin
        $dblist[] = $a_db->Database;
} // end while
mysql_free_result($dbs);
$num_dbs = count($dblist);
    $total_array[0] = 0;        // number of tables
    $total_array[1] = 0;        // total data size
    $total_array[2] = 0;        // total index size
    $total_array[3] = 0;        // big total size

    // Gets the tables stats per database
    for ($i = 0; $i < $num_dbs; $i++) {
        $db         = $dblist[$i];
        $tables     = mysql_list_tables($db);

        // Number of tables
        if ($tables) {
            $dbs_array[$db][0] = mysql_numrows($tables);
            mysql_free_result($tables);
        } else {
            $dbs_array[$db][0] = 0;
        }
        $total_array[0]    += $dbs_array[$db][0];

        // Size of data and indexes
        $dbs_array[$db][1] = 0; // data size column
        $dbs_array[$db][2] = 0; // index size column
        $dbs_array[$db][3] = 0; // full size column

        $local_query = ‘SHOW TABLE STATUS FROM ‘ . PMA_backquote($db);
        //echo  $db;
        $result      = @mysql_query($local_query);
            // needs the “@” below otherwise, warnings in case of special DB names
            if ($result ) {
                    while ($row = mysql_fetch_array($result)) {
                    $dbs_array[$db][1] += $row[‘Data_length’];
                    $dbs_array[$db][2] += $row[‘Index_length’];
                }
                $dbs_array[$db][3]     = $dbs_array[$db][1] + $dbs_array[$db][2];
                $total_array[1]        += $dbs_array[$db][1];
                $total_array[2]        += $dbs_array[$db][2];
                $total_array[3]        += $dbs_array[$db][3];
          //      echo $dbs_array[$db][3].”<br>”;
                mysql_free_result($result);
         } // end if
} // end for
//查询数据库完毕。
   
   
//以下代码用来判断数据库大小是否达到限制等。。。。
mysql_select_db(‘db_limit’,$id);   //db_limit数据库名可自由更改。但需要与其它程序保持一致

for ($i = 0; $i < $num_dbs; $i++) {
        $db=$dblist[$i];
        $query=’select * from dbs where db_name=”‘.$db.'”‘;
        $result=mysql_query($query);
        if ($result)
        {
                $dbs_limit=mysql_fetch_array($result);
                $limit_size=$dbs_limit[‘db_limit_size’];
                $user=$dbs_limit[‘db_user’];
                $limited=$dbs_limit[‘db_has_limit’];
                $used_size=$dbs_limit[‘db_size_used’];
                $email=$dbs_limit[‘db_email’];
                $warning_size=$limit_size*0.8;         //0.8=80%,你可以更改为其它比例
                if ($user!=”){                        //这
                        if ($dbs_array[$db][3] > $limit_size)
                        if ($dbs_array[$db][3] > $warning_size) warning($user,$email);
                        $query=’update dbs set db_has_limit=”‘.$limited.'” , db_size_used=”‘.$dbs_array[$db][3].'” where db_name=”‘.$db.'”‘;
                        $result=mysql_query($query);         //更新数据库大小至数据资料库
                }
                //echo $query;exit;
        }
}
mysql_close($id);
//欢迎大家加以修改。但改完后。请到http://www.discuz.net/forumdisplay.php?fid=34发表修改结果
?>

第二部份为前台管理系统.
这只是最简单的作品.请大家尽快做一个更好的前台出来..

main.php

  CODE: [Copy to clipboard]  
<?
//Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($adpass==$adminpass)
{
        $admin=’ok’;
        session_register (“admin”);$admin=’ok’;
}       
if ($admin==”)
{
        ?>
<html>
<head>
<title>管理</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
</head>
<body>
        <form  method=”post” action=”main.php”>
        请先登陆,管理密码是:<input type=’text’ name=”adpass”>
        <input type=”submit” name=”Submit” value=”进入”>
        </form></body></html>
        <?
        exit;
}
?>
<frameset rows=”15%,*” frameborder=”NO” border=”0″ framespacing=”0″>
  <frame src=”./menu.html” name=”topFrame” >
  <frame src=”./list.php” name=”main”>
</frameset>

add.php

  CODE: [Copy to clipboard]  
<?
//Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
        echo ‘<a href=”main.php”>login first</a>’;
        exit;
}
if ($db_name!=”)
{
        $id=mysql_connect(“localhost”,$user,$pass);
        mysql_select_db(‘db_limit’,$id);
        $query=”insert into dbs values (‘$db_name’,’$db_user’,’$email’,’$db_limit’,”,”)”;
        $result=mysql_query($query);
        echo “insert success “;
        mysql_close($id);
}       
?>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>添加用户到数据库</title>
</head>
<body>
<p>添加用户到数据库</p>
<form  method=”post” action=”add.php”>
数据库名:<input type=”text” name=”db_name”><br>
用户名:<input type=’text’ name=”db_user”><br>
限制的大小:<input type=’text’ name=”db_limit”>字节<BR>
通知的EMAIL:<input type=’text’ name=”email”><BR>
<input type=”submit” name=”Submit” value=”添加”>
</form>
</body>
</html>

config.php

  CODE: [Copy to clipboard]  
<?
//Bendy 的mysql限额前台程序
$user=”root”;       //该用户只需要对系统的db_limit数据库有访问权.不需要ROOT权
$pass=”123654″;     //密码
$adminpass=”bendy”; //进入前台的管理密码
?>

list.php

  CODE: [Copy to clipboard]  
<?
//Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
        echo ‘<a href=”main.php”>login first</a>’;
        exit;
}
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
?>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>list</title>
</head>
<body>
<table width=”100%” border=”2″ >
  <tr>
    <td width=”15%” height=”21″>数据库名</td>
    <td width=”15%”>用户名</td>
    <td width=”15%”>限额</td>
    <td width=”15%”>已用</td>
    <td width=”10%”>EMAIL</td>
    <td width=”10%”>限制</td>
    <td width=”10%”>修改</td>
    <td width=”10%”>删除</td>
  </tr>
<?
$query=”select * from dbs”;
$result=mysql_query($query);
while ($list=mysql_fetch_array($result))
{
        if ($list[‘db_has_limit’]==’1′)
        {$limit='<a href=./fix.php?dbname=’.$list[db_name].’><font color=red>是|重开</font></a>’;} //change for fix.php
        else
       
        echo “<tr><td>$list[db_name]</td><td>$list[db_user]</td><td>$list[db_limit_size]</td><td>$list[db_size_used]</td><td>$list[db_email]</td><td>$limit</td><td><a href=edit.php?dbname=$list[db_name]>修改</a></td><td><a href=del.php?dbname=$list[db_name]>删除</a></td><tr>”;
}
?>
</table>
</body>
</html>

edit.php

  CODE: [Copy to clipboard]  
<?
//Bendy 的mysql限额前台程序
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
        echo ‘<a href=”main.php”>login first</a>’;
        exit;
}
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
if ($dbname==”)
{
        echo “edit what? goto <a href=list.php> list </a>”;
        exit;
}
if ($submit!=”)
{
        $query=”update dbs set db_user=’$dbuser’,db_limit_size=’$limit’,db_email=’$email’ ,db_has_limit=’0′ where db_name=’$dbname'”;
        $result=mysql_query($query);
        echo “edit success? goto <a href=list.php> list </a>”;
        exit;
}
       
$query=”select * from dbs where db_name=’$dbname'”;
$result=mysql_query($query);
$edit=mysql_fetch_array($result);
?>

<form  method=”post” action=”edit.php”>
数据库名:<?=$dbname?><br>
用户名:<input type=’text’ name=”dbuser” value=”<?=$edit[db_user]?> “><br>
限制的大小:<input type=’text’ name=”limit” value=”<?=$edit[db_limit_size]?>”>字节<BR>
通知的EMAIL:<input type=’text’ name=”email” value=”<?=$edit[db_email]?> ” ><BR>
<input type=’hidden’ name=”dbname” value=”<?=$dbname?>”>
<input type=”submit” name=”submit” value=”更改”>
</form>
</body></html>

del.php

  CODE: [Copy to clipboard]  
<?
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
        echo ‘<a href=”main.php”>login first</a>’;
        exit;
}
$id=mysql_connect(“localhost”,$user,$pass);
mysql_select_db(‘db_limit’,$id);
if ($dbname==”)
{
        header(“location:list.php”);
        exit;
}
$query=”delete from dbs where db_name=’$dbname'”;
$result=mysql_query($query);
echo “delete success ,goto <a href=list.php> list </a>”;
?>

还有!!!
在MYSQL建立一个
db_limit
的数据库.
导入以下内容

  CODE: [Copy to clipboard]  
# database : `db_limit`
CREATE TABLE `dbs` (
  `db_name` varchar(64) NOT NULL default ”,
  `db_user` varchar(64) NOT NULL default ”,
  `db_email` varchar(64) NOT NULL default ”,
  `db_limit_size` int(10) NOT NULL default ‘0’,
  `db_has_limit` int(10) NOT NULL default ‘0’,
  `db_size_used` int(10) NOT NULL default ‘0’
) TYPE=MyISAM;

MENU.html

  CODE: [Copy to clipboard]  
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>menu</title>
</head>

<body>
<table width=”100%” border=”5″>
  <tr>
    <td><div align=”center”><a href=”./list.php” target=”main”>列表</a></div></td>
    <td><div align=”center”><a href=”./add.php” target=”main”>添加</a></div></td>
  </tr>
</table>
</body>
</html>

  QUOTE:
引用自uplinux 的
就算利用 php 来写检测,也仍然可以实现自动运行的。
crobtab

* 0 * * * /usr/lcoal/php4/bin/php  /home/master/mysql.php

将本系统的脚本放在一个安全的地方.(如果可以让网页访问.也可以,这样的好处是用户可以随时更新信息)

每天0点执行这个php脚本,PHP 文件中想怎么写就怎么写了。

加一个程序

init.php快速建立数据库资料系统

  CODE: [Copy to clipboard]  
<?php
//初始数据库系统,使用本程序。可以快速建立本地用户系统资料库。
//暂时只能快速建立数据库名=用户名的系统。有意者。可以建立数据库名与用户名不同的资料库。。。。。

$id=mysql_connect(‘localhost’,’user’,’password’);   //最好是使用root,或者高权限用户
$dbs     = mysql_list_dbs() ;
while ($a_db = mysql_fetch_object($dbs)) {        //查询数据名,以后一段代码来自phpmyadmin
        $dblist[] = $a_db->Database;
} // end while
mysql_free_result($dbs);
$num_dbs = count($dblist);
mysql_select_db(‘db_limit’,$id);
$init_size=’100000000′;                           //初始限制大小(字节数)
for ($i = 0; $i < $num_dbs; $i++) {
        $query=”insert into dbs values (‘$dblist[$i]’,’$dblist[$i]’,”,’$init_size’,”,”)”;
        $result=mysql_query($query);       
}
mysql_close($id);
?>

补充一个….恢复用户权限..

  CODE: [Copy to clipboard]  
<?
$admin=”;session_start();
require (“./config.php”);
if ($admin==”)
{
        echo ‘<a href=”main.php”>login first</a>’;
        exit;
}
$id=mysql_connect(“localhost”,’root’,’rootpass’);   //这里需要ROOT权限!!!
mysql_select_db(‘db_limit’,$id);
if ($dbname==”)
{
        header(“location:list.php”);
        exit;
}
$query=”select * from dbs where db_name=’$dbname'”;
$result=mysql_query($query);
$fix=mysql_fetch_array($result);
$query=’GRANT INSERT ,UPDATE ,CREATE  ON “‘.$fix[db_name].'”.* TO “‘.$fix[db_name].’@localhost’;
$result=mysql_query($query);
$query=”update dbs set db_has_limit=0 where db_name=$fix[db_name]”;
$result=mysql_query($query);
echo “fix success ,but you must change the limit , If not ,system will limit it again! goto <a href=list.php> list </a>”;
?>
Originally posted by zhnag at 2004-1-9 05:46 PM:
http://www.xingkong.biz/mysql_limit.zip

mysql复制表和表结构

一、CREATE TABLE 方法

整表复制 # create table 新表 select * from 旧表;
结构复制 # create table 新表 select * from 旧表 where 1<>1;

二、INSERT INTO 方法

得到建表语句 # show create table 旧表;
新建表
复制数据到新表 # insert into 新表 select * from 旧表;

require和include基本的区别

手册里是这么解释的:

require()   和   include()   除了怎样处理失败之外在各方面都完全一样。include()   产生一个警告而   require()   则导致一个致命错误。换句话说,如果你想在丢失文件时停止处理页面,那就别犹豫了,用   require()   吧。include()   就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。

就是说再解析程序时即读取require的文件,而不是解析后,  

如果不能读取到被require的文件,就不能进行下一步动作。  
所以,不被正确包含就会导致程序的文件,用require比较好。  

可能效率上也略微高点。  
—————————————————————  

require()   无论如何都会包含文件,而   include()   可以有选择地包含:  
<?php  
if(FALSE){  
    require(‘a.php’);    //这个位置会在执行时用此文件代码代替.
}  
if(FALSE){  
    include(‘b.php’);  //根据需要来包含进来
}  
?>  
a.php   一定会被包含,而   b.php   一定不会被包含。

在PHP中include和require到底有什么区别呢?看这里的例子就知道了

:include.php3的运行结果是:
  这是inc1.inc文件中的一个变量的值!
  这是inc2.inc文件中的一个变量的值!
  inc1.inc文件中的$int变量值为1!

require.php3的运行结果是:
  这是inc1.inc文件中的一个变量的值!
  inc1.inc文件中的$int变量值为2!

你可以看到在require.php3中$int变为了2,也就是说inc1.inc中的语句被执行了2次,这样看来在循环中require语句只被解释一次,而且会把require语句所在的位置用require的文件内容替代并运行,而在循环中include语句每次都会被解释运行。

[sonymusic]补充道:
require是只执行一次的,不,这么说不恰当。应当说,require是先替代,将指定文件的内容代进来,再运行,所以它不知道你设置了一FOR循环。而include语句,是什么时候执行到了,什么把指定文件的内容代进来,继续执行。

include.php3
  <html>
  <body>
  <?
  for($i=1;$i<=2;$i++){
      include(“inc$i.inc”);
  }
  echo $var1;
  echo $var2;
  echo ‘inc1.inc文件中的$int变量值为’ . $int . “!<br>”;
  ?>
  </body>
  </html>

require.php3:
  <html>
  <body>
  <?
  for($i=1;$i<=2;$i++){
      require(“inc$i.inc”);
  }
  echo $var1;
  echo $var2;
  echo ‘inc1.inc文件中的$int变量值为’ . $int . “!<br>”;
  ?>
  </body>
  </html>

inc1.inc:
  <?
  $var1 = “这是inc1.inc文件中的一个变量的值!<br>”;
  if(isset($int)){
      $int++;
  }
  else{
      $int = 1;
  }
  ?>

inc2.inc:
  <?
  $var2 = “这是inc2.inc文件中的一个变量的值!<br>”;
  ?>

require和include经典一例抛析

    在php中,include和require的作用比较容易混淆。下面我以一个经典例子来深刻说明它们的区别。
    当我们经常访问一个数据库时,可以把连库语句写成一个文件
con_db.php3
<?php
    $dbh =  mysql_connect(‘localhost’,”,”);
    mysql_select_db(‘admreqs’);
?>
在实际应用时,我们可以在程序中调用这个文件。
如require(“con_db.php3”)或include(“con_db.php3)
这时,两个函数的效果是差不多的。
但如果这样用
filename.php3
<?php
require(“con_db.php3”)
function myfun($par1,$par2)
{包含对数据库处理的语句}
…..
myfun($par1,$par2);
…..
myfun($p1,$p2);
?>
文件到myfun处将不能继续执行,因为函数里无法得到外面的变量(include也是一样的)。除非把$dbh作为一个变量传给函数。这又增加了调用函数的复杂度。
我们可以通过把require或include放在函数里面来解决这个问题。
如果用include,文件的第一个函数调用处将顺利通过,但第二个调用将无法执行,原因是不能在没有关闭数据库时在打开一次,也就是说,con_db.php3执行了两次。将include换成require,一切都正常。
    也就是说,require类似于一次预扫描,在程序执行时,无论在函数里或是函数外,都将先把require的文件执行,且只执行一次。而include则是每执行一次就调用一次文件,即这次执行后,下次再执行执行到这里,仍将再执行一次。
    因此,如果在一个循环中,某些语句你只想执行一次,那你用require包括它们就可以了。

PHP命名空间的分隔符是“\”

PHP最终开始支持namespace(命名空间)。 但是经过开发者几个小时的讨论后,他们决定采用 “\” 作为分隔符,而不是更流行的“ :: ”。Fredrik Holmström指出了这种分隔方法可能会产生的问题,如打字出错(但不会出现错误提示),IDE兼容性问题,字符数字等等,好处则是容易输入和分析。”

PHP的命名空间

  • 摘要:命名变量,函数和类是挺困难的,除了要考虑到变量的名称要易于理解,还要担心是否这个名称在其它某个地方已经使用过. 在一小段脚本中,第二个问题是基本问题. 当你考虑重用你的代码, 在这之后的项目代码必须避免使用你用过的命名. 通常来说,可重用的代码总是包含在函数或类中, 需要处理许多可能发生的命名冲突. 但函数和类之间也可能发生命名冲突. 你可以尝试避免出现这种情况,通过在所有类前添加前缀的方法,或者你可以使用namespace语句.
  • 标签:PHP命名空间  PHP

 

命名变量,函数和类是挺困难的,除了要考虑到变量的名称要易于理解,还要担心是否这个名称在其它某个地方已经使用过. 在一小段脚本中,第二个问题是基本问题. 当你考虑重用你的代码, 在这之后的项目代码必须避免使用你用过的命名. 通常来说,可重用的代码总是包含在函数或类中, 需要处理许多可能发生的命名冲突. 但函数和类之间也可能发生命名冲突. 你可以尝试避免出现这种情况,通过在所有类前添加前缀的方法,或者你可以使用namespace语句.

Namespace关键字给一块代码命名. 在这个代码块外部,脚本必须用操作符::加上命名空间的名称来引用这个代码块. 引用静态的类成员也是用相同的方法. 在命名空间内代码不需要声明命名空间, 它本身就是默认的. 这种方法比添加前缀的方法好. 你的代码可由此变得更加紧凑和可读.

你可能想知道是否可以建立分层的(嵌套的)命名空间. 答案是不可以. 但你可以在命名空间名称后加上冒号, 你可以再次调用在名称中不包含冒号的变量,函数和类. 命名空间允许存在冒号,只要不是第一个字符和最后一个字符或接着另一个冒号. 命名空间的名称中的冒号对于PHP来说没有任何意义, 但如果你用他们来区分逻辑上的区块, 他们可以很好地说明你的代码中的父子(parent-child)关系.

注: 即可以使用这样: 

namespace animal:dog {}
namespace animal:pig {}

用冒号来说明parent-child关系。

你可能在一个命名空间语句内没有包含函数,类或常量定义以外的任何东西. 这将阻止你使用他们来改进旧的使用全局变量的函数库. 命名空间最适合于面向对象. 命名空间内的常量与类中的常量使用相同的语法.

例子1显示了如何使用命名空间.

Using a namespace

<?php 
   namespace core_php:utility 
   { 
       class textEngine 
       { 
           public function uppercase($text) //大写 
           { 
               return(strtoupper($text)); 
           } 
       } 

       //make non-OO interface 建立一个非OO的接口 
       function uppercase($text) 
       { 
           $e = new textEngine; 
           return($e->uppercase($text)); 
       } 

   } 

   //test class in namespace 测试命名空间中的类 
   $e = new core_php:utility::textEngine; 
   print($e->uppercase("from object") . "
"); 

   //test function in namespace 测试命名空间中的函数 
   print(core_php:utility::uppercase("from function") . "
"); 

   //bring class into global namespace 把类导入全局命名空间 
   import class textEngine from core_php:utility; 
   $e2 = new textEngine; 
?>

例子1

Import语句把命名空间中的某个部份导入全局的命名空间.

要导入单一的命名空间的成员,可以指定类型为constant,function或class,接着写上成员的名称;

//如import class XXX

如果你想导入某一特定类型的所有成员,你可以用*来代替名称;

//如 import constant * 导入所有常量

如果你想导入所有类型的所有成员,用*即可.

//如 import *

在成员之后,用from关键字加上命名空间的名称.

//如 import class textEngine from core_php:utility;

总之你要写成像import * from myNamespace或 import class textEngine from core_php:utility这样的语句,就像例图1中那样.

第十四节–命名空间 — Classes and Objects in PHP5 [14]

作者:Leon Atkinson 翻译:Haohappy 来源:超越PHP
/*
+——————————————————————————-+
| = 本文为Haohappy读<<Core PHP Programming>>
| = 中Classes and Objects一章的笔记
| = 翻译为主+个人心得
| = 为避免可能发生的不必要的麻烦请勿转载,谢谢
| = 欢迎批评指正,希望和所有PHP爱好者共同进步!
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
+——————————————————————————-+
*/

命名空间在PHP5正式版本中被取消,本节内容无效–Haohappy注

第十四节–命名空间

命名变量,函数和类是挺困难的,除了要考虑到变量的名称要易于理解,还要担心是否这个名称在其它某个地方已经使用过. 在一小段脚本中,第二个问题是基本问题. 当你考虑重用你的代码, 在这之后的项目代码必须避免使用你用过的命名. 通常来说,可重用的代码总是包含在函数或类中, 需要处理许多可能发生的命名冲突. 但函数和类之间也可能发生命名冲突. 你可以尝试避免出现这种情况,通过在所有类前添加前缀的方法,或者你可以使用namespace语句.

Namespace关键字给一块代码命名. 在这个代码块外部,脚本必须用操作符::加上命名空间的名称来引用这个代码块. 引用静态的类成员也是用相同的方法. 在命名空间内代码不需要声明命名空间, 它本身就是默认的. 这种方法比添加前缀的方法好. 你的代码可由此变得更加紧凑和可读.

你可能想知道是否可以建立分层的(嵌套的)命名空间. 答案是不可以. 但你可以在命名空间名称后加上冒号, 你可以再次调用在名称中不包含冒号的变量,函数和类. 命名空间允许存在冒号,只要不是第一个字符和最后一个字符或接着另一个冒号. 命名空间的名称中的冒号对于PHP来说没有任何意义, 但如果你用他们来区分逻辑上的区块, 他们可以很好地说明你的代码中的父子(parent-child)关系.

/* 注: 即可以使用这样:
namespace animal:dog {}
namespace animal:pig {}

用冒号来说明parent-child关系.
*/

你可能在一个命名空间语句内没有包含函数,类或常量定义以外的任何东西. 这将阻止你使用他们来改进旧的使用全局变量的函数库. 命名空间最适合于面向对象. 命名空间内的常量与类中的常量使用相同的语法.

例子6.17显示了如何使用命名空间.

Listing 6.17 Using a namespace

<?php 
   namespace core_php:utility 
   { 
       class textEngine 
       { 
           public function uppercase($text) //大写 
           { 
               return(strtoupper($text)); 
           } 
       } 

       //make non-OO interface 建立一个非OO的接口 
       function uppercase($text) 
       { 
           $e = new textEngine; 
           return($e->uppercase($text)); 
       } 

   } 

   //test class in namespace 测试命名空间中的类 
   $e = new core_php:utility::textEngine; 
   print($e->uppercase("from object") . "<br>"); 

   //test function in namespace 测试命名空间中的函数 
   print(core_php:utility::uppercase("from function") . "<br>"); 

   //bring class into global namespace 把类导入全局命名空间 
   import class textEngine from core_php:utility; 
   $e2 = new textEngine; 
?>

Import语句把命名空间中的某个部份导入全局的命名空间.
要导入单一的命名空间的成员,可以指定类型为constant,function或class,接着写上成员的名称;
//如import class XXX
如果你想导入某一特定类型的所有成员,你可以用*来代替名称;
//如 import constant * 导入所有常量
如果你想导入所有类型的所有成员,用*即可.
//如 import *

在成员之后,用from关键字加上命名空间的名称.
//如 import class textEngine from core_php:utility;

总之你要写成像import * from myNamespace或 import class textEngine from core_php:utility这样的语句,就像例6.17中那样.

注:本文章为原创文章,版权归文章作者与超越PHP网站所有,未经本站同意,禁止任何商业转载。非盈利网站及个人网站转载请注明出处,谢谢合作!

把表记录生成数组

以下是来自phpcms2008程序global.func.php文件部分函数,仅供参考:

function cache_read($file, $path = ”, $iscachevar = 0)
{
 if(!$path) $path = CACHE_PATH;
 $cachefile = $path.$file;
 if($iscachevar)
 {
  global $TEMP;
  $key = ‘cache_’.substr($file, 0, -4);
  return isset($TEMP[$key]) ? $TEMP[$key] : $TEMP[$key] = @include $cachefile;
 }
 return @include $cachefile;
}

function cache_write($file, $array, $path = ”)
{
 if(!is_array($array)) return false;
 $array = “<?php\nreturn “.var_export($array, true).”;\n?>”;
 $cachefile = ($path ? $path : CACHE_PATH).$file;
 $strlen = file_put_contents($cachefile, $array);
 @chmod($cachefile, 0777);
 return $strlen;
}

function cache_delete($file, $path = ”)
{
 $cachefile = ($path ? $path : CACHE_PATH).$file;
 return @unlink($cachefile);
}

新一篇: Oracle数据库的安全性措施概述

 一、Oracle中的实体完整性
   
Oracle在CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。例如,在学生-选课数据库中,要定义Student表的Sno为主码,可使用如下语句:

CREATE TABLE student
      (sno 
NUMBER(8
),
       sanme 
VARCHAR(20
),
       sage 
NUMBER(20
),
       
CONSTRAINT pk_sno PRIMARY KEY(sno));

       其中,PRIMARY KEY(Sno)表示是Student表的主码。PK_SNO是此主码约束名。

    若要在SC表中定义(Sno,Cno)为主码,则用下面语句建立SC表:

CREATE TABLE sc
      (sno 
NUMBER(8),
       cno 
NUMBER(2),
       grade 
NUMBER(2),
       
CONSTRAINT pk_sc PRIMARY KEY(sno,cno));

      
    用PRIMARY KEY语句定义了关系的主码后,每当用户程序对主码列进行更新操作时,系统自动进行完整性检查,凡操作使主码值为空或使主码值在表中不唯一,系统拒绝此操作,从而保证了实体完整性。

    二、Oracle中的参照完整性
   
Oracle的CREATE TABLE语句也可以定义参照完整性规则,即用FOREIGN KEY子句定义哪些列为外码列,用REFERENCES子句指明这些外码相应于哪个表的主码,用ON DELETE CASCADE子句指明在删除被参照关系的元组时,同时删除参照关系中相应的远祖。

    例如,使用如下SQL语句建立EMP表:

CREATE TABLE emp
      (empno 
NUMBER(4),
       ename 
VARCHAR(10),
       job 
VARCHAR2(9),
       mgr 
NUMBER(4),
       sal 
NUMBER(7,2),
       deptno 
NUMBER(2),
       
CONSTRAINT fk_deptno
       
FOREIGN KEY(deptno)
       
REFERENCES dept(deptno));

       
    则表明EMP是参照表,DEPT为其被参照表,EMP表中Deptno为外码,它相应于DEPT表中的主码Deptno。当删除或修改DEPT表中某个元组的主码时要检查EMP中是否有元组的DEPTNO值等于DEPT中要删除的元组的Deptno值,如没有,接受此操作;否则系统拒绝这一更新操作。

    如果用如下SQL语句建立EMP表:

CREATE TABLE emp
      (empno 
NUMBER(4),
       ename 
VARCHAR(10),
       job 
VARCHAR2(9),
       mgr 
NUMBER(4),
       sal 
NUMBER(7,2),
       deptno 
NUMBER(2),
       
CONSTRAINT fk_deptno
       
FOREIGN KEY(deptno)
       
REFERENCES dept(deptno)
       
ON DELETE CASCADE);

       
    当要修改DEPT表中的Deptno值时,先要检查EMP表中有无元组的Deptno值与之对应,若没有,系统接受这个修改操作,否则,系统拒绝此操作。

    当要删除DEPT表中某个元组时,系统也要检查EMP表,若找到相应元组则将它们也随之删除。

    三、Oracle中用户定义的完整性
   
除实体完整性和参照完整性外,应用系统中往往还需要定义与应用有关的完整性限制。例如:要求某一列的值不能取空值,要在表中是唯一的,要在某个取值范围中等。Oracle允许用户在建表时定义下列完整性约束:
      列值非空(NOT NULL短语)
    列值唯一(UNIQUE短语)
    检查列值是否满足一个布尔表达式(CHECK短语)

    例1 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。

CREATE TABLE dept
      (deptno 
NUMBER,
       dname 
VARCHAR(9CONSTRAINT u1 UNIQUE,
       loc 
VARCHAR(10),
       
CONSTRAINT pk_dept PRIMARY KEY (deptno));

      
其中CONSTRAINT U1 UNIQUE表示约束名为U1,该约束要求Dname列值唯一。

    例2 建立学生登记表Student,要求学号在90000~99999之间,年龄<29,性别只能是“男”或“女”,姓名非空。

CREATE  TABLE student
      (sno 
NUMBER(5CONSTRAINT c1 CHECK (sno BETWEEN 90000 AND 99999),
       sname 
VARCHAR(20CONSTRAINT c2 NOT NULL,
       sage 
NUMBER(3CONSTRAINT c3 CHECK (sage<29),
       ssex 
VARCHAR(2CONSTRAINT c4 CHECK(ssex IN(,)));

      

    例3 建立职工表EMP,要求每个职工的应发工资不得超过3000元。应发工资实际上就是实发工资列Sal与扣除项Deduct之和。

CREATE  TABLE emp
      (eno 
NUMBER(4),
       ename 
VARCHAR(10),
       job 
VARCHAR(8),
       sal 
NUMBER(7,2),
       deduct 
NUMBER(7,2),
       deptno 
NUMBER(2),
       
CONSTRAINT c1 CHECK (sal + deduct <= 3000));

      
    在Oracle中,除列值非空、列值唯一、检查列值是否满足一个布尔表达式外,用户还可以通过触发器(Trigger)来实现其他完整性规则。所谓数据库触发器,就是一类靠事件驱动的特殊过程,一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发器,在核心层进行集中的完整性控制。

    定义数据库触发器的语句是CREATE TRIGGER。

    例4 为教师表Teacher定义完整性规则“教授的工资不得低于1000元,如果低于1000元,自动改为1000元”。

CREATE TRIGGER update_sal
   BEFORE 
INSERT OR UPDATE OF sal, pos
   
ON teacher
   
FOR EACH ROW
   
WHEN (:NEW.pos = 教授)                             /**//* 某教员晋升为教授 */
BEGIN
   
IF :NEW.sal < 1000
   
THEN
      :NEW.sal :
= 1000;
   
END IF;
END;

       
    综上所述,Oracle提供了CREATE TABLE语句CREATE TRIGGER语句定义完整性约束条件,其中用CREATE TABLE语句可以定义很复杂的完整性约束条件。完整性约束条件一旦定义好,Oracle会自动执行相应的完整性检查,对于违反完整性约束条件的操作或者拒绝执行或者执行事先定义的操作。
  一、Oracle中的实体完整性
   
Oracle在CREATE TABLE语句中提供了PRIMARY KEY子句,供用户在建表时指定关系的主码列。例如,在学生-选课数据库中,要定义Student表的Sno为主码,可使用如下语句:

CREATE TABLE student
      (sno 
NUMBER(8
),
       sanme 
VARCHAR(20
),
       sage 
NUMBER(20
),
       
CONSTRAINT pk_sno PRIMARY KEY(sno));

       其中,PRIMARY KEY(Sno)表示是Student表的主码。PK_SNO是此主码约束名。

    若要在SC表中定义(Sno,Cno)为主码,则用下面语句建立SC表:

CREATE TABLE sc
      (sno 
NUMBER(8),
       cno 
NUMBER(2),
       grade 
NUMBER(2),
       
CONSTRAINT pk_sc PRIMARY KEY(sno,cno));

      
    用PRIMARY KEY语句定义了关系的主码后,每当用户程序对主码列进行更新操作时,系统自动进行完整性检查,凡操作使主码值为空或使主码值在表中不唯一,系统拒绝此操作,从而保证了实体完整性。

    二、Oracle中的参照完整性
   
Oracle的CREATE TABLE语句也可以定义参照完整性规则,即用FOREIGN KEY子句定义哪些列为外码列,用REFERENCES子句指明这些外码相应于哪个表的主码,用ON DELETE CASCADE子句指明在删除被参照关系的元组时,同时删除参照关系中相应的远祖。

    例如,使用如下SQL语句建立EMP表:

CREATE TABLE emp
      (empno 
NUMBER(4),
       ename 
VARCHAR(10),
       job 
VARCHAR2(9),
       mgr 
NUMBER(4),
       sal 
NUMBER(7,2),
       deptno 
NUMBER(2),
       
CONSTRAINT fk_deptno
       
FOREIGN KEY(deptno)
       
REFERENCES dept(deptno));

       
    则表明EMP是参照表,DEPT为其被参照表,EMP表中Deptno为外码,它相应于DEPT表中的主码Deptno。当删除或修改DEPT表中某个元组的主码时要检查EMP中是否有元组的DEPTNO值等于DEPT中要删除的元组的Deptno值,如没有,接受此操作;否则系统拒绝这一更新操作。

    如果用如下SQL语句建立EMP表:

CREATE TABLE emp
      (empno 
NUMBER(4),
       ename 
VARCHAR(10),
       job 
VARCHAR2(9),
       mgr 
NUMBER(4),
       sal 
NUMBER(7,2),
       deptno 
NUMBER(2),
       
CONSTRAINT fk_deptno
       
FOREIGN KEY(deptno)
       
REFERENCES dept(deptno)
       
ON DELETE CASCADE);

       
    当要修改DEPT表中的Deptno值时,先要检查EMP表中有无元组的Deptno值与之对应,若没有,系统接受这个修改操作,否则,系统拒绝此操作。

    当要删除DEPT表中某个元组时,系统也要检查EMP表,若找到相应元组则将它们也随之删除。

    三、Oracle中用户定义的完整性
   
除实体完整性和参照完整性外,应用系统中往往还需要定义与应用有关的完整性限制。例如:要求某一列的值不能取空值,要在表中是唯一的,要在某个取值范围中等。Oracle允许用户在建表时定义下列完整性约束:
      列值非空(NOT NULL短语)
    列值唯一(UNIQUE短语)
    检查列值是否满足一个布尔表达式(CHECK短语)

    例1 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。

CREATE TABLE dept
      (deptno 
NUMBER,
       dname 
VARCHAR(9CONSTRAINT u1 UNIQUE,
       loc 
VARCHAR(10),
       
CONSTRAINT pk_dept PRIMARY KEY (deptno));

      
其中CONSTRAINT U1 UNIQUE表示约束名为U1,该约束要求Dname列值唯一。

    例2 建立学生登记表Student,要求学号在90000~99999之间,年龄<29,性别只能是“男”或“女”,姓名非空。

CREATE  TABLE student
      (sno 
NUMBER(5CONSTRAINT c1 CHECK (sno BETWEEN 90000 AND 99999),
       sname 
VARCHAR(20CONSTRAINT c2 NOT NULL,
       sage 
NUMBER(3CONSTRAINT c3 CHECK (sage<29),
       ssex 
VARCHAR(2CONSTRAINT c4 CHECK(ssex IN(,)));

      

    例3 建立职工表EMP,要求每个职工的应发工资不得超过3000元。应发工资实际上就是实发工资列Sal与扣除项Deduct之和。

CREATE  TABLE emp
      (eno 
NUMBER(4),
       ename 
VARCHAR(10),
       job 
VARCHAR(8),
       sal 
NUMBER(7,2),
       deduct 
NUMBER(7,2),
       deptno 
NUMBER(2),
       
CONSTRAINT c1 CHECK (sal + deduct <= 3000));

      
    在Oracle中,除列值非空、列值唯一、检查列值是否满足一个布尔表达式外,用户还可以通过触发器(Trigger)来实现其他完整性规则。所谓数据库触发器,就是一类靠事件驱动的特殊过程,一旦由某个用户定义,任何用户对该数据的增、删、改操作均由服务器自动激活相应的触发器,在核心层进行集中的完整性控制。

    定义数据库触发器的语句是CREATE TRIGGER。

    例4 为教师表Teacher定义完整性规则“教授的工资不得低于1000元,如果低于1000元,自动改为1000元”。

CREATE TRIGGER update_sal
   BEFORE 
INSERT OR UPDATE OF sal, pos
   
ON teacher
   
FOR EACH ROW
   
WHEN (:NEW.pos = 教授)                             /**//* 某教员晋升为教授 */
BEGIN
   
IF :NEW.sal < 1000
   
THEN
      :NEW.sal :
= 1000;
   
END IF;
END;

       
    综上所述,Oracle提供了CREATE TABLE语句CREATE TRIGGER语句定义完整性约束条件,其中用CREATE TABLE语句可以定义很复杂的完整性约束条件。完整性约束条件一旦定义好,Oracle会自动执行相应的完整性检查,对于违反完整性约束条件的操作或者拒绝执行或者执行事先定义的操作。