数据库从最初的数据文件的简单集合发展到今天的大型数据库治理系统已经成为我们日常生活中不可缺少的组成部分。假如不借助数据库的帮助,许多简单的工作将变得冗长乏味,甚至难以实现。尤其是象银行、院校和图书馆这样的大型组织更加依靠数据库系统实现其正常的运作。再看互联网上,从搜索引擎到在线商场,从网上聊天到邮件列表,都离不开数据库。
目前,市面上的数据库产品多种多样,从大型企业的解决方案到中小企业或个人用户的小型应用系统,可以满足用户的多样化需求。这里,我们所要向大家介绍的MySQL数据库是众多的关系型数据库产品中的一个,相比较其它系统而言,MySQL数据库可以称得上是目前运行速度最快的SQL语言数据库。除了具有许多其它数据库所不具备的功能和选择之外,MySQL数据库是一种完全免费的产品,用户可以直接从网上下载数据库,用于个人或商业用途,而不必支付任何费用(推荐下载站点http://www.mysql.com)。
总体来说,MySQL数据库具有以下主要特点:
1. 同时访问数据库的用户数量不受限制;
2. 可以保存超过50,000,000条记录;
3. 是目前市场上现有产品中运行速度最快的数据库系统;
4. 用户权限设置简单、有效。
如今,包括Siemens和Silicon Graphics这样的国际知名公司也开始把MySQL作为其数据库治理系统,这就更加证实了MySQL数据库的优越性能和广阔的市场发展前景。
本文将重点向读者介绍MySQL数据库的一些基本操作,包括如何与数据库建立连接,假如设置数据库,以及如何执行基本的命令等。希望能够对读者学习和把握MySQL数据库有所助益。
入门
一般来说,我们访问MySQL数据库时,首先需要使用telnet远程登录安装数据库系统的服务器,然后再进入MySQL数据库。MySQL数据库的连接命令如下:
mysql -h hostname -u username -p[password]
或者:
mysql -h hostname -u username --password=password
其中,hostname为装有MySQL数据库的服务器名称,username和password分别是用户的登录名称和口令。
假如MySQL数据库安装和配置正确的话,用户在输入上述命令之后会得到如下系统反馈信息:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 49 to server version: 3.2 3-beta-log
Type help for help.
mysql>
这样,用户就成功进入了MySQL数据库系统,可以在mysql>命令提示符之后输入各种命令。下面,我们列出一些MySQL数据库的主要治理命令供读者参考,用户也可以通过在命令符之后输入help,h或?得到以下命令的简单说明。
mysql> help
help (h) 显示命令帮助
? (h) 作用同上
clear (c) 清除屏幕内容
connect (r) 重新连接服务器,可选参数为 db(数据库)和 host(服务器)
exit () 退出mysql数据库,作用与quit命令相同
go (g) 将命令传送至mysql数据库
print (p) 打印当前命令
quit (q) 退出mysql数据库
status (s) 显示服务器当前信息
use (u) 打开数据库,以数据库名称作为命令参数
上述命令主要用于MySQL数据库的系统治理,假如用户需要对某个具体的数据库进行操作,可以使用use命令进入该数据库,格式如下:
mysql> use dbname;
这里需要提醒读者注重的一点就是MySQL数据库要求使用者在所有命令的结尾处使用“;”作为命令结束符。
数据类型和数据表
从本质上说,数据库就是一种不断增长的复杂的数据组织结构。在MySQL数据库中,用于保存数据记录的结构被称为数据表。而每一条数据记录则是由更小的数据对象,即数据类型组成。因此,总体来说,一个或多个数据类型组成一条数据记录,一条或多条数据记录组成一个数据表,一个或多个数据表组成一个数据库。我们可以把上述结构理解为如下形式:
Database < Table < Record < Datatype
数据类型分为不同的格式和大小,可以方便数据库的设计人员创建最理想的数据结构。能否正确的选择恰当的数据类型对最终数据库的性能具有重要的影响,因此,我们有必要首先对数据类型的有关概念进行较为具体的介绍。
请先安装JAVA的执行环境与PHP结合,具体参考http://www.phpx.com/happy/thr78795.html
或者下载http://www.javax.org/download/php_java.rar
里面我写有个readme.txt说明文档,这个压缩包是个简单的例子。
要下载我的JAVA源码请到http://www.javax.org/download/JavaXml.rar
有其他问题请到http://www.javax.org/提问。
一开始我想用PHP解析XML,但发现PHP要解析XML有点麻烦,好象PHP5比较方便了,但我这边没有装5,还是4.3。后来我看到IBM一篇文章(http://www-900.cn.ibm.com/developer...kit/index.shtml)讲到可以利用JAVA来做,所以我现在就试验了一下。
要解析的XML文件:first.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<product>
<hello>
<name>小曾</name>
<age>20</age>
</hello>
<hello>
<name>雨伞</name>
<age>20</age>
</hello>
</product>
其中<product>是根,<hello>是节点,一共有两个,name值名字不一样,一个是小曾一个是雨伞,年龄一样。
下面看PHP解析时候的文件:
<?php
$JavaXml = new Java("JavaXml"); //这里是生成一个我写的JAVA解析XML数据的类
$JavaXml->init(); //这里为初始化,比如取global.properties文件里的XML文件目录(当然你下载了例子以后要改成你的XML文件目录)
$JavaXml->Parse("first.xml"); //指定要解析的文件,相对于global.properties文件里指定的目录下
$JavaXml->get(0); //这里为取得第一个节点
echo $JavaXml->getValue("name")."<br>"; //取得第一个节点name标签值
echo $JavaXml->getValue("age")."<br>"; //取得第一个节点age标签值
$JavaXml->setValue("name","大头爸爸"); //设置第一个节点name标签值为大头爸爸
$JavaXml->get(1); //这里为取得第二个节点
echo $JavaXml->getValue("name")."<br>"; //取得第二个节点name标签值
echo $JavaXml->getValue("age")."<br>"; //取得第二个节点age标签值
?>
$JavaXml->get(0);取得节点位置,比如我的XML文件有两组<hello>,这里get(0)的话就是取第一组的<hello> ,get(1)就是取第二组的<hello>.
最后输出是
小曾
20
雨伞
20
因为$JavaXml->setValue("name","大头爸爸"); 这句修改了第一个节点的name标签的值,XML文件已经被更新过了,所以当再执行一次这个PHP文件的时候结果会成为
大头爸爸
20
雨伞
20
以上简单几句就解析完了,下面是我的JAVA类,里面用到了JDOM来解析XML。
import org.jdom.* ;
import org.jdom.output.* ;
import org.jdom.input.* ;
import java.io.* ;
PHP有很多与文件系统相关的函数,不仅可以帮助你打开文件,还可以显示目录内容、移动文件等。很多人甚至使用PHP写出了基于Web的文件治理器。
首先需要提醒一些关于文件路径的东西:在Windows你可以在文件路径中使用斜线“/”或反斜线“”,而其他操作系统仅使用”/”。出于兼容性考虑,以下实例使用“/”的表示方法:
下面的简单脚本显示了一个基本的目录列表。注释在代码中并解释了每一步:
<? /* 在变量 $dir_name中给出希望访问的目录完整路径*/
$dir_name = "/home/me/";
/* 创建句柄,打开给定目录的结果*/
$dir = opendir($dir_name);
/* 启动一段文本添加到将要放置列表元素(文件名)的地方 */
$file_list = "<ul>";
/* 使用while语句,读取所打开目录的所有元素。假如文件名既非“.”及“..”则在列表中输出文件名*/
while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) {
$file_list .= "<li>$file_name";
}
}
/* 终结列表 */
$file_list .= "</ul>";
/* 关闭打开的目录句柄并结束PHP代码段*/
closedir($dir);
?>
<!-- Start your HTML -->
<HTML>
<HEAD>
<?PHP
//xml中的元素
class XMLTag
{
var $parent;//父节点
var $child;//子节点
var $attribute;//本节点属性
var $data;//本节点数据
var $TagName;//本节点名称
var $depth;//本节点的深度,根节点为1
function XMLTag($tag='')
{
$this->attribute = array();
$this->child = array();
$this->depth = 0;
$this->parent = null;
$this->data = '';
$this->TagName = $tag;
}
function SetTagName($tag)
{
$this->TagName = $tag;
}
function SetParent(&$parent)
{
$this->parent = &$parent;
}
function SetAttribute($name,$value)
{
$this->attribute[$name] = $value;
}
function AppendChild(&$child)
{
$i = count($this->child);
$this->child[$i] = &$child;
}
function SetData($data)
{
$this->data= $data;
}
function GetAttr()
{
return $this->attribute;
}
function GetProperty($name)
{
return $this->attribute[$name];
}
function GetData()
{
return $this->data;
}
function GetParent()
{
return $this->parent;
}
function GetChild()
{
return $this->child;
}
function GetChildByName($name)
{
$total = count($this->child);
for($i=0;$i<$total;$i++)
{
if($this->child[$i]->attribute['name'] == $name)
{
return $this->child[$i];
}
}
return null;
}
//获取某个tag节点
function GetElementsByTagName($tag)
{
$vector = array();
$tree = &$this;
$this->_GetElementByTagName($tree,$tag,$vector);
return $vector;
}
function _GetElementByTagName($tree,$tag,&$vector)
{
if($tree->TagName == $tag) array_push($vector,$tree);
$total = count($tree->child);
for($i = 0; $i < $total;$i++)
$this->_GetElementByTagName($tree->child[$i],$tag,$vector);
}
}
//xml文档解析
class XMLDoc
{
var $parser;//xml解析指针
var $XMLTree;//生成的xml树
var $XMLFile;//将要解析的xml文档
var $XMLData;//将要解析的xml数据
var $error;//错误信息
var $NowTag;//当前指向的节点
var $TreeData;//遍历生成的xml树等到的数据
var $MaxDepth;//本树最大的深度
var $encode;//xml文档的编码方式
var $chs;//字符转换
function XMLDoc()
{
//采用默认的ISO-8859-1
$this->parser = xml_parser_create();
xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
xml_set_object($this->parser,&$this);
xml_set_element_handler($this->parser,'_StartElement','_EndElement');
xml_set_character_data_handler($this->parser,'_CData');
$this->stack = array();
$this->XMLTree = null;
$this->NowTag = null;
$this->MaxDepth = 0;
}
function LoadFromFile($file)
{
$this->XMLFile = fopen($file,'r');
if(!$this->XMLFile)
{
$this->error = '不能打开xml文件';
return false;
}
$this->XMLData = '';
$this->TreeData = '';
return true;
}
function SetXMLData($data)
{
if($this->XMLFile) fclose($this->XMLFile);
$this->XMLData = $data;
$this->TreeData = '';
}
//给树添加一个新的节点
function AppendChild(&$child)
{
if($this->XMLTree == null)
{
$child->depth = 1;
$this->XMLTree = &$child;
$this->NowTag = &$this->XMLTree;
}
else
{
$i = count($this->NowTag->child);
$this->NowTag->child[$i] = &$child;
$child->parent = &$this->NowTag;
$child->depth = $this->NowTag->depth+1;
unset($this->NowTag);
$this->NowTag = &$child;
}
$this->MaxDepth = ($this->MaxDepth < $this->NowTag->depth)?$this->NowTag->depth:$this->MaxDepth;
}
//产生一个新的节点
function &CreateElement($tag)
{
$element = new XMLTag($tag);
return $element;
}
function _StartElement($parser,$element,$attribute)
{
$tag = new XMLTag();
$tag->TagName = $element;
$tag->attribute = $attribute;
if($this->XMLTree == null)
{
$tag->parent = null;
$tag->depth = 1;
$this->XMLTree = &$tag;
$this->NowTag = &$tag;
}
else
{
$i = count($this->NowTag->child);
$this->NowTag->child[$i] = &$tag;
$tag->parent = &$this->NowTag;
$tag->depth = $this->NowTag->depth+1;
unset($this->NowTag);
$this->NowTag = &$tag;
}
$this->MaxDepth = ($this->MaxDepth < $this->NowTag->depth)?$this->NowTag->depth:$this->MaxDepth;
}
function _CData($paraser,$data)
{
$this->NowTag->data = $data;
}
function _EndElement($parser,$element)
{
$parent = &$this->NowTag->parent;
unset($this->NowTag);
$this->NowTag = &$parent;
}
//开始解析xml文档
function parse()
{
if($this->XMLFile)
{
$this->XMLData = '';
while(!feof($this->XMLFile))
{
$this->XMLData .= fread($this->XMLFile,4096);
}
}
fclose($this->XMLFile);
if($this->XMLData)
{
//$this->JudgeEncode();
if (!xml_parse($this->parser, $this->XMLData))
{
$code = xml_get_error_code($this->parser);
$col = xml_get_current_column_number($this->parser);
$line = xml_get_current_line_number($this->parser);
$this->error = "XML error: $col at line $line:".xml_error_string($code);
return false;
}
}
xml_parser_free($this->parser);
return true;
}
//确定编码方式
function JudgeEncode()
{
$start = strpos($this->XMLData,'<?xml');
$end = strpos($this->XMLData,'>');
$str = substr($this->XMLData,$start,$end-$start);
$pos = strpos($str,'encoding');
if($pos !== false)
{
$str = substr($str,$pos);
$pos = strpos($str,'=');
$str = substr($str,$pos+1);
$pos = 0;
while(empty($str[$pos])) $pos++;
$this->encode = '';
while(!empty($str[$pos]) && $str[$pos] != '?')
{
if($str[$pos] != '"' && $str[$pos] != "'")
$this->encode .= $str[$pos];
$pos++;
}
}
$this->chs = new Chinese('UTF-8',$this->encode);
}
//根据节点名称修改某个节点的值
function ChangeValueByName($name,$name,$value)
{
return $this->_ChangeValueByName($this->XMLTree,$name,$value);
}
function _ChangeValueByName($tree,$name,$value)
{
if(is_array($tree->attribute))
{
while (list($k,$v) = each($tree->attribute))
{
if($k = 'name' && $v = $name)
{
$tree->data = $value;
return true;
}
}
}
$total = count($tree->child);
for($i = 0;$i<$total;$i++)
{
$result = $this->_ChangeValueByName($tree->child[$i],$name,$value);
if($result == true) break;
}
return $result;
}
//根据节点名称修改树中某个节点的属性
function ChangeAttrByName($name,$attr,$value)
{
return $this->_ChangeAttrByName($this->XMLTree,$name,$attr,$value);
}
function _ChangeAttrByName(&$tree,$name,$attr,$value)
{
if(is_array($tree->attribute))
{
while(list($k,$v) = each($tree->atttibute))
{
if($k == 'name' && $v == $name)
{
$tree->attribute[$attr] = $value;
return true;
}
}
}
$total = count($tree->child);
for($i = 0;$i<$total;$i++)
{
$result = $this->_ChangeAttrByName($tree->child[$i],$name,$attr,$value);
if($result == true) break;
}
return $result;
}
//获取根节点
function GetDocumentElement()
{
return $this->XMLTree;
}
//遍历生成的xml树,重新生成xml文档
function WalkTree()
{
$this->TreeData = '';
$this->_WalkTree($this->XMLTree);
return $this->TreeData;
}
//递归遍历
function _WalkTree($tree)
{
$this->TreeData .= '<'.$tree->TagName.' ';
if(is_array($tree->attribute))
{
while(list($key,$value) = each($tree->attribute))
{
$this->TreeData .="$key="$value" ";
}
}
$this->TreeData .= '>'.$tree->data;
$total = count($tree->child);
for($i=0;$i<$total;$i++)
{
$this->_WalkTree($tree->child[$i]);
}
$this->TreeData .= '</'.$tree->TagName.">n";
}
//获取错误信息
function GetError()
{
return $this->error;
}
//获取树的最大深度
function GetMaxDepth()
{
return $this->MaxDepth;
}
//将xml树写入xml文件
function WriteToFile($file,$head='')
{
$fp = fopen($file,'w');
if(!$fp)
{
$this->error = '无法打开写入文件';
return false;
}
if(empty($this->TreeData)) $this->WalkTree();
$head = empty($head)?'<?xml version="1.0" standalone="yes" encoding="gb2312"?>':$head;
fwrite($fp,$head);
fwrite($fp,$this->TreeData);
fclose($fp);
return true;
}
}
?>
<?
// 本人不熟悉XML,可能注解对XML的描述有误
// 这只是个思想,要实现的话应该略加修整,可以把一些不常用条件查询的数据用XML保存
// 如虚拟社区的 用户资料,一般只有用户自己或其他用户指定了他的USERNAME才会显示
// 剩下每次都要开启、查询、解释数据集、关闭数据库的消耗。
define("enter",chr(13).chr(10));
class DATA_XML //关键!!!一个自定义类
{
var $parser; //XML解释器
var $tags; //XML标签
var $on; //
var $root; // 根元素
var $Data = array(); // 元素数组
function DATA_XML($filename,$root) //类初始函数 filename文件名,root根元素
{
$this->root = $root; // 初始根元素
$this->parser = xml_parser_create();//创建解释对象
xml_set_object(&$this->parser,&$this);//设置对象
xml_set_element_handler($this->parser,"tag_on","tag_off");//设置元素管理函数
xml_set_character_data_handler($this->parser,"getdata"); //设置数据管理事件
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); //要求严格区分大小写
if( file_exists($filename) ) //找到文件吗?
{//找到
$fp = fopen($filename,"r"); // 只读打开
$c = fread($fp,filesize($filename)); //读取数据
fclose($fp);//关闭
$this->parse($c); //设置解释对象
}
else
{
echo "ooooo"; //!?!好象是调试时用的,去掉 else好了
}
}
function parse($data)//解释函数
{
xml_parse($this->parser,$data);
}
function tag_on($parser,$tag,$attributes)//发现元素触发函数
{
$this->on = true; // 已经触发过
$this->tags = $tag;
//echo $tag;
}
function tag_off($parser,$tag) //元素结素函数
{
$this->on = false; // 元素结素
}
function getdata($parser,$cdata) //取出元素
{
if($this->on && $this->tags!=$this->root)
{//验证一下比较好,(现在是否为元素的开始,并且不是根元素?)
$this->Data[$this->tags]=trim($cdata);
// 关键啊!!用标签做数组表,并给这个数组元素付上数据
//echo trim($cdata);
//echo $this->tags;
//echo "n";
}
}
function check($str)
{//检查字符
if( strlen($str)<1 )//如果是空字符
return ' ';//返回 ' '
else
return $str;//否则原路返回(不然XML好象会不做结束标记)
}
function saveas($filename)//另存为
{
$c='<?xml version="1.0" encoding="gb2312"?>'.enter;
//这个不用说了吧,enter是define("enter",chr(13).chr(10));
$c.="<".$this->root.">".enter;
//首先设定一下根元素
for( reset($this->Data);$i=key($this->Data);next($this->Data))
{//开始举出所有数据啦
$c.= "<".$i.">".$this->check($this->Data[$i])."</".$i.">".enter;
// 用数组表名做元素标签,并加上数据内容
}
//echo $c;
$c.="</".$this->root.">".enter;//结束标签
$fp = fopen( $filename , "w" );//写入文件
fwrite($fp,$c);
fclose($fp);
}
};
/*新键一个XML文件
$xml = new DATA_XML(路径."arm.xml","DATA"/*根元素*/);
$xml->Data["UserName"]="关羽";
$xml->Data["Nick"]="关云长";
$xml->saveas( 路径."arm.xml");
unset( $xml );
// 读取一个文件
$xml = new DATA_XML(路径."arm.xml","DATA");
echo $xml->Data["Nick"];//显示一下?
$xml->Data["Nick"]="关老爷";//UPDATE
$xml->Data["Master"]="刘备";//INSERT INTO
$xml->saveas(路径."arm.xml");//另存为覆盖本身
*/
?>