MySQL的例子

PHP中最通用的数据库是MySQL,所以我想你会喜欢下面的程序代码,它连结到 localhost 的 MySQL 服务器,数据库名称是 mydab,并且执行一个 SQL 的 select 指令查询,查询结果会一列列地印出来。

$db = mysql_connect("localhost", "root", "password");

mysql_select_db("mydb",$db);

$result = mysql_query("SELECT * FROM employees",$db);

if ($result === false) die("failed");

while ($fields = mysql_fetch_row($result)) {

for ($i=0, $max=sizeof($fields); $i < $max; $i++) {

print $fields[$i].' ';

}

print "
n";

}

上列的程序代码用颜色标出分段,第一段是连结的部分,第二段是执行SQL指令,最后一段则是显示字段,while循环扫描结果的每一列,而for循环扫描到每列的字段。

接下来是以ADODB的程序代码得到同样的结果:

include("adodb.inc.php");

$db = NewADOConnection('mysql');

$db->Connect("localhost", "root", "password", "mydb");

$result = $db->Execute("SELECT * FROM employees");

if ($result === false) die("failed");

while (!$result->EOF) {

for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)

print $result->fields[$i].' ';

$result->MoveNext();

print "
n";

}

现在改成指向Oracle数据库,程序代码只要修改第二行成为 NewADOConnection('oracle'),让我们看一下完整的程序代码...

与数据库连结

include("adodb.inc.php");

$db = NewADOConnection('mysql');

$db->Connect("localhost", "root", "password", "mydb");

连结的程序代码比起原来MySQL的程序代码有老练一些,因为我们正是需要更老练些。在ADODB我们使用对象导向的方法来管理多样数据库的复杂性,我们用不同类(class)来控制不同数据库。假如你不熟悉对象导向程序设计,别担心!所有的复杂事情都隐藏在 NewADOConnection() 函数之后。

为了节省内存,我们只加载与你所连结数据库相关的PHP程序代码,我们通过调用NewADOConnection(databasedriver)来完成这件事,合法的数据库驱动程序包含 mysql,mssql,oracle,oci8,postgres,sybase,vfp,access,ibase 以及许多其它的驱动程序。

接着我们通过调用 NewADOConnection() 来从连结类别产生一个新的对象实体,最后我们使用 $db->Connect() 来连结数据库。

执行SQL指令

$result = $db->Execute("SELECT * FROM employees");

if ($result === false) die("failed");

直接传送SQL指令到服务器,当成功执行之后,Execute()将传回一个recordset对象,你可以如同上面所列来检查$result。

一个初学者容易混淆的议题是,在ADODB有两种类型的对象,连结对象以及recordset对象,我们何时用这些对象呢?

连结对象($db)是负责连结数据库,格式化你的SQL查询。而recordset对象($result)则是负责撷取结果并将响应数据规格化成文字或数组。

唯一我需要增加的事情是,ADODB提供许多有用的函数来让INSERT及UPDATE指令更容易些,这点我们在进阶的章节会提到。

撷取资料

while (!$result->EOF) {

for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)

print $result->fields[$i].' ';

$result->MoveNext();

print "
n";

}

前面取得数据的范例很像从档案读数据,在每一行我们首先检查是否到了档案的结尾(EOF),若还没到结尾,循环扫过每列中的字段,然后移到下一行(MoveNext)接着重复同样的事情。

$result->fields[]数组是由PHP数据库延伸系统所产生的,有些数据库延伸系统并不会以字段名称建立该数组的索引,要强迫以名称排序索引该数组,使用$ADODB_FETCH_MODE的通用变量。

$ADODB_FETCH_MODE = ADODB_FETCH_NUM;

$rs1 = $db->Execute('select * from table');

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

$rs2 = $db->Execute('select * from table');

print_r($rs1->fields); // shows array([0]=>'v0',[1] =>'v1')

print_r($rs2->fields); // shows array(['col1']=>'v0',['col2'] =>'v1')

如同你所见的上面例子,两个recordset储存并使用不同的取用模式,当recordset由Execute()产生后再设定$ADODB_FETCH_MODE。

ADOConnection

连结到数据库的对象,执行SQL指令并且有一组工具函数来标准格式化SQL指令,比如关联与日期格式等指令。

其它有用的函数

