延吉虹桥广告的Mysql教程又来了!本来想整合一些关于Php的教程,但是很多宝贝们对数据库的基础的安装不太懂,而你的整合内容是给专业人士看的吗?不是的~好吧今天我们就来补上一期整合的安装环境与Mysql+php或者java连接的内容。其实很简单再次声明哟,本整合内容来自MySQL的新闻,不是我在瞎掰,另外,让我们再喊一次 延吉虹桥的口号:我们除了制作延吉广告,延吉牌匾,延吉广告牌,延吉宣传单,延吉宣传册,延吉展架的延吉广告公司外我们还发布公益类的网站开发小技巧哟~么么哒~
好了回过头来,我们继续今天的整合内容:
Mysql学习点滴一:由于工作中需要使用mysql,笔者通过网上学习,动手实践,终于从一个"数据库菜鸟"变成了能熟练操作mysql的"准大虾"了 ,:)。现将学习心得整理如下。 MySQL是完全网络化的跨平台关系型数据库系统,一个真正的多用户、多线程SQL数据库服务器,同时是具有客户机/服务器 体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多 语言编写访问MySQL 数据库的程序,对于中、小型应用系统是非常理想的。除了支持标准的ANSI SQL语句,更重要的是,它还支 持多种平台,而在Unix系统上该软件支持多线程运行方式,从而能获得相当好的性能。对于不使用Unix的用户,它可以在 Windows NT系统上以系统服务方式运行,或者在Windows 95/98系统上以普通进程方式运行。而在Unix/Linux系统上,MySQL支持 多线程运行方式,从而能获得相当好的性能,而且它是属于开放源代码软。 MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成,MySQL 的执行 性能非常高,运行速度非常快,并非常容易使用,是一个非常棒的数据库。MySQL的官方发音是"My Ess Que Ell"(不是 MY-SEQUEL )。 一.获得MySQL 首先必须下载MySQL。Mysql的官方网站是:http://www.mysql.com ,在中国的镜像是: http://www.freecode.net.cn/mirror/mysql/ 或者http://www2.linuxforum.net/mirror/mysql/,可以下载MySQL的稳定版本 3.22.32(截止到笔者发稿为止)。其版本名称是mysql-shareware-3.22.32-win,不但免费而且没有所谓的"30天使用期限"。 二.MySQL的安装 (一)在Win98/Winnt下的安装 到一个目录,运行Setup程序,会提示整个安装的过程。它默认安装到c:\mysql下,如果要安装到其它目录下还有改动一些 东西,作为初学者,可以先不管,以默认的目录安装。好了,安装后,进入c:\mysql\bin目录下,运行mysqld-shareware.exe文 件在Win98下直接运行,正常情况下,没有什么提示信息。 1。将下载后的文件解压解压到一个临时目录。 2。点击setup.exe安装到c:\mysql(默认)。 3。将mysql_example.cnf拷贝到c:\my.cnf,把文件中的#basedir=d:/mysql/改为basedir=c:\mysql。 4。进入msdos,到目录c:\mysql\bin。 5。输入mysqld-shareware -install,此为启动Mysql数据库服务。 6。mysqladmin -u root -p password 新密码,此为修改root用户的密码(原来默认的密码为空。) 7。输入mysql -u root -p。 8.接着,根据提示输入新密码 ,正常情况下会出现几行提示信息并出现提示符号: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6268 to server version: 3.22.32 Type 'help' for help. mysql> 到此,你已经成功安装了MySQL。 二: (二)在Windows2000 下的安装 1。安装时选默认目录: c:\mysql 2。把 c:\mysql\my-example.cnf copy 为 c:\my.cnf,并把 c:\mysql\lib\cygwinb19.dll copy 到 winnt\system32。 3。启动 mysql的方法是: c:\mysql\bin\mysqld-shareware --install net start mysql 这么简单,就可以启动了。 4。更改 超级用户(root) 的密码: C:\mysql\bin\mysql mysql mysql> UPDATE user SET password=PASSWORD('your password') WHERE user='root'; mysql> QUIT C:\mysql\bin\mysqladmin reload 使用命令C:\mysql\bin\mysqlshow去看看检测一下。在这里应该显示: +-----------+ | Databases | +-----------+ | mysql | | test | +-----------+ 看到这些信息这一步就证明没问题了 再来: C:\mysql\bin\mysqlshow --user=root --password=your password mysql 在这里应该显示: Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | host | | tables_priv | | user | +--------------+ 一切搞定! 5。C:\mysql\bin\mysqladmin version status proc 应该可以看到这些版本信息的: mysqladmin Ver 8.0 Distrib 3.22.32, for Win95/Win98 on i586 TCX Datakonsult AB, by Monty Server version 3.22.32-shareware-debug Protocol version 10 Connection localhost via TCP/IP TCP port 3306 Uptime: 1 hour 29 min 30 sec Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory used: 16490K Uptime: 5370 Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory used: 16490K +----+------+-----------+----+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+------+-------+------------------+ | 35 | ODBC | localhost | | Query | 0 | | show processlist | +----+------+-----------+----+---------+------+-------+------------------+ 接着,用show databases命令可以将安装的数据库列出来: mysql> show databases; 你就可以看到: +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.00 sec) 如果一切正常的话,那说明MySQL可以完全工作了!如果要退出程序,输入:exit mysql> exit; Bye 3 三.Mysql常识 (一) 字段类型 1.INT[(M)] 正常大小整数类型 2.DOUBLE[(M,D)] [ZEROFILL] 正常大小(双精密)浮点数字类型 3.DATE 日期类型。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串 或数字把值赋给 DATE列 4.CHAR(M) 定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 5.BLOB TEXT BLOB或TEXT类型,最大长度为65535(2^16-1)个字符。 6.VARCHAR 变长字符串类型,最常用的类型。 (二)基本操作 1: 显示数据库 mysql>SHOW DATABASES; 2:当前选择的数据库, mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | test | +------------+ 3.当前数据库包含的表信息: mysql> SHOW TABLES; +---------------------+ | Tables in test | +---------------------+ | mytable1 | | mytable2 | +---------------------+ 4.获取表结构 mysql> desc mytable1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | s1 | varchar(20) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5.创建表 表是数据库的最基本元素之一,表与表之间可以相互独立,也可以相互关联。创建表的基本语法如下: create table table_name (column_name datatype {identity |null|not null}, …) 其中参数table_name和column_name必须满足用户数据库中的识别器(identifier)的要求,参数datatype是一个标准的SQL类 型或由用户数 据库提供的类型。用户要使用non-null从句为各字段输入数据。 create table还有一些其他选项,如创建临时表和使用select子句从其他的表中读取某些字段组成新表等。还有,在创建表 是可用PRIMARY KEY、KEY、INDEX等标识符设定某些字段为主键或索引等。书写上要注意: 在一对圆括号里的列出完整的字 段清单。字段名间用逗号隔开 。 字段名间的逗号后要加一个空格。最后一个字段名后不用逗号。所有的SQL陈述都以分 号";"结束。 例: mysql>CREATE TABLE guest (name varchar(10),sex varchar(2),age int(3),career varchar(10)); 6.创建索引 索引用于对数据库的查询。一般数据库建有多种索引方案,每种方案都精于某一特定的查询类。索引可以加速对数据库的查 询过程。创建 索引的基本语法如下: create index index_name on table_name (col_name[(length)],... ) 例: mysql> CREATE INDEX number ON guest (number(10)); 7.执行查询 查询是使用最多的SQL命令。查询数据库需要凭借结构、索引和字段类型等因素。大多数数据库含有一个优化器(optimizer) ,把用户的查 询语句转换成可选的形式,以提高查询效率。 值得注意的是MySQL不支持SQL92标准的嵌套的where子句,即它只支持一个where子句。其基本语法如下: SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL] select_expression,... [INTO {OUTFILE | DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY col_name,...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] ] 其中where从句是定义选择标准的地方,where_definition可以有不同的格式,但都遵循下面的形式: 字段名操作表达式 字段名操作字段名 在第一种形式下,标准把字段的值与表达式进行比较;在第二种形式下,把两个字段的值进行比较。根据所比较的数据类型 , search_condition中的操作可能选以下几种: = 检查是否相等 != 检查是否不等 > (或>=) 检查左边值是否大于(或大于等于)右边值 < (或<=) 检查左边值是否小于(或小于等于)右边值 [not] between 检查左边值是否在某个范围内 [not] in 检查左边是否某个特定集的成员 [not] like 检查左边是否为右边的子串 is [not] null 检查左边是否为空值 在这里,可以用通配符_代表任何一个字符,%代表任何字符串。使用关键字、和可以生成复杂的词,它们运行检查时使用 布尔表达式的多重标准集。 例: mysql> select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name; mysql> select college, region, seed from tournament ORDER BY region, seed; mysql> select col_name from tbl_name WHERE col_name > 0; 8.改变表结构 在数据库的使用过程中,有时需要改变它的表结构,包括改变字段名,甚至改变不同数据库字段间的关系。可以实现上述改 变的命令是 alter,其基本语法如下: alter table table_name alter_spec [, alter_spec ...] 例: mysql> alter table dbname add column userid int(11) not null primary key auto_increment; 这样,就在表dbname中添加了一个字段userid,类型为int(11)。 9.修改表中数据 在使用数据库过程中,往往要修改其表中的数据,比如往表中添加新数据,删除表中原有数据,或对表中原有数据进行更改 。它们的基本 语法如下: 数据添加: insert [into] table_name [(column(s))] values (expression(s)) 例: mysql>insert into mydatabase values('php','mysql','asp','sqlserver','jsp','oracle'); 4 10. 表的数据更新 (1) 一次修改一个字段,再次注意语法。文本需要加引号但数字不要。 mysql>update table01 set field03='new info' where field01=1; Query OK, 1 row affected (0.00 sec) (2)一次改变多个字段,记住在每一个更新的字段间用逗号隔开。 mysql>update table01 set field04=19991022, field05=062218 where field01=1; Query OK, 1 row affected (0.00 sec) (3) 一次更新多个数据 mysql>update table01 set field05=152901 where field04>19990101; Query OK, 3 rows affected (0.00 sec) 11. 删除数据 mysql>delete from table01 where field01=3; Query OK, 1 row affected (0.00 sec) 12.导入数据库表 (1)创建.sql文件 (2)先产生一个库如auction.c:\mysql\bin>mysqladmin -u root -p creat auction,会提示输入密码,然后成功创建。 (3)导入auction.sql文件 c:\mysql\bin>mysql -u root -p auction < auction.sql。 通过以上操作,就可以创建了一个数据库auction以及其中的一个表auction。 13.mysql数据库的授权 mysql>grant select,insert,delete,create,drop on *.* (或test.*/user.*/..) to 用户名@localhost identified by '密码'; 如:新建一个用户帐号以便可以访问数据库,需要进行如下操作: mysql> grant usage -> ON test.* -> TO testuser@localhost; Query OK, 0 rows affected (0.15 sec) 此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到数据库并可以连接到test 数据库。下一步,我们 必须指定 testuser这个用户可以执行哪些操作: mysql> GRANT select, insert, delete,update -> ON test.* -> TO testuser@localhost; Query OK, 0 rows affected (0.00 sec) 此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并 退出MySQL客户 程序: mysql> exit Bye 14.授权 MySQL用户密码 MySQL数据库的默认用户名为"root"(MS SQL Server 的 sa 相似),密码默认为空。在DOS提示符(注意,不是mysql提示符) 下输入 c:\mysql\bin>"mysqladmin -u root -p password newpassword 回车后会提示你输入原来的密码,由于原来密码为空,直接回车,root用户的密码便改为"newpassword"了。 5 四.安装phpMyAdmin MySQL图形界面管理器phpMyAdmin是一套以php3 写成,针对MySQL数据库系统的Web管理界面。它可以很方便地以图形化界面 ,来对MySQL数据库里的字段、数据进行增加、删除等的动作,更可以做数据库本身的增删管理;phpMyAdmin可以管理整个MySQL 服务器(需要超级用户),也可以管理单个数据库。另外,您也可以通过使用这个图形化界面来学习SQL正确的语法,直至熟练掌 握。那要等到你看过MySQL手册中相关的部分。你可以到http://www.phpwizard.net/phpMyAdmin/ 去 下载最新的版本。 首先,将phpMyAdmin软件包解到一个目录下。 1.修改文档config.inc.php3。 将原来的设定: $cfgServers[1]['host'] = ''; // MySQL hostname $cfgServers[1]['port'] = ''; // MySQL port - leave blank for default port $cfgServers[1]['adv_auth'] = false; // Use advanced authentication? $cfgServers[1]['stduser'] = ''; // MySQL standard user (only needed with advanced auth) $cfgServers[1]['stdpass'] = ''; // MySQL standard password (only needed with advanced auth) $cfgServers[1]['user'] = ''; // MySQL user (only needed withbasic auth) $cfgServers[1]['password'] = ''; // MySQL password (only needed with basic auth) $cfgServers[1]['only_db'] = ''; // If set to a db-name, only this db is accessible $cfgServers[1]['verbose'] = ''; // Verbose name for this host -leave blank to show the hostname : : require("english.inc.php3"); 修改成: $cfgServers[1]['host'] = 'MySQL Server的hostname'; // 填入您的MySQL Server的主机名称 $cfgServers[1]['port'] = ''; // 填入连结 MySQL的 port,不填则以预设的port进行连结 $cfgServers[1]['adv_auth'] = true; // 改成true则进入phpMyAdmin必须先身份认证 $cfgServers[1]['stduser'] = 'root'; // MySQL使用者的帐号 $cfgServers[1]['stdpass'] = '密码'; // MySQL使用者的密码 $cfgServers[1]['user'] = 'root'; // MySQL管理帐号 $cfgServers[1]['password'] = '密码'; // MySQL管理密码 $cfgServers[1]['only_db'] = ''; // 指定管理的资库名称,不填则可以管理整个Server $cfgServers[1]['verbose'] = ''; // 指定MySQL的名称,不填则使用系统本身的hostname : : require("chinese_gb.inc.php3"); //将语言改成中文 说明: (1)因本管理接口,可以以一个接口,管理多个MySQL Server,所以可以在config.inc.php3中找到 $cfgServers[1]... $cfgServers[1]... $cfgServers[1]... : $cfgServers[2]... $cfgServers[2]... $cfgServers[2]... 其中[1]代表第一个MySQL Server,[2]代表第二个MySQL Server,您要管理的MySQL Server超过三台以上,您可以依照同样 的述,增加[4].....下去! (2)若您的MySQL Server与http Server是同一台,则$cfgServers[1]['host'] =可直接填入localhost。 最后,打开流览器,输入 http://你的网址/phpMyAdmin 之后您会看到一个密码验证的小窗口,输入您的MySQL管理帐号及密码 ,即可成功地看到phpMyAdmin的管理画面。通过phpmyadmin,你就可以图形化的、方便的管理你的所有数据库了。 五.小结 通过以上的学习和操作,终于可以自由操作mysql数据库了,也可以轻车熟路的使用php或者asp调用mysql了。最后,笔者要 特别感谢开发了mysql并且免费贡献的天才以及在网上提供mysql使用说明的大虾们。 用Java+MySQL+PHP轻松构建跨平台的搜索引擎 1 此搜索引擎适于在一个中等规模的局域网中使用,由于找到的网页存在数据库中,不仅可以索静态的HTML页面,可以搜索php、asp等动态页面。对于一个拥有5万个网页的系统(使用PII-400作为服务器),搜索响应时间在2-10秒左右,完全可以满足要求,由于Java、MySQL、PHP都是跨平台的软件,所以此搜索引擎不仅可以工作在Windows服务器上,而且也可以工作在Linux等其他系统中。 一、建立搜索引擎需要的数据库和数据表。 首先建立数据库: c:\mysql\bin\> mysqladmin -uroot -pmypasswd create Spider 然后建立数据库中的表结构 c:\mysql\bin\> mysql -uroot -pmypasswd Spider < Spider.mysql 其中Spider.mysql为一个文本文件,其内容如下: CREATE TABLE link ( Id int(10) unsigned NOT NULL auto_increment, Url varchar(120) NOT NULL, Class tinyint(3) unsigned NOT NULL default 0 , IsSearchLink tinyint(3) unsigned default 0, PRIMARY KEY (Url), UNIQUE Id (Id), KEY Url (Url), KEY Class (Class) ); # 本局域网的初始主页地址,搜索蜘蛛从此网址开始搜索所有其他网页 INSERT INTO link VALUES( '1', 'HTTP://102.211.69.1/', '0', '0'); # 数据表 webpagelocal 用来存放下载的所有的网页 CREATE TABLE webpagelocal ( Id int(10) unsigned NOT NULL auto_increment, Url varchar(120) NOT NULL, Content text NOT NULL, PRIMARY KEY (Url), UNIQUE Id (Id), KEY Url (Url) ); # 数据表 webpagefindfast # 用MakeFast.php从表webpagelocal中提取512字节的检索信息存放其中 CREATE TABLE webpagefindfast ( Id int(10) unsigned NOT NULL, Url varchar(120) NOT NULL, Title varchar(64), Content blob, PRIMARY KEY (Url), KEY Url (Url), KEY Title (Title) ); 2 二、以下为搜索网页和下载网页至本地数据库的Java程序LinkToDB.java,它也是此搜索引擎的核心和基础 /***************************** LinkToDB.java *********************************** * * 对URL中的http链接进行分析,将相对路径转换为绝对路径,排序方式输出结果到数据库 * * 如果分析得到的URL是Link表中唯一的,就将其内容下载到表 WebPageLocal 中。 * ******************************************************************************** / import java.io.*; import java.util.*; import java.net.*; import java.lang.String; import java.sql.*; import java.text.*; class Counter { private int i = 1; int read() { return i; } void increment() { i++; } } public class LinkToDB { String UrlHost = ""; String UrlFile = ""; String UrlPath = ""; static String StartWith = null; boolean outsideTag = true; //判断是否在标记之中 static char[] buffer = new char[4096]; // 缓冲区:用于保存从 URL 读的数据 InputStreamReader read = null; BufferedReader reader = null; URLConnection uc = null; private URL url = null; private StreamTokenizer st; private TreeMap counts = new TreeMap();//以排序方式保存找到的链接 LinkToDB(String myurl,String StartOnly){ try { StartWith = StartOnly; if(StartOnly!=null) { if(!myurl.startsWith(StartOnly)) return; }//只搜索此网站 url = new URL(myurl); UrlHost = url.getHost(); UrlHost = UrlHost.toUpperCase(); UrlFile = url.getFile(); int v=UrlFile.lastIndexOf("/"); if(v!=-1) UrlPath = UrlFile.substring(0,v); System.out.println("分析文件:"+myurl); int uclength=200000; int ucError=0; try{ uc = url.openConnection(); uc.setUseCaches(false); uc.connect(); } catch(IOException io) { ucError=1; System.out.println("打不开待分析网页:"+myu rl); } if(ucError!=1){ uclength = uc.getContentLength(); if (uclength<200000) { try{ read = new InputStreamReader(url.openStream()); } catch(IOException io) {System.out.println("流打开错误:"+myurl);} } else System.out.println("文件太大,不分析"); } if(read!=null){ reader=new BufferedReader(read); if(reader!=null){ st = new StreamTokenizer(reader); st.resetSyntax(); // 重置语法表 st.wordChars(0,255); // 令牌范围为全部字符 st.ordinaryChar('<'); // HTML标记两边的分割符 st.ordinaryChar('>'); } } } catch(MalformedURLException e){ System.out.println("Malformed URL String!");} } void cleanup() { try { read.close(); } catch(IOException e) { System.out.println("流关闭错误"); } } void countWords() { try { while(st.nextToken()!=StreamTokenizer.TT_EOF) { String s0=""; String s_NoCase=""; switch(st.ttype) { case '<': //入标记字段 outsideTag=false; continue; //countWords(); case '>': //出标记字段 outsideTag=true; continue; //countWords(); case StreamTokenizer.TT_EOL: s0 = new String("EOL"); break; case StreamTokenizer.TT_WORD: if(!outsideTag) s0 = st.sval; /*已经是字符 串*/ break; default: s0 = "";// s0 = String.valueOf((char)st.ttype);/*单一字符*/ } if(outsideTag) continue;//出了标记区域(<a >) String s = ""; s_NoCase = s0.trim(); s0=s_NoCase.toUpperCase(); if(s0.startsWith("A ")||s0.startsWith("AREA ")||s0.startsWith("FRAME ")||s0.s tartsWith("IFRAME ")){ //以这些开始的都是超级链接 int HREF_POS = -1; if(s0.startsWith("FRAME ")||s0.startsWith("IFRAME ")) { HREF_POS = s0.indexOf("SRC="); s0 = s0.substring(HREF_POS+4).trim(); s_NoCase=s_NoCase.substring(HREF_POS+4).trim(); } else { HREF_POS=s0.indexOf("HREF="); s0=s0.substring(HREF_POS+5).trim(); s_NoCase=s_NoCase.substring(HREF_POS+5).trim(); } if(HREF_POS!=-1) { if(s0.startsWith("\"")) {s0=s0.substring(1);s_NoCase=s_NoCase.substring(1);} int QUOTE=s0.indexOf("\""); if(QUOTE!=-1) {s0=s0.substring(0,QUOTE).trim();s_NoCase=s_NoCase.substring(0,QUOTE).trim ();} int SPACE=s0.indexOf(" "); if(SPACE!=-1) {s0=s0.substring(0,SPACE).trim();s_NoCase=s_NoCase.substring(0,SPACE).trim ();} if(s0.endsWith("\"")) {s0=s0.substring(0,s0.length()-1);s_NoCase=s_NoCase.substring(0,s_NoCase.l ength()-1);} if(s0.indexOf("'")!=-1||s0.indexOf("JAVASCRIPT:")!=-1||s0.indexOf("..")!=-1 ) {s0="";s_NoCase="";} //有这些符号,认为非合法链接;两点表示上一目录,而我 只想向下级查找 if ( !s0.startsWith("FTP://") &&//以下后缀或前缀通常非网页格式 !s0.startsWith("FTP://") && !s0.startsWith("MAILTO:") && !s0.endsWith(".SWF") && !s0.startsWith("../")) //因../表示上一目录,通常只需考虑本级和下N级目录 s=s0; if (!s.startsWith("HTTP://")&&!s.equals("")) {s=UrlHost+UrlPath+"/"+s;s_No Case=UrlHost+UrlPath+"/"+s_NoCase;} else if(s.startsWith("/")) {s=UrlHost+s;s_NoCase=UrlHost+s_NoCase;} if(s.startsWith("HTTP://")) {s=s.substring(7);s_NoCase=s_NoCase.substring( 7);} int JinHao=s.indexOf("#"); //如果含有"#"号,表示有效的链接是此前的部分 if(JinHao!=-1) {s=s.substring(0,JinHao).trim();s_NoCase=s_NoCase.substring( 0,JinHao).trim();} int H=-1; //以下将/./转换为/ for(int m=0;m<4;m++){ H=s.indexOf("/./"); if(H!=-1) {s=s.substring(0,H)+s.substring(H+2);s_NoCase=s_NoCase.substring (0,H)+s_NoCase.substring(H+2);} } int TwoXG=-1; //以下将//转换为/ for(int m=0;m<5;m++){ TwoXG=s.indexOf("//"); if(TwoXG!=-1) {s=s.substring(0,TwoXG)+s.substring(TwoXG+1);s_NoCase=s_NoCa se.substring(0,TwoXG)+s_NoCase.substring(TwoXG+1);} } int OneXG=s.indexOf("/"); if(OneXG==-1) {s=s+"/";s_NoCase+="/";} //将xx.xx.xx.xxx转换为xx.xx.xx.xxx/的 标准形式 if (!s.startsWith("HTTP://")) {s="HTTP://"+s;s_NoCase="HTTP://"+s_NoCase;} } } if(counts.containsKey(s_NoCase)) ((Counter)counts.get(s_NoCase)).increment(); else counts.put(s_NoCase,new Counter()); } } catch(IOException e) { System.out.println("st.nextToken() unsuccessful"); } } Collection values() { return counts.values(); } Set keySet() { return counts.keySet(); } Counter getCounter(String s) { return (Counter)counts.get(s); } public static void main(String[] argv) throws FileNotFoundException { try{ Class.forName("org.gjt.mm.mysql.Driver").newInstance(); } catch (Exception E) { System.out.println("加载Jdbc驱动程序失败"); E.printStackTrace(); } try{ Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost/Spider?user=root&password=mypassword"); Statement stmt = conn.createStatement(); String myurl; for(int i=1;i<=6;i++){ String query = "SELECT Url FROM link WHERE IsSearchLink=0 and Class="+(i-1)+" ORDER BY Url"; ResultSet rs = stmt.executeQuery(query); while (rs.next()) { myurl = rs.getString("Url"); String StartOnly = null; if(argv.length>0) StartOnly=argv[0]; LinkToDB wc = new LinkToDB(myurl,StartOnly); if(wc.reader!=null){ stmt.executeUpdate("UPDATE Link SET IsSearchLink=1 WHERE Class="+(i-1)+" a nd Url='"+myurl+"'"); wc.countWords(); Iterator keys = wc.keySet().iterator(); while(keys.hasNext()) { String key = (String)keys.next(); System.out.println("分析找到链接:"+key + ": "+ wc.getCounter(key).read()); int ErrorDB=0; if(StartWith==null||(StartWith!=null&&key.startsWith(StartWith))){ try{//-------------------------- 找到的链接插入数据库link ----------------- -- stmt.executeUpdate("INSERT INTO Link(Id,Url,Class) VALUES(0,'"+key+"',"+ i+")"); } catch(SQLException ex){ ErrorDB=1; System.out.println("插入数据错 SQLException: " + ex.getMessage()) ; } if(ErrorDB!=1){ //链接不重复就下载网页到WebPageLocal System.out.println("下载网页:"+key); int length; // 读的字符数 int filelength=200000; InputStreamReader read=null; URL rurl=null; URLConnection urlc=null; String Content=""; try{ rurl = new URL(key); } catch(MalformedURLException mu) { System.out.println("打开下载网页出错:"+mu.getMessage()); } if(rurl!=null){ int ucError=0; try{ urlc = rurl.openConnection(); urlc.connect();} catch(IOException io) { ucError=1; System.out.println("下载网页打不开:"+ke y); } if(ucError==0){ try{ filelength=urlc.getContentLength(); if (filelength>=200000) System.out.println("网页太大,我不下载了。"+key); else read = new InputStreamReader(rurl.openStream()); } catch(IOException io) {System.out.println("下载网页打不开:"+key);} } // 读入 URL 并写入数据库 if(read!=null&&filelength<200000){ try{ while((length = read.read(buffer)) != -1) { String s = new String(buffer, 0, length); Content=Content+s; } } catch(IOException io) { Content=""; System.out.println("不能读入URL文件"); } try{ Statement stmt2 = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, Res ultSet.CONCUR_UPDATABLE); ResultSet uprs = stmt2.executeQuery("SELECT Id,Url,Content FROM WebPageLoca l WHERE 0");//WHERE 0很重要,否则会耗尽内存 uprs.moveToInsertRow(); uprs.updateInt("Id",0); uprs.updateString("Url",key); uprs.updateString("Content",Content); uprs.insertRow(); uprs.beforeFirst(); uprs.close(); stmt2.close(); } catch(SQLException ex){ System.out.println("插入数据错:" + ex.getMessage()); } }//if(read!=null&&filelength<200000) }// } } //------------------------------- 下载网页 ---------------------------------- }//while(keys.hasNext()) wc.cleanup(); }//if(wc.reader!=null) }//while rs.next rs.close(); //关闭记录结果 }//end for stmt.close(); //关闭语句 conn.close(); //关闭连接 }//try catch(SQLException ex){ System.out.println("SQL异常:" + ex.getMessage()); } }//main()函数结束 }//类 LinkToDB 结束 三、编译和运行此Java程序 d:\Spider\> set CLASSPATH=d:\j\mm.mysql.jdbc2; d:\Spider\> d:\j\bin\javac LinkToDB.java d:\Spider\> d:\j\bin\java LinkToDB 其中第一行命令是设置MySQL的JDBC驱动程序路径。 3 四、由于网页中含有大量的无用的格式信息,直接用它来搜索要浪费大量的时间,所以需要掉其中的HTML格式控制信息,并将太长的网页截短,然后将整理后的用于搜索的信息存到另一个数据表中。由于PHP4中有一个很方便的函数strip_tags可以去掉其中的HTML格式标记,所以我们用PHP来整理。 MakeFast.php的内容如下: <?php mysql_connect("localhost","root","mypassword"); $result = mysql_db_query("Spider","select Id,Url,Content from WebPageLocal whe re Id>$n1 and Id<$n2"); while($mt = mysql_fetch_array($result)){ $Title = ""; $Body = ""; $mt2 = strtoupper($mt[2]); $PosTitleL = strpos($mt2,"<TITLE>"); $PosTitleR = strpos($mt2,"</TITLE>"); $PosBody = strpos($mt2,"<BODY"); $PosHeadR = strpos($mt2,"</HEAD>"); if($PosTitleL&&$PosTitleR) $Title = substr($mt[2],$PosTitleL+7,$PosTitl eR-$PosTitleL-7); $Title = eregi_replace("'","’",$Title); if($PosBody) $Body = substr($mt[2],$PosBody); else if($PosHeadR) $Body = substr($mt[2],$PosHeadR+7); else if($PosTitleR) $Body = substr($mt[2],$PosTitleR+8); else if($PosTitleL) $Body = substr($mt[2],$PosTitleL); else $Body = $mt[2]; $BodyText = strip_tags($Body); $BodyNoSpace = eregi_replace(" ","",$BodyText); $BodyNoQuote = eregi_replace("'","",$BodyNoSpace); $Body512 = substr($BodyNoQuote,0,511)." "; $Id = $mt[0]; $Url = $mt[1]; $sql="Insert Into WebPageFindFast(Id,Url,Title,Content) VALUES($Id,'$Url','$Title','$Body512')"; mysql_db_query("Spider",$sql) or die($sql); echo $Id." "; } ?> 使用方式: 在浏览器中输入http://mywebsite/Spider/MakeFast.php?n1=1&n2=10000 4 五、以上是建立搜索引擎所用到的数据,下面编制用于用户搜索的网页和PHP脚本文件。首先是用于搜索的表单页面SearchForm.htm,其内容如下。 <html> <head> <title>红蜘蛛搜索引擎-V0.1</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <link rel="stylesheet" href="../All.css" type="text/css"> </head> <body bgcolor="#eeffee" text="#000000"> <table width="600" border="0" cellspacing="2" cellpadding="2" align="center" bgc olor="#99CC00"> <tr> <td> <div align="center"><font color="#FF0000"><b><span class="pt16">红蜘蛛搜索 引擎</span> <span class="pt12">V0.1</span></b></font></div> </td> </tr> </table> <form name="form1" method="post" action="Search.php"> <table width="600" border="1" cellspacing="1" cellpadding="1" align="center" b ordercolor="#99CC00"> <tr> <td> <div align="left"><span class="pt15"><font color="#FF0000"><b>关 键 字</ b>:</font></span> <input type="text" name="KeyWords" size="40" maxlength="40"> </div> </td> <td> <div align="left"><span class="pt15"><font color="#FF0000"><b>查找范围</ b>:</font></span> <select name="SearchIn"> <option value="Content" selected>网页正文</option> <option value="Title">网页标题</option> </select> </div> </td> </tr> <tr> <td colspan="2"><span class="pt15"><font color="#FF0000"><b>查找方式</b>: </font></span> <select name="Speed"> <option value="Fast" selected>快速查找</option> <option value="Slow">更深查找</option> </select> </td> </tr> <tr> <td colspan="2"> <div align="left"> <input type="submit" name="Submit" value="搜索"> </div> </td> </tr> </table> </form> <table width="600" border="0" cellspacing="2" cellpadding="2" align="center"> <tr> <td height="18"> <p class="pt12"><font color="#FF0000"><b>使用方法</b></font>:仅需在关键字 一栏输入查询内容并按回车键(Enter)即可。 </p> <blockquote> <p align="left" class="pt12">如果希望输入多个条件,只需要用空格分隔即可: </p> <p class="pt12">例如:要查询同时包含“西昌”和“卫星”的网页,只需输入[西 昌 卫星]。</p> <p class="pt12">又如:要查询只包含关键字“西昌”而不包含“卫星”的网页, 只需要输入[西昌 -卫星]。注意中间的空格不能少。</p> </blockquote> <p class="pt12"><font color="#FF0000"><b>查找范围</b></font>:你可以选择从 “网页标题”中查找或者从“网页正文”中查找。</p> <p class="pt12"><font color="#FF0000"><b>查找方式</b></font>:“快速查找” 速度快但找到的网页数可能较少,因为:</p> <blockquote> <p class="pt12">“快速查找”只搜索网页正文的前512个字符。</p> <p class="pt12">“更深查找”搜索网页正文的前2048个字符。</p> <div align="right"><a href="mailto:zdyhlp@263.net"><font color="#FF0000" class="pt13"><b>欢迎 提出宝贵意见</b></font></a></div> </blockquote> </td> </tr> </table> </body> </html> search.php根据用户输入的条件,完成搜索,显示找到的网页的链接地址、标题和提要信息 。内容如下: <TITLE>红蜘蛛正在搜索关键词为[<?php echo $KeyWords?>]的网页</TITLE> <link rel="stylesheet" href="../All.css" type="text/css"> <body bgcolor="#eeffee"> <table width="96%" border="0" cellspacing="2" cellpadding="2" align="center" bgc olor="#99CC00"> <tr> <td> <div align="center"><font color="#FF0000"><b><span class="pt16">红蜘蛛搜索 引擎</span> <span class="pt12">V0.1</span></b></font></div> </td> </tr> </table> <form name="form1" method="post" action="Search.php"> <table width="96%" border="1" cellspacing="1" cellpadding="1" align="center" b ordercolor="#99CC00"> <tr> <td valign="top"> <font color="#FF0000"><b><span class="pt13">关键字</span ></b><span class="pt13">:</span></font> <input type="text" name="KeyWords" value="<?php echo $KeyWords?>" size=" 30" maxlength="30"> <input type="submit" name="Submit" value="重新搜索"> </td> <td valign="top"><font color="#FF0000"><b><span class="pt13">查找范围</spa n></b><span class="pt13">:</span></font> <select name="SearchIn"> <option value="Content" <?php if ($SearchIn=="Content") echo "selected ";?>>网页正文</option> <option value="Title" <?php if ($SearchIn=="Title") echo "selected ";?>>网页标题</option> </select> </td> <td valign="top"> <div align="left"><font color="#FF0000"><b><span class="pt13">查找方式</ span></b><span class="pt13">:</span></font> <select name="Speed"> <option value="Fast" <?php if ($Speed=="Fast") echo "selected";?>>快 速查找</option> <option value="Slow" <?php if ($Speed=="Slow") echo "selected";?>>更 深查找</option> </select> </div> </td> </tr> </table> </form> <?php if($SearchIn=="Title") $SQL="SELECT Id,Url,Title,Content FROM WebPageFindFast WHERE "; else $SQL="SELECT Id,Url,Title,Content FROM WebPageFind$Speed WHERE "; $KeyWords=str_replace(" ", " ", $KeyWords); if($KeyWords=="") {echo "关键字不能为空"; exit();} $tok = strtok($KeyWords," "); $i=0; $j=0; while($tok) { $i++; $tok = strtok(" "); } $key = strtok($KeyWords," "); while($key) { $j++; if(substr($key,0,1)!="-") { $SQL=$SQL.$SearchIn." LIKE '%".$key."%' "; $Words[]=$key; } else { $SQL=$SQL.$SearchIn." NOT LIKE '%".substr($key,1)."%' "; } if($j<$i) $SQL.=" AND "; $key = strtok(" "); } if($CurPos!="") $SQL.=" AND Id>=$CurPos "; $SQL.=" LIMIT 100"; //echo "\$SQL=".$SQL."<br>"; mysql_connect("localhost","root","mypassword"); $result=mysql_db_query("Spider",$SQL); $RowCount=mysql_num_rows($result); $FindCount=0; ?> <table border=0 align=center width="96%"> <tr> <th nowrap width="41%"> <div align="left" class="pt12">共找到关键字为 <font color=red> <?php echo $KeyWords?> </font> 的网页共 <font color=red> <?php echo $RowCount;?> </font> 个</div> </th> <td nowrap> </td> </tr> <tr bgcolor="#FF0000"> <th nowrap colspan="2" height="3"></th> </tr> <?php while($row= mysql_fetch_array($result)){ $Pos=$row[0]; $FindCount++; if($FindCount>20) break;?> <tr> <td nowrap colspan="2"> <?php echo $FindCount;?> <a href="<?php echo $row[1]?>" target=_black> <?php if($row[2]!="") echo $row[2]; else echo substr($row[3],0,64); ?> </a></td> </tr> <tr> <td colspan="2" ><span class="pt13">摘要:</span> <?php if($SearchIn=="Title") { $ZhaiYao=substr($row[3],0,1024); } else{ if($Speed=="Fast") $ZhaiYao=$row[3]; else{ $RowLen=strlen($row[3]); if ($RowLen<1024) { $ZhaiYao=$row[3]; } else { $CutPos=0; $PosWord1=strpos($row[3],$Words[0]); if($PosWord1-512<0) $ZhaiYao=substr($row[3],0,1024); else { for($i=24;$i<500;$i++){ //避免将中文字符从半个字处截断,选择从英文处截断 if(ord(substr($row[3],$PosWord1-$i,1))<128) {$CutPos=$i;break;} } $ZhaiYao=substr($row[3],$PosWord1-$CutPos,1024); } } } for($i=0;$i<count($Words);$i++){ $ZhaiYao=str_replace($Words[$i],"<font color=red>".$Words[$i]."</font>", $ZhaiY ao); } } echo $ZhaiYao; ?> </td> </tr> <tr> <td colspan="2" align="right"><a href="One.php?num=<?php echo $row[0]?>" tar get=_black> <font color="#0033FF" class="pt12">本地镜像</font></a></td> </tr> <tr bgcolor="#999933"> <td nowrap colspan="2" height="1"></td> </tr> <?php } ?> <?php if($RowCount>20){ ?> <tr> <td align="right" colspan="2" height="10"> <form name="form2" method="post" action="Search.php"> <input type="hidden" name="KeyWords" value="<?php echo $KeyWords;?>"> <input type="hidden" name="SearchIn" value="<?php echo $SearchIn;?>"> <input type="hidden" name="Speed" value="<?php echo $Speed;?>"> <input type="hidden" name="CurPos" value="<?php echo $Pos;?>"> <input type="submit" name="Submit" value="下20个网页"> </form> </td> </tr> <?php } ?> </table> One.php用于从本地镜像中显示一个找到的网页。由于网页的原始信息已经在WebPageLocal中存储,所以 只需简单的读出,发给用户。 <?php mysql_connect("localhost","root","mypassword"); $sql="select Url,Content from WebPageLocal where "; if($num!="") $sql=$sql."Id=$num"; else exit(); $result=mysql_db_query("Spider",$sql); $mt=mysql_fetch_row($result); echo $mt[1]; ?> Eclipse+JBoss+MySQL开发环境设置 J2EE是很好的。作为开发环境,如果采用经典配置:JBuilder+Weblogic+Oracle,自是得心应手,但价格是惊人的。此配置主要是针对大型或超大型应用,硬件要求也很高,针对国内以中小型应用为主的现况,不作推荐。 虽然国内开发者早已习惯了D版,但笔者以为还是防患于未然,应尽早加入OpenSource行列,促进国内软件业的发展。 本文所推荐的Eclipse、JBoss、MySQL均是名气很高的开源软件,并且非常实用。 1、JDK:到http://java.sun.com下载,推荐使用J2SDK1.4.X 2、JBoss:到http://www.jboss.org下载,笔者使用jboss-3.0.4_tomcat-4.0.6 3、MySQL:到http://www.mysql.com下载,笔者使用mysql-4.0.13,另须下载MySQL Control Center(图形化管理工具),到http://sourceforge.net/projects/mmmysql/下载MySQL的JDBC驱动程序,如mm.mysql-2.0.14-you-must-unjar-me.jar 4、Eclipse:到http://www.eclipse.org下载,最新版本为3.0M8,如果是新手推荐下载2.1.2和语言包(2.1.2_Translations)。到http://www.objectlearn.com/下载lomboz(此插件开发J2EE必需),需要注意的是lomboz的版本必须与eclipse版本一致,否则不正常。 环境设置(以win2000下D盘作根目录为例): 1、JDK的安装配置在此不再说明。 2、将JBoss解压到D:\,将MySQL的JDBC驱程包中的mm.mysql-2.0.14-bin.jar解压到D:\jboss-3.0.4_tomcat-4.0.6\server\default\lib中,再将D:\jboss-3.0.4_tomcat-4.0.6\docs\examples\jca目录下的mysql-service.xml拷贝到D:\jboss-3.0.4_tomcat-4.0.6\server\default\deploy目录下,找到相应段落并作如下修改: <attribute name="JndiName">MySqlDS</attribute> <attribute name="ManagedConnectionFactoryProperties"> <properties> <config-property name="ConnectionURL" type="java.lang.String">jdbc:mysql://localhost:3306/test</config-property> <config-property name="DriverClass" type="java.lang.String">org.gjt.mm.mysql.Driver</config-property> <!--set these only if you want only default logins, not through JAAS --> <config-property name="UserName" type="java.lang.String">root</config-property> <config-property name="Password" type="java.lang.String"></config-property> </properties> </attribute> 3、安装MySQL和MySQL Control Center,到mysql\bin目录中启动mysqld-nt.exe,即开启mysql服务。使用MySQL Control Center很方便地进行管理(类似SQL Server)。 4、将Eclipse(以3.0M8为例)解压到D:\,再将lomboz包中plugins目录中的内容解压到D:\Eclipse\plugins中,启动eclipse。(1)window--preferences--lomboz,设置JDK Tools.jar,Server Definitions--Server types:JBoss 3.0--Application Server Directory:D:/jboss-3.0.4_tomcat-4.0.6;Classpath Variable:D:/jboss-3.0.4_tomcat-4.0.6(2)window--Customize Perspective--Shortcuts--New--Java,勾选lomboz J2EE Wizards。 MySQL数据库SQL语法参考一、资料定义 ddl(data definition language) 资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。 1、建表格: create table table_name( column1 datatype [not null] [not null primary key], column2 datatype [not null], ...); 说明: datatype --是资料的格式,详见表。 nut null --可不可以允许资料有空的(尚未有资料填入)。 primary key --是本表的主键。 2、更改表格 alter table table_name add column column_name datatype 说明:增加一个栏位(没有删除某个栏位的语法。 alter table table_name add primary key (column_name) 说明:更改表得的定义把某个栏位设为主键。 alter table table_name drop primary key (column_name) 说明:把主键的定义删除。 3、建立索引 create index index_name on table_name (column_name) 说明:对某个表格的栏位建立索引以增加查询时的速度。 4、删除 drop table_name drop index_name 二、资料操作 dml (data manipulation language) 资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法: 1、增加资料: insert into table_name (column1,column2,...) values ( value1,value2, ...) 说明: 1.若没有指定column 系统则会按表格内的栏位顺序填入资料。 2.栏位的资料形态和所填入的资料必须吻合。 3.table_name 也可以是景观 view_name。 insert into table_name (column1,column2,...) select columnx,columny,... from another_table 说明:也可以经过一个子查询(subquery)把别的表格的资料填入。 2、查询资料: 基本查询 select column1,columns2,... from table_name 说明:把table_name 的特定栏位资料全部列出来 select * from table_name where column1 = xxx [and column2 > yyy] [or column3 <> zzz] 说明: 1.'*'表示全部的栏位都列出来。 2.where 之後是接条件式,把符合条件的资料列出来。 select column1,column2 from table_name order by column2 [desc] 说明:order by 是指定以某个栏位做排序,[desc]是指从大到小排列,若没有指明,则是从小到大 排列 组合查询 组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的表格才能够得到结果的。 select * from table1,table2 where table1.colum1=table2.column1 说明: 1.查询两个表格中其中 column1 值相同的资料。 2.当然两个表格相互比较的栏位,其资料形态必须相同。 3.一个复杂的查询其动用到的表格可能会很多个。 整合性的查询: select count (*) from table_name where column_name = xxx 说明: 查询符合条件的资料共有几笔。 select sum(column1) from table_name 说明: 1.计算出总和,所选的栏位必须是可数的数字形态。 2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的整合性查询。 select column1,avg(column2) from table_name group by column1 having avg(column2) > xxx 说明: 1.group by: 以column1 为一组计算 column2 的平均值必须和 avg、sum等整合性查询的关键字一起使用。 2.having : 必须和 group by 一起使用作为整合性的限制。 复合性的查询 select * from table_name1 where exists ( select * from table_name2 where conditions ) 说明: 1.where 的 conditions 可以是另外一个的 query。 2.exists 在此是指存在与否。 select * from table_name1 where column1 in ( select column1 from table_name2 where conditions ) 说明: 1. in 後面接的是一个集合,表示column1 存在集合里面。 2. select 出来的资料形态必须符合 column1。 其他查询 select * from table_name1 where column1 like 'x%' 说明:like 必须和後面的'x%' 相呼应表示以 x为开头的字串。 select * from table_name1 where column1 in ('xxx','yyy',..) 说明:in 後面接的是一个集合,表示column1 存在集合里面。 select * from table_name1 where column1 between xx and yy 说明:between 表示 column1 的值介於 xx 和 yy 之间。 3、更改资料: update table_name set column1='xxx' where conditoins 说明: 1.更改某个栏位设定其值为'xxx'。 2.conditions 是所要符合的条件、若没有 where 则整个 table 的那个栏位都会全部被更改。 4、删除资料: delete from table_name where conditions 说明:删除符合条件的资料。 说明:关于where条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下: (1)如果是access数据库,则为:where mydate>#2000-01-01# (2)如果是oracle数据库,则为:where mydate>cast('2000-01-01' as date) 或:where mydate>to_date('2000-01-01','yyyy-mm-dd') 在delphi中写成: thedate='2000-01-01'; query1.sql.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)'); 如果比较日期时间型,则为: where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss'); |