原文请详见:http://www.ucai.cn/blogdetail/7034?mid=1&f=12
可以在线运行查看效果哦!
3.3、SQLite 数据库
SQLite 数据库也是一个文件数据库,但是不是文本数据库。它是一种自有的二进制格式。最早是由C写的一个库,并且很早也发布PHP的访问扩展,现在一般用的是sqlite3,PHP模块名也叫sqlite3。
Sqlite 有两个特点:
1、目前已经是非常流行的文件数据库,尤其是嵌入式数据库,在移动应用中也应用得十分普遍。
2、其访问的接口同 MySQL的非常地相似。
具体安装很简单,就是从官网下了代码, make 就可以了,不过代码可真不是一个小个。
3、SQLite3 已经是属于关系数据库大家庭的一员,所以它遵循ACID。对于SQL语句的支持也不错,网上也有人写了它和SQL互相导入互出的代码。
也有同MySQL 类似的管理工具,
http://sourceforge.net/projects/sqlitemanager/
大家可以搜索SQLite Manager 就能搜索到一堆。
至于具体的操作,不在这里展开,我们五月份的公开课,专门有一讲讲这个。将会比较详细地讲解SQLite 以及应用。
3.4、MySQL 数据库
MySQL 从使用上讲,大家都比较熟悉了。但是值得注意的是,mysql_query 这样的方法在php 5.5 时过时。
我们这里做三个简单的例子。分别用即将废弃的 mysql 和 mysqli 以 PDO 来操作数据库。
第一个例子,是过程式地操作MySQL。用的是很普遍的数据库操作函数,也就是php mysql 扩展的函数。这些函数将在 5.5版中过时,所以我们要抓紧改变了。
<?php /** * 优才网公开课示例代码 * * mysql 过程式操作MySQL的例子 * * @author 伍星 * @see http://www.ucai.cn */ $conn = mysql_connect("127.0.0.1", "samples", "ftly5qb"); if(!mysql_select_db("samples", $conn)) { echo mysql_error(); exit; }
// 这应该由用户提供,下面是一个示例
$name = 'wxstars';
// 构造查询
// 这是执行 SQL 最好的方式
// 更多例子参见 mysql_real_escape_string()
$query = sprintf("SELECT * FROM users WHERE name='%s'", mysql_real_escape_string($name));
// 执行查询
$result = mysql_query($query);
// 检查结果
// 下面显示了实际发送给 MySQL 的查询,以及出现的错误。这对调试很有帮助。
if (!$result) { $message = 'Invalid query: ' . mysql_error() . "\n"; $message .= 'Whole query: ' . $query; die($message); }
// 结果的使用
// 尝试 print $result 并不会取出结果资源中的信息
// 所以必须至少使用其中一个 mysql 结果函数
// 参见 mysql_result(), mysql_fetch_array(), mysql_fetch_row() 等。
while ($row = mysql_fetch_assoc($result)) { echo $row['id']."\n"; echo $row['name']."\n"; echo $row['email']."\n"; }
// 释放关联结果集的资源
// 在脚本结束的时候会自动进行
mysql_free_result($result); mysql_close($conn); ?>
第二个例子是过程式和面向对象的myqli操作数据库的例子。
<?php /** * 优才网公开课示例代码 * * mysqli 过程式操作MySQL的例子 * * @author 伍星 * @see http://www.ucai.cn */ $mysqli = mysqli_connect("127.0.0.1", "samples", "ftly5qb", "samples", 3306); /* check connection */ if (!$mysqli) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }
// 这应该由用户提供,下面是一个示例
$name = 'wxstars';
// 构造查询
// 这是执行 SQL 最好的方式
// 更多例子参见 mysql_real_escape_string()
$query = sprintf("SELECT * FROM users WHERE name='%s'", mysqli_escape_string($mysqli, $name)); echo $query; /* Select queries return a resultset */ if ($result = mysqli_query($mysqli, $query)) { printf("Select returned %d rows.\n", mysqli_num_rows($result)); $row = mysqli_fetch_assoc($result); print_r($row); /* free result set */ mysqli_free_result($result); } mysqli_close($mysqli); ?> <?php /** * 优才网公开课示例代码 * * mysqli 面向对象操作MySQL的例子 * * @author 伍星 * @see http://www.ucai.cn */ $mysqli = new mysqli("127.0.0.1", "samples", "ftly5qb", "samples"); /* check connection */ if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); }
// 这应该由用户提供,下面是一个示例
$name = 'wxstars';
// 构造查询
// 这是执行 SQL 最好的方式
// 更多例子参见 mysql_real_escape_string()
$query = sprintf("SELECT * FROM users WHERE name='%s'", $mysqli->real_escape_string($name)); echo $query; /* Select queries return a resultset */ if ($result = $mysqli->query($query)) { printf("Select returned %d rows.\n", $result->num_rows); $row = $result->fetch_assoc(); print_r($row); /* free result set */ $result->close(); } $mysqli->close(); ?> <?php /** * 优才网公开课示例代码 * * PDO 操作MySQL的例子 * * @author 伍星 * @see http://www.ucai.cn */ /* * * mysql hostname ** */ $hostname = '127.0.0.1'; /* * * mysql username ** */ $username = 'samples'; /* * * mysql password ** */ $password = 'ftly5qb'; try { $dbh = new PDO("mysql:host=$hostname;dbname=samples", $username, $password); /* * * echo a message saying we have connected ** */ echo 'Connected to database'."\n"; /* * * The SQL SELECT statement ** */ $sql = "SELECT * FROM users"; foreach ($dbh->query($sql) as $row) { print $row['id'] . ' - ' . $row['name'] . ' - ' . $row['email'] . "\n"; } /* * * close the database connection ** */ $dbh = null; } catch (PDOException $e) { echo $e->getMessage(); } ?>
总结,我们上面使用了三个不同的php 模块,一个是php mysql,一个是mysqli,一个是 pdo_mysql 三个模块来分别干同样的事情。如果你单独学习这三个库,会觉得比较枯燥,当你学到一定程度,融会贯通时,特别是对比学习时发现,你学习了其中一个,学习其他的也就并不难了。无非就是如下几步:
1、建立连接,在建立 连接时需要提交用户名,密码,主机,库名,端口等数据。
2、检测连接是否建立成功。
3、组装查询,注意不同的模块,对查询组装时的过滤方法也是不同的。
4、执行查询,获得结果句柄,而不是直接的数据。
5、通过非常相近的函数,从结果句柄中取得数据。
6、把数据放到结果句柄里输出。
7、在离开程序时,需要释放结果集资源。
8、在最后,需要关系开启的数据库连接。
3.5、MySQL KVDB的一个插件
为什么要用这个插件,并演示这个插件,有几个目的。
一,让大家知道MySQL和KVDB,这些软件之间,并没有明显的界限,像KVDB的出现,只是它的处理能力更强,而MySQL由于很多的限制,导致了在简单的场景下,处理能力并不如KVDB强。并不是说不能做。
二、其实有人,将MySQL进行改造,已达到了甚至超过 KVDB的一个高度。就是这个插件所做的,据说做到了 75万QPS。并且是生产中可以使用的了,一些发行版均将这个模块包含了进去。
http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html
三、也让大家了解一下MySQL插件的安装。进一步了解MySQL的强大 。
https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL
unzip HandlerSocket-Plugin-for-MySQL.zip
进去目录
cd HandlerSocket-Plugin-for-MySQL-master/ sh autogen.sh ./configure
发现出错,要求连同mysql 的源码目录一起配置。
下载了一个5.5版的源码,配置
./configure --with-mysql-source=../MySQL/mysql-5.5.37/
发现出错。
checking mysql binary... yes: Using /usr/bin/mysql_config, version 5.1.73 configure: error: MySQL source version does not match MySQL binary version
只好查看了一下版本,
[root@localhost HandlerSocket-Plugin-for-MySQL-master]# mysqladmin --version mysqladmin Ver 8.42 Distrib 5.1.73, for redhat-linux-gnu on x86_64
发现是5.1.73 的版本
于是乎下了一个5.1.73 的源码。
成功配置,
./configure --with-mysql-source=../MySQL/mysql-5.1.73/
然后
make
make install
成功安装。下面再在mysql 中启用
mysql –uroot –p
执行 install plugin handlersocket soname 'handlersocket.so'; 安装插件。
插件成功安装。
再在
/etc/my.cnf 的 [mysqld] 版块下加入 loose_handlersocket_port = 9998 loose_handlersocket_port_wr = 9999 loose_handlersocket_threads = 4 loose_handlersocket_threads_wr = 1 loose_handlersocket_address = [你要监听的IP地址]
然后重启 mysqld
再show processlist
我们看到,已经成功运行,再netstat看一眼。
端口监听成功。
说明,此插件在MySQL的另一个发行版 Percona Server中已包含。
http://www.mysqlperformanceblog.com/2010/12/14/percona-server-now-both-sql-and-nosql/
我们来使用它的 PHP 客户端来测试一下。
下载:
安装模块。
新建测试代码。
新建表格
create database hstestdb; CREATE TABLE `hstesttbl` ( `k` int(11) NOT NULL AUTO_INCREMENT, `v` char(255) NOT NULL DEFAULT '', PRIMARY KEY (`k`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 <?php $host = '101.251.196.91'; $port = 9998; $port_wr = 9999; $dbname = 'hstestdb'; $table = 'hstesttbl'; //GET $hs = new HandlerSocket($host, $port); if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v'))) { echo $hs->getError(), PHP_EOL; echo "get Error!\n"; die(); } $retval = $hs->executeSingle(1, '=', array('k1'), 1, 0); var_dump($retval); $retval = $hs->executeMulti( array(array(1, '=', array('k1'), 1, 0), array(1, '=', array('k2'), 1, 0))); var_dump($retval); unset($hs); //UPDATE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(2, $dbname, $table, '', 'v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false) { echo $hs->getError(), PHP_EOL; die(); } unset($hs); //INSERT $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(3, $dbname, $table, '', 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeInsert(3, array('k2', 'v2')) === false) { echo $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k3', 'v3')) === false) { echo 'A', $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k4', 'v4')) === false) { echo 'B', $hs->getError(), PHP_EOL; } unset($hs); //DELETE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(4, $dbname, $table, '', ''))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeDelete(4, '=', array('k2')) === false) { echo $hs->getError(), PHP_EOL; die(); }
3.6、全文检索
全文检索是不一个不同于数据检索的领域。有几个特点:
A、精确的数据库查询,无论是在顺序,还是在数据结构上都是非常地确定的。
B、全文检索一般面向大数据量,所以查询结果,在顺序上和结果上,都不是需要达到 100%精确,当然也有一些技术指标来衡量向着最好的方向前进。
C、精确查询所查询的内容,一般是数字型的比较或者是前置匹配等。
D、全文检索所查的内容,往往是一段文字中的一个或者多个词。所以只查文本型的数据。
E、精确查询往往随着数据量的记录数到了一定程度,如果是针对文本的查询,整个速度会下降比较明显。
F、而全文检索一般,随着数据量的增长,下降不能那么明显。
全文检索在PHP中有三种实现方式,一是用MySQL 的MyISAM引擎的全文检索功能 。二是使用同MySQL结合紧密的 Sphinx。三是使用较为专业的全文检索引擎,Lucene。而用Slor来实现量询。
下载solr
wget -c http://mirrors.cnnic.cn/apache/lucene/solr/4.8.1/solr-4.8.1.zip
cd solr-4.8.1/example
java –jar start.jar
按教程建立好索引:
http://lucene.apache.org/solr/4_8_1/tutorial.html
http://101.251.196.91:8983/solr/collection1/select?q=%E6%9C%8D%E5%8A%A1
PHP模块下载:
http://pecl.php.net/package/solr
<?php /** * 优才网公开课示例代码 * * Solr 全文检索客户端测试 * * @author 伍星 * @see http://www.ucai.cn */ $options = array ( 'hostname' => 'localhost', // 'login' => 'username', // 'password' => 'password', 'port' => '8983', ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('服务器'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); $response = $query_response->getResponse(); print_r($response); ?>
四、课程总结
通过上面的这一节课,我们站在一个比较高的高度讨论了数据库的出现和应用场景 。其次,从实用和学术两方面,探讨了一些常用的术语和概念。第三,就是通过实例,分别讲解了不同情况下,对数据库的不同的使用情况。希望这一讲给大家指出一些基本的概念,能让大家对继续参与下面的课程有利。
相关推荐
《数据库及其应用》实验2.pdf 本实验报告的目的是掌握关系数据库的完整性基本概念,了解Access数据表视图的基本功能,并掌握在数据表视图中定制各种不同显示方法的操作。 一、实验目的及要求 1. 理解并掌握关系...
10. **分布式数据库和云数据库**:随着云计算的发展,分布式数据库和云数据库的概念及其在大数据环境中的应用也变得越来越重要。 "数据库系统概论课件2008"很可能包含了上述部分或全部内容,通过学习这些知识,可以...
在学习本章时,读者需要具备一定的基础知识,如了解规范化理论的原因、各范式的基本概念及其优点和缺点。同时,应理解关系数据库规范化设计的实质,即属性原子化、主键原子化和实体原子化,并能够评估数据库设计的...
第四版的教材,由知名数据库专家王珊编写,旨在提供最新的理论知识和实践经验,适用于电子信息工程学院的学生学习。本教程深入浅出地讲解了数据库设计、查询语言、数据模型以及数据库管理系统的关键概念。 1. 数据...
以上内容涵盖了《数据库原理与应用》课程的基础知识点,对于理解数据库的基本概念、模型、结构及其操作至关重要。通过对这些知识点的学习,可以帮助学生更好地掌握数据库技术的核心内容,为后续深入学习和实践打下...
【教师资格考试资料】《数据库及其建立过程》答辩题目及解析文档主要涵盖了教育领域中关于数据库理论及其在教学实践中的应用。以下是对这些题目及解析的详细阐述: 第一题涉及的是如何解决课堂小组讨论流于形式的...
实验主要围绕数据库的创建、分离、附加、备份与恢复以及删除等关键环节展开,旨在让学生掌握数据库系统的基本概念、特性和实用技术。 首先,实验目标包括理解和掌握数据库的本质,例如它的定义和特性。创建数据库是...
本教程适合初学者和有一定基础的学习者,通过深入浅出的讲解和实践案例,帮助读者快速掌握SQL Server 2000的基本操作和高级应用,为日后的数据库管理、开发和维护打下坚实基础。希望这个教程能对所有致力于学习...
它通常由数据库、数据库管理系统(及其开发工具)、应用系统和数据库管理员组成。数据库系统与数据库是两个不同的概念,前者是一个人机交互的系统,后者是系统的一个组成部分。在实际使用中,人们常将二者混同,但在...
数据库系统设计报告与实现是信息技术领域中的一个重要环节,它涵盖了数据的组织、存储、查询以及管理等多个方面。在信息管理系统中,数据库设计...在实际工作中,不断学习和实践,才能不断提升数据库设计和管理的能力。
#### 数据库技术的理论与实践 数据库技术的研究范围广泛,涵盖了数据库的结构、存储、设计、管理和使用等方面。它不仅依赖于文件系统的基础,还与数据结构、离散数学、编程语言以及软件工程等多门学科密切相关。...
《咖啡店信息管理数据库设计说明》是一份详细指导如何为咖啡店构建信息管理系统的文档,旨在帮助学生理解和实践数据库的设计与应用。这份设计手册由杭州电子科技大学信息工程学院的学生完成,作为《数据库课程设计》...
在选择模型的应用、实践和整合其他非时空数据模型时,需要从本质上加以区别,正确阐述模型间的本质区别。对当前时空数据模型已有的分类方法进行归纳和分析,肯定和完善了文献[2]的分类方法,此方法能更好解释众多...
### Abap基础学习文档101_用逻辑数据库访问数据库表 #### 概览 本文档旨在介绍如何在ABAP环境中使用逻辑数据库...通过实践练习,可以更深入地掌握这两种访问方法的特点及应用场景,从而提高在实际项目中的开发效率。
根据给定文件的信息,我们可以提炼出以下关于数据库课程的关键知识点及其相关体会: ### 数据库课程初体验 - **初印象**:初次接触数据库时可能会觉得教材厚重,学习难度较大。 - **实际体验**:实际上,只要能跟...
- 数据抽象:提取实体及其属性,忽略非本质特征。 - 局部视图设计:根据不同用户视角,设计特定的视图。 - **视图集成**: - 将各个局部视图整合为一个全局视图,解决视图之间的冲突。 #### 四、逻辑结构设计 ...
选题这一课题旨在让学生掌握数据库设计的基本理论与实践技能,包括需求分析、概念结构设计、逻辑结构设计以及物理结构设计等关键步骤。通过此次课程设计,学生能够深入理解数据库系统概论中的核心概念,并提升在实际...