$recordset->Move($pos)卷动目前的数据列,ADODB支持整个数据库往前卷动,有一些数据库并不支持往后的卷动,这倒不会是个问题,因为你能够用暂存纪录到快取来仿真往后卷动。

$recordset->RecordCount()传回SQL指令存取到的纪录笔数,有些数据库会因为不支持而传回-1。

$recordset->GetArray()以数组的方式传回结果。

rs2html($recordset)函数将传进的recordset转为HTML的表格格式。下例中以粗体字显示相关用法:

include('adodb.inc.php');

include('tohtml.inc.php'); /* includes the rs2html function */

$conn = &ADONewConnection('mysql');

$conn->PConnect('localhost','userid','password','database');

$rs = $conn->Execute('select * from table');

rs2html($rs); /* recordset to html table */

进阶题材

新增及更新

假设你要新增下列数据到数据库中。

ID = 3

TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */

Note= sugar why don't we call it off

当你改用别的数据库,可能就没办法新增数据。

第一个问题是,每一个数据库各自有不同的内定日期格式,MySQL使用 YYYY-MM-DD 格式,而其它数据库则有不同的内定格式,ADODB提供DBDate()函数来转换不同数据库之间的日期内定格式。

次一个问题是单引号(don't)的表示法,在MySQL可以直接使用单引号(don't),但在其它数据库如Sybase、Access、 Microsoft SQL Server,则用两个单引号表示(don''t),qstr()函数可以解决此问题。

我们如何使用这些函数?就像这样:

$sql = "INSERT INTO table (id, thedate,note) values ("

. $ID . ','

. $db->DBDate($TheDate) .','

. $db->qstr($Note).")";

$db->Execute($sql);

ADODB还有$connection->Affected_Rows()函数,传回受最后update或delete指令影响的数据列数,及$recordset->Insert_ID()函数,传回最后因insert指令而自动产生的数据列编号,预先提醒大家,没有任何数据库有提供这两个函数。

MetaTypes

你可以得到关于字段的更多信息,透过recordset的方法FetchField($fieldoffset)传回对象的3个属性:name,type,max_length。

举例说明:

$recordset = $conn->Execute("select adate from table");

$f0 = $recordset->FetchField(0);

结果$f0->name的内容是'adata',$f0->type将是'date',假如max_length不知道,其内容将会是-1。

处理不同数据库的一个问题是,每一个数据库对于相同的数据型态会有不同的称呼,比如timestamp型态在某数据库中称为datetime,而另一个数据库则称为time,所以ADODB提供MetaType($type,$max_length)函数来标准化下列的数据型态:

C: character and varchar types

X: text or long character (eg. more than 255 bytes wide).

B: blob or binary image

D: date

T: timestamp

L: logical (boolean)

I: integer

N: numeric (float, double, money)

在前面的例子中,

$recordset = $conn->Execute("select adate from table");

$f0 = $recordset->FetchField(0);

$type = $recordset->MetaType($f0->type, $f0->max_length);

print $type; /* should print 'D' */

Select指令的Limit及Top支持

ADODB有个$connection->SelectLimit($sql,$nrows,$offset)函数让你撷取recordset的部分集合,这是采用Microsoft产品中的SELECT TOP用法,及PostgreSQL与MySQL中的SELECT...LIMIT用法的优点,即使原来的数据库并没有提供此用法,本函数也仿真提供该使用方式。

快取支援

ADODB允许你在你的档案系统中暂存recordset的数据,并且在$connection->CacheExecute($secs2cache,$sql)及 $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset)等设定的时间间隔到达之后,才真正去做数据库的查询以节省时间。

PHP4 Session支持

ADODB也支持PHP4 session handler,你可以存放你的session变量在数据库中,相关功能请参考 http://php.weblogs.com/adodb-sessions

鼓励商业使用

假如你计划写商用的PHP应用软件来销售,你也可以使用ADODB,我们依据GPL来出版ADODB,也就是说你可以合法地在商用应用软件中引用,并保有你程序代码的所有权。强烈地鼓励ADODB的商业应用,我们自己内部也正以这个理由如此使用中。

vb adodb mysql_PHP_ADODB类使用,MySQL的例子PHP中最通用的数据 - phpStudy相关推荐

  1. Mysql 查询一天中,每个小时数据的数量

    SELECT HOUR(e.time) as Hour,count(*) as Count FROM error_log e WHERE e.date = '2017-09-02' GROUP BY ...

  2. mysql concat例子_MYSQL中CONCAT详解

    concat()函数 1. 功能: 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 2. 语法 concat(str1, str2,...) 3. 例子 案例一: ...

  3. mysql删除重复sql_mysql中删除完全重复数据的准确SQL语句

    删除数据库中重复的记录,只保留一条 DELETE FROM tb_gps_records WHERE id NOT IN (SELECT bid FROM (SELECT min(id) as bid ...

  4. mysql支持关系模型中哪些完整性约束_数据完整性约束(1)——实体完整性、参照完整性...

    一.数据完整性的分类 在关系模型中,提供了实体完整性,参照完整性,用户定义完整性. 二.实体完整性 2.1什么是实体? 实体是一个数据对象,指的是客观存在并可以相互区分的事物,比如学生,老师等.一个实 ...

  5. mysql 快速初始化_MySQL中的批量初始化数据的对比测试(r12笔记第71天)

    一直以来对于MySQL的存储过程性能还是颇有微词的,说实话够慢的.有时候想做一些对比测试,存储过程初始化几万条数据都得好一会儿,这功夫Oracle类似的测试早都做完了,今天就赶个晚班车,把这个没做完的 ...

  6. mysql索引优化longtext_mysql中longtext存在大量数据时,会导致查询很慢?

    一个表,1.5w条数据,字段: id,name,content,last_update_time id,自定义主键 name,varchar类型 content是longtext类型, last_up ...

  7. mysql快速复制数据库中所有表及数据至另一个库中

    第一步:新建一个新的数据库(db_copy) CREATE DATABASE `db_copy` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI; ...

  8. MySQL update正在执行中突然断电,数据是否更改成功?

    今天有个朋友突然问到我这个问题,当我们的update语句执行过程中,服务器突然断电了会发生什么?其实这个问题主要在于对mysql update生命周期的理解,以及了解mysql 的redolog和bi ...

  9. mysql longtext 查询_mysql中longtext存在大量数据时,会导致查询很慢?

    一个表,1.5w条数据,字段: id,name,content,last_update_time id,自定义主键 name,varchar类型 content是longtext类型, last_up ...

  10. MySQL查询关联表中不存在的数据NOT EXISTS()

    工作中遇到这样的问题,用户表(t_users)中有属性部门id,所有的部门存在部门表(t_org)中. 由于之前的用户数据是执行sql导入的,导入时没有做校验,现在发现有些用户的所属部门id在t_or ...

最新文章

  1. AI:Algorithmia《2020 state of enterprise machine learning—2020年企业机器学习状况》翻译与解读
  2. (Redis设计与实现-6) 频道的订阅与退订
  3. java 线程交替输出,[java]java经典问题之线程交替打印数字
  4. jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词
  5. P、NP、NPC、NP-Hard等问题总结
  6. oracle数据库标志物,Oracle表的分类以及相关参数的详解
  7. 如何维护应用程序状态
  8. 搭建 S3C6.410 开发板的 测试环境
  9. Linux内核驱动目录功能说明
  10. Python爬虫滑块验证
  11. 腾讯云播放器隐藏音频播放的按钮
  12. 2021年3月21日 星期日 二月初九 晴
  13. 肌酸报告:17个肌酸使用常见问题解答
  14. 分享qq空间出现失败
  15. 批量处理 | 起点和终点交叉配对进行路线查询
  16. ospfdr选举规则_OSPF的DR选举
  17. 需要在计算机安装msxml版本,安装Office2010提示需要MSXML版本6.10.1129.0的解决方法...
  18. 迅为3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心方案
  19. 盆栽的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 天上掉馅饼?英国推出全球首个无人机派送披萨服务

热门文章

  1. 6大黑科技app合集,绝对让你大开眼界
  2. idea导出文件支持目录结构
  3. 单目标跟踪MOSSE详细算法步骤+理论说明
  4. R语言安装教程 | 图文介绍超详细
  5. PHP调试工具 - FirePHP安装与使用方法
  6. 2021-08-18我的第一篇博客——STM32单片机的开发环境Keil5(MDK)的安装与破解
  7. ncm转换mp3文件时遇到问题:未找到文件
  8. 给intellij IDEA设置背景颜色
  9. Java躲子弹课设,Robocode高手的诀窍 - 躲避子弹[Java编程]
  10. 网络图结构中节点度分布的散点